Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Tạo tính năng nhớ mật khẩu (remember me) bằng cookie
Hướng Dẫn Đồ ÁnLập Trình Web

Tạo tính năng nhớ mật khẩu (remember me) bằng cookie

Chia sẻ
Chia sẻ

Trong quá trình phát triển ứng dụng web bằng PHP, tính năng “Nhớ mật khẩu” (remember me) luôn là một nhu cầu quen thuộc. Nó cho phép người dùng không phải đăng nhập lại mỗi khi truy cập website, nhờ vào việc lưu trữ thông tin đăng nhập tạm thời trong cookie. Tính năng này giúp cải thiện trải nghiệm người dùng, đặc biệt đối với các ứng dụng thương mại điện tử, diễn đàn hay hệ thống quản trị mà người dùng cần đăng nhập thường xuyên.

Để triển khai một cách an toàn, bạn cần kết hợp nhiều kỹ thuật: xác thực qua cơ sở dữ liệu (MySQL), mã hóa dữ liệu cookie, quản lý phiên làm việc bằng session, và kèm theo các lớp bảo mật bổ sung như token ngẫu nhiên, hashingthời gian hết hạn. Nếu trước đây bạn đã từng tìm hiểu về giữ đăng nhập bằng Session trong PHP hoặc xây dựng chức năng phân quyền user và admin trong PHP, thì bài viết này sẽ là bước tiếp theo, giúp bạn hoàn thiện luồng xác thực người dùng với cơ chế “ghi nhớ đăng nhập”.

Nguyên lý hoạt động của tính năng “Remember Me”

Tính năng nhớ mật khẩu dựa trên cơ chế cookie của trình duyệt. Khi người dùng tick vào ô “Nhớ mật khẩu” và đăng nhập thành công, hệ thống sẽ tạo một cookie lưu trên máy người dùng. Cookie này chứa thông tin đặc biệt (thường là token), để lần sau khi người dùng quay lại, ứng dụng sẽ đọc cookie, xác thực token với dữ liệu lưu trong database, và tự động tạo session đăng nhập.

Điểm cần lưu ý:

  • Không bao giờ lưu trực tiếp mật khẩu trong cookie.

  • Cookie nên chứa một giá trị ngẫu nhiên (token), được liên kết với người dùng trong cơ sở dữ liệu.

  • Token cần được hash và có ngày hết hạn để tránh lạm dụng.

  • Khi người dùng đăng xuất, cookie phải bị xóa và token bị vô hiệu hóa trong database.

Tạo form đăng nhập có tùy chọn “Nhớ mật khẩu”

Đầu tiên, bạn cần form đăng nhập cơ bản. Form này sẽ có thêm checkbox “Remember Me” để gửi thông tin người dùng muốn lưu đăng nhập.

<form action="login.php" method="post">
  <label for="username">Tên đăng nhập:</label>
  <input type="text" id="username" name="username" required>
  
  <label for="password">Mật khẩu:</label>
  <input type="password" id="password" name="password" required>
  
  <label>
    <input type="checkbox" name="remember"> Nhớ mật khẩu
  </label>
  
  <button type="submit">Đăng nhập</button>
</form>

Form này đơn giản, nhưng nó sẽ là điểm khởi đầu để gửi dữ liệu username, password và trạng thái remember đến file xử lý đăng nhập.

Xử lý đăng nhập và tạo cookie

Trong file login.php, bạn sẽ xử lý logic:

  1. Kiểm tra thông tin người dùng trong database.
  2. Nếu đúng, tạo session để đăng nhập.
  3. Nếu người dùng tick chọn “Remember Me”, tạo token ngẫu nhiên, lưu vào database, đồng thời lưu token đó vào cookie.
<?php
session_start();
require 'db.php'; // file kết nối PDO

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
    $remember = isset($_POST['remember']);

    $stmt = $pdo->prepare("SELECT id, password FROM users WHERE username = :username");
    $stmt->execute(['username' => $username]);
    $user = $stmt->fetch();

    if ($user && password_verify($password, $user['password'])) {
        // Lưu session
        $_SESSION['user_id'] = $user['id'];

        if ($remember) {
            // Tạo token
            $token = bin2hex(random_bytes(32));
            $hashedToken = password_hash($token, PASSWORD_DEFAULT);
            
            // Lưu token vào DB
            $stmt = $pdo->prepare("UPDATE users SET remember_token = :token, token_expiry = DATE_ADD(NOW(), INTERVAL 30 DAY) WHERE id = :id");
            $stmt->execute([
                'token' => $hashedToken,
                'id' => $user['id']
            ]);
            
            // Lưu token gốc vào cookie
            setcookie("rememberme", $user['id'] . ':' . $token, time() + (86400 * 30), "/", "", false, true);
        }

        header("Location: index.php");
        exit;
    } else {
        echo "Sai tên đăng nhập hoặc mật khẩu.";
    }
}

