Membuat Fitur Remember Me dengan Token Login & Enkripsi di PHP

By | 14 October 2025

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:

  1. Saat pengguna mencentang “Remember Me”, sistem membuat token acak.

  2. Token tersebut disimpan di:

    • Cookie browser (versi terenkripsi)

    • Database (versi di-hash)

  3. Saat pengguna membuka situs lagi, token di cookie diverifikasi dengan yang di database.

  4. 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

Category: PHP

One thought on “Membuat Fitur Remember Me dengan Token Login & Enkripsi di PHP

  1. Pingback: Membuat Fitur Remember Me Multi Device Login (Token Unik per Perangkat) di PHP MySQL - Tutorial

Comments are closed.