Fitur “Remember Me” memungkinkan pengguna tetap login meski menutup browser — tanpa harus memasukkan ulang username dan password. Namun, jika diterapkan sembarangan (misalnya hanya menyimpan username & password di cookie), fitur ini bisa menjadi celah serius bagi peretas.
Pada artikel ini, kita akan belajar cara membuat fitur Remember Me yang aman di PHP, menggunakan:
-
Token acak (bukan password mentah)
-
Enkripsi & hashing token
-
Validasi cookie terhadap database
Masalah Remember Me yang Tidak Aman
Banyak tutorial PHP di luar sana menggunakan metode seperti ini:
<?php
setcookie("username", $username, time()+3600*24*7);
setcookie("password", $password, time()+3600*24*7);
?>
Ini sangat berbahaya!
Karena username dan password disimpan langsung di cookie tanpa enkripsi — mudah dicuri oleh siapa pun yang mengakses komputer pengguna.
Konsep Remember Me Aman
Untuk membuat Remember Me yang aman, gunakan pendekatan token-based authentication.
Prinsipnya seperti ini:
-
Saat pengguna mencentang “Remember Me”, sistem membuat token acak.
-
Token tersebut disimpan di:
-
Cookie browser (versi terenkripsi)
-
Database (versi di-hash)
-
-
Saat pengguna membuka situs lagi, token di cookie diverifikasi dengan yang di database.
-
Jika cocok, otomatis login kembali.
Struktur Tabel Database
Buat tabel remember_tokens:
CREATE TABLE remember_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
selector CHAR(12) NOT NULL,
hashed_token CHAR(64) NOT NULL,
expires DATETIME NOT NULL
);
Langkah 1: Membuat Token Remember Me Saat Login
Ketika pengguna login dan mencentang “Remember Me”, kita buat token acak:
<?php
session_start();
include 'config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
$remember = isset($_POST['remember']);
$stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
if ($remember) {
$selector = bin2hex(random_bytes(6));
$token = random_bytes(33);
$hashedToken = hash('sha256', $token);
$expires = date('Y-m-d H:i:s', time() + 86400 * 30); // 30 hari
// Simpan ke database
$stmt = $conn->prepare("INSERT INTO remember_tokens (user_id, selector, hashed_token, expires) VALUES (?, ?, ?, ?)");
$stmt->bind_param("isss", $user['id'], $selector, $hashedToken, $expires);
$stmt->execute();
// Simpan ke cookie (selector|token)
setcookie(
'rememberme',
$selector . ':' . bin2hex($token),
time() + 86400 * 30,
'/',
'',
true, // Secure (gunakan HTTPS)
true // HttpOnly (anti JS access)
);
}
header('Location: dashboard.php');
exit();
} else {
$error = "Username atau password salah!";
}
}
?>
Langkah 2: Auto Login Menggunakan Cookie Remember Me
Di setiap halaman (misalnya init.php), periksa apakah session kosong tetapi cookie ada.
<?php
session_start();
include 'config.php';
if (!isset($_SESSION['user_id']) && isset($_COOKIE['rememberme'])) {
list($selector, $token) = explode(':', $_COOKIE['rememberme']);
$stmt = $conn->prepare("SELECT * FROM remember_tokens WHERE selector = ? AND expires > NOW()");
$stmt->bind_param("s", $selector);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row && hash_equals($row['hashed_token'], hash('sha256', hex2bin($token)))) {
// Token valid → buat session baru
$_SESSION['user_id'] = $row['user_id'];
// Regenerasi token untuk keamanan (hindari reuse)
$newToken = random_bytes(33);
$hashedNewToken = hash('sha256', $newToken);
$stmt = $conn->prepare("UPDATE remember_tokens SET hashed_token=?, expires=DATE_ADD(NOW(), INTERVAL 30 DAY) WHERE id=?");
$stmt->bind_param("si", $hashedNewToken, $row['id']);
$stmt->execute();
// Perbarui cookie
setcookie(
'rememberme',
$selector . ':' . bin2hex($newToken),
time() + 86400 * 30,
'/',
'',
true,
true
);
} else {
// Token tidak valid, hapus cookie
setcookie('rememberme', '', time() - 3600, '/');
}
}
?>
Langkah 3: Hapus Token Saat Logout
Jangan lupa, saat pengguna logout, hapus session dan tokennya agar tidak bisa digunakan ulang.
<?php
session_start();
include 'config.php';
if (isset($_SESSION['user_id'])) {
$stmt = $conn->prepare("DELETE FROM remember_tokens WHERE user_id = ?");
$stmt->bind_param("i", $_SESSION['user_id']);
$stmt->execute();
}
session_unset();
session_destroy();
setcookie('rememberme', '', time() - 3600, '/');
header('Location: login.php?logout=success');
exit();
?>
Langkah 4: Keamanan Tambahan yang Disarankan
✅ Gunakan HTTPS agar cookie terenkripsi saat dikirim.
✅ Aktifkan HttpOnly dan Secure flag pada cookie.
✅ Gunakan token unik per device, agar jika satu perangkat diretas, yang lain tetap aman.
✅ Hapus token lama secara berkala dari database.
✅ Jangan simpan password dalam bentuk teks di mana pun.
Tampilan Form Login (Contoh Sederhana)
<form method="POST" action="login.php">
<div>
<label>Username</label>
<input type="text" name="username" required>
</div>
<div>
<label>Password</label>
<input type="password" name="password" required>
</div>
<div>
<label><input type="checkbox" name="remember"> Remember Me</label>
</div>
<button type="submit">Login</button>
</form>
Kesimpulan
Fitur Remember Me bisa sangat membantu pengalaman pengguna, asalkan dibangun dengan aman.
Jangan pernah menyimpan password di cookie!
Gunakan kombinasi selector + token yang di-hash, enkripsi cookie, dan pemeriksaan database untuk memastikan hanya pengguna sah yang bisa tetap login.
Dengan pendekatan ini, sistem login Anda akan:
✅ Aman dari session hijacking
✅ Tidak menyimpan data sensitif di browser
✅ Tetap user-friendly
Pingback: Membuat Fitur Remember Me Multi Device Login (Token Unik per Perangkat) di PHP MySQL - Tutorial