Ở đây:

  • Token được tạo bằng random_bytes để đảm bảo ngẫu nhiên mạnh.

  • Token lưu trong DB được hash bằng password_hash để tăng độ an toàn.

  • Cookie lưu user_id:token để lần sau server có thể nhận diện và xác thực.

  • Thời hạn cookie là 30 ngày.

Tự động đăng nhập bằng cookie

Trong mọi request, bạn cần kiểm tra xem session user_id đã tồn tại chưa. Nếu chưa có, thì kiểm tra cookie rememberme. Nếu cookie hợp lệ, bạn tự động đăng nhập.

<?php
session_start();
require 'db.php';

if (!isset($_SESSION['user_id']) && isset($_COOKIE['rememberme'])) {
    list($userId, $token) = explode(':', $_COOKIE['rememberme']);
    
    $stmt = $pdo->prepare("SELECT remember_token, token_expiry FROM users WHERE id = :id");
    $stmt->execute(['id' => $userId]);
    $user = $stmt->fetch();
    
    if ($user && $user['token_expiry'] > date('Y-m-d H:i:s') && password_verify($token, $user['remember_token'])) {
        $_SESSION['user_id'] = $userId;
    } else {
        // Token không hợp lệ, xóa cookie
        setcookie("rememberme", "", time() - 3600, "/");
    }
}

Xử lý đăng xuất và xóa cookie

Khi người dùng bấm đăng xuất, bạn cần:

  • Xóa session.

  • Xóa cookie.

  • Xóa token trong DB.

<?php
session_start();
require 'db.php';

if (isset($_SESSION['user_id'])) {
    $stmt = $pdo->prepare("UPDATE users SET remember_token = NULL, token_expiry = NULL WHERE id = :id");
    $stmt->execute(['id' => $_SESSION['user_id']]);
}

session_destroy();
setcookie("rememberme", "", time() - 3600, "/");

header("Location: login_form.php");
exit;

Các lưu ý bảo mật khi dùng cookie

  1. Không bao giờ lưu mật khẩu thô trong cookie.
  2. Hash token trong DB, chỉ lưu token gốc trong cookie.
  3. Dùng flag HttpOnlySecure cho cookie để giảm nguy cơ XSS và MITM.
  4. Đặt hạn sử dụng token hợp lý (30 ngày hoặc ít hơn).
  5. Khi token bị lạm dụng, xóa và tạo lại token mới.
  6. Nếu cần độ an toàn cao, dùng bảng riêng để quản lý token thay vì lưu trực tiếp trong bảng users.

Nâng cao: Sử dụng bảng remember_tokens riêng

Thay vì lưu token trong bảng users, bạn có thể tạo bảng riêng để quản lý nhiều token cho một user (phòng khi đăng nhập từ nhiều thiết bị).

CREATE TABLE remember_tokens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    token VARCHAR(255) NOT NULL,
    expiry DATETIME NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

Mỗi lần user đăng nhập và chọn “remember me”, bạn thêm một token mới vào bảng này. Khi xác thực, chỉ cần tìm theo user_id và so sánh token.

Kết luận

Tính năng “Nhớ mật khẩu” bằng cookie trong PHP là một giải pháp tiện lợi để cải thiện trải nghiệm người dùng, nhưng nó chỉ thực sự an toàn khi bạn áp dụng đúng kỹ thuật: không lưu mật khẩu thô, chỉ sử dụng token ngẫu nhiên đã được hash, đặt hạn sử dụng, và xóa cookie lẫn token khi đăng xuất. Ngoài ra, kết hợp với các kỹ thuật đã trình bày ở những bài viết trước như quản lý session và phân quyền user sẽ giúp hệ thống xác thực của bạn trở nên hoàn thiện hơn.

Nhìn tổng thể, “Remember Me” không chỉ là một tính năng nhỏ trong form đăng nhập, mà còn là một phần quan trọng của chiến lược xác thực và bảo mật toàn diện. Một khi bạn triển khai đầy đủ, hệ thống vừa mang lại sự thuận tiện cho người dùng, vừa giảm thiểu rủi ro bảo mật, đảm bảo website vận hành ổn định và đáng tin cậy.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!