Tổng hợp Session và Cookie trong PHP

Tổng hợp Session và Cookie trong PHP

Tổng hợp Session và Cookie trong PHP từ cách tạo, đọc, xóa đến quản lý đăng nhập, bảo mật và cách lựa chọn phù hợp cho từng tình huống, chi tiết như nào hãy cùng chúng tôi phân tích:

Trong quá trình xây dựng website bằng PHP, việc lưu và duy trì trạng thái của người dùng là một bài toán xuất hiện rất thường xuyên. HTTP vốn hoạt động theo kiểu mỗi request được xử lý tương đối độc lập, vì vậy máy chủ không tự động biết hai lần truy cập liên tiếp có phải đến từ cùng một người hay không. Đây chính là lúc SessionCookie trở thành hai cơ chế quan trọng để website ghi nhớ thông tin giữa nhiều lần tương tác.

Cookie thường được lưu trực tiếp ở trình duyệt và có thể được gửi kèm theo request đến máy chủ. Trong khi đó, Session thường được dùng để lưu dữ liệu phía máy chủ, còn trình duyệt giữ một mã nhận diện để PHP xác định phiên tương ứng. Hai cơ chế này có mối liên hệ chặt chẽ nhưng không giống nhau về cách hoạt động, phạm vi sử dụng và mức độ phù hợp với từng loại dữ liệu.

Nếu hiểu đúng Session và Cookie, bạn có thể xây dựng nhiều chức năng quen thuộc như đăng nhập, ghi nhớ người dùng, giỏ hàng, tùy chọn giao diện, thông báo sau khi chuyển hướng hoặc kiểm soát trạng thái trong nhiều trang khác nhau. Ngược lại, nếu sử dụng sai cách, việc lưu thông tin nhạy cảm ở Cookie hoặc quản lý Session thiếu an toàn có thể tạo ra những rủi ro đáng kể.

Bài viết này của Web Mới sẽ tổng hợp cách sử dụng Session và Cookie trong PHP từ kiến thức nền tảng đến các tình huống thực tế, đồng thời phân tích mối quan hệ giữa chúng để bạn biết khi nào nên dùng Cookie, khi nào nên dùng Session và cách kết hợp cả hai một cách hợp lý.

Tổng hợp Session và Cookie trong PHP

Session và Cookie giải quyết vấn đề gì?

Hãy tưởng tượng một người dùng truy cập trang đăng nhập của website. Sau khi nhập đúng tài khoản và mật khẩu, họ chuyển sang trang cá nhân. Nếu website không có cơ chế duy trì trạng thái, trang cá nhân sẽ không biết rằng request hiện tại thuộc về người vừa đăng nhập trước đó.

HTTP không tự duy trì trạng thái đăng nhập giữa các request. Mỗi request mới cần có một cách để hệ thống nhận biết người dùng hoặc phiên làm việc tương ứng. Cookie và Session được sử dụng để giải quyết chính bài toán này.

Cookie có thể giúp trình duyệt lưu một lượng thông tin nhất định, sau đó gửi thông tin đó trở lại máy chủ khi phù hợp. Session thường giữ dữ liệu ở phía máy chủ, còn trình duyệt chỉ cần mang theo thông tin nhận diện phiên.

Ví dụ, một website bán hàng có thể sử dụng Session để lưu trạng thái giỏ hàng trong quá trình người dùng mua sắm. Cookie lại phù hợp với những thông tin như tùy chọn ngôn ngữ hoặc một mã nhận diện phục vụ việc ghi nhớ người dùng.

Cookie trong PHP hoạt động như thế nào?

Cookie là một mẩu dữ liệu được website yêu cầu trình duyệt lưu lại. Khi Cookie còn hiệu lực và thuộc phạm vi áp dụng của request, trình duyệt có thể gửi Cookie trở lại máy chủ.

Điểm quan trọng cần nhớ là Cookie nằm ở phía client. PHP không trực tiếp lưu Cookie trong máy chủ. PHP chỉ gửi yêu cầu thiết lập Cookie thông qua HTTP response, sau đó trình duyệt quyết định lưu và gửi lại Cookie trong những request phù hợp.

Một Cookie thường có tên, giá trị và nhiều thuộc tính đi kèm. Các thuộc tính như thời gian hết hạn, đường dẫn, domain, Secure và HttpOnly ảnh hưởng đến cách Cookie được sử dụng.

Tạo Cookie bằng setcookie()

Trong PHP, hàm phổ biến nhất để tạo Cookie là setcookie(). Cookie cần được thiết lập trước khi PHP gửi phần header của HTTP response đến trình duyệt.

<?php
setcookie('user_name', 'Web Moi', time() + 3600);
?>

Ví dụ trên yêu cầu trình duyệt lưu Cookie có tên user_name với giá trị Web Moi trong khoảng một giờ kể từ thời điểm tạo.

Thời gian hết hạn được truyền dưới dạng Unix timestamp. Nếu không thiết lập thời gian hết hạn hoặc sử dụng thời gian phù hợp với nhu cầu, Cookie có thể tồn tại theo phiên trình duyệt hoặc được xóa tùy theo cách thiết lập.

Đọc Cookie bằng $_COOKIE

Sau khi Cookie đã được trình duyệt lưu và gửi lại trong request tiếp theo, PHP có thể đọc giá trị thông qua biến siêu toàn cục $_COOKIE.

<?php
if (isset($_COOKIE['user_name'])) {
    echo $_COOKIE['user_name'];
}
?>

Việc kiểm tra isset() trước khi đọc giúp tránh trường hợp mã Cookie chưa tồn tại trong request hiện tại.

Cần lưu ý rằng ngay sau khi gọi setcookie(), bạn không nên mặc định rằng giá trị đã xuất hiện ngay trong $_COOKIE của cùng một request. Cookie thường được trình duyệt nhận từ response và gửi lại trong request tiếp theo.

Xóa Cookie đúng cách

Để xóa một Cookie, cách phổ biến là thiết lập lại Cookie với thời gian hết hạn đã nằm trong quá khứ.

<?php
setcookie('user_name', '', time() - 3600);
?>

Khi xóa Cookie, các thuộc tính liên quan như đường dẫn và domain cần phù hợp với Cookie ban đầu. Nếu Cookie được tạo với một đường dẫn cụ thể nhưng khi xóa lại sử dụng đường dẫn khác, trình duyệt có thể không xóa đúng Cookie cần thiết.

Thiết lập Cookie với mảng tùy chọn

Với các phiên bản PHP hiện đại, bạn có thể thiết lập Cookie bằng mảng tùy chọn. Cách này giúp mã nguồn dễ đọc hơn và thuận tiện khi cần kiểm soát các thuộc tính bảo mật.

<?php
setcookie('site_mode', 'dark', [
    'expires' => time() + 86400,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>

Trong ví dụ này, Cookie có thời hạn một ngày, áp dụng trên toàn website và được thiết lập thêm các thuộc tính giúp hạn chế một số rủi ro khi sử dụng.

Các thuộc tính Cookie quan trọng trong PHP

Cookie không chỉ đơn giản gồm tên và giá trị. Khi xây dựng ứng dụng thực tế, việc hiểu các thuộc tính đi kèm sẽ giúp bạn kiểm soát phạm vi hoạt động và bảo vệ dữ liệu tốt hơn.

expires

expires xác định thời điểm Cookie hết hạn. Sau thời điểm này, trình duyệt có thể loại bỏ Cookie hoặc không gửi Cookie đó trong các request tiếp theo.

Cookie có thời hạn dài thường phù hợp với các tùy chọn ghi nhớ người dùng, nhưng không nên áp dụng tùy tiện cho dữ liệu nhạy cảm.

path

path xác định phạm vi đường dẫn mà Cookie được áp dụng. Nếu đặt /, Cookie thường được sử dụng trên toàn bộ website.

Trong một hệ thống lớn, việc giới hạn phạm vi Cookie có thể giúp giảm số lượng request không cần thiết và hạn chế phạm vi sử dụng của dữ liệu.

domain

domain xác định phạm vi tên miền mà Cookie có thể áp dụng. Việc thiết lập domain cần được cân nhắc kỹ, đặc biệt khi website có nhiều subdomain.

Không nên mở rộng domain hơn mức cần thiết nếu ứng dụng không thực sự yêu cầu, bởi phạm vi Cookie càng rộng thì càng có nhiều thành phần có khả năng nhận được Cookie.

secure

Khi thiết lập secure, Cookie chỉ nên được gửi thông qua kết nối HTTPS. Đây là một thiết lập quan trọng đối với các website đã triển khai HTTPS.

Đối với website có dữ liệu đăng nhập hoặc thông tin xác thực, việc sử dụng HTTPS và Cookie Secure nên được xem là một phần của chiến lược bảo mật tổng thể.

httponly

Thuộc tính HttpOnly giúp hạn chế việc JavaScript phía trình duyệt truy cập trực tiếp vào Cookie thông qua các API như document.cookie.

Điều này không biến Cookie thành tuyệt đối an toàn, nhưng có thể giảm khả năng Cookie bị truy cập bởi một số đoạn mã JavaScript độc hại trong trường hợp xảy ra lỗ hổng XSS.

samesite

SameSite kiểm soát cách Cookie được gửi trong một số tình huống liên quan đến request cross-site. Các giá trị thường gặp gồm Lax, StrictNone.

Việc lựa chọn giá trị phù hợp phụ thuộc vào kiến trúc ứng dụng. Không nên chọn None chỉ vì muốn Cookie hoạt động rộng hơn, bởi trong nhiều trường hợp thiết lập này cần đi kèm HTTPS và có những tác động bảo mật cần cân nhắc.

Session trong PHP là gì?

Session là cơ chế giúp ứng dụng duy trì dữ liệu liên quan đến một phiên làm việc của người dùng giữa nhiều request.

Khác với Cookie, dữ liệu Session thông thường được quản lý ở phía máy chủ. Trình duyệt chủ yếu giữ thông tin định danh phiên, giúp máy chủ biết request hiện tại thuộc về Session nào.

Trong PHP, Session thường được bắt đầu bằng session_start(). Sau đó, dữ liệu có thể được lưu thông qua biến $_SESSION.

Bắt đầu một Session

Trước khi sử dụng biến $_SESSION, bạn thường cần khởi động Session.

<?php
session_start();

$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'webmoi';
?>

Sau khi dữ liệu được lưu, các request tiếp theo thuộc cùng phiên có thể truy cập những giá trị này nếu Session vẫn còn hiệu lực.

Đọc dữ liệu Session

Để đọc dữ liệu đã lưu, bạn truy cập trực tiếp vào $_SESSION.

<?php
session_start();

if (isset($_SESSION['username'])) {
    echo $_SESSION['username'];
}
?>

Việc gọi session_start() trong request cần thiết để PHP khôi phục Session tương ứng trước khi bạn đọc dữ liệu.

Cập nhật dữ liệu trong phiên làm việc

Dữ liệu Session có thể được cập nhật tương tự như một mảng PHP.

<?php
session_start();

$_SESSION['username'] = 'Web Moi';
$_SESSION['role'] = 'admin';
?>

Cách tổ chức dữ liệu nên rõ ràng, tránh lưu quá nhiều thông tin không cần thiết. Session phù hợp để lưu trạng thái hoặc dữ liệu tạm thời phục vụ quy trình xử lý, thay vì biến nó thành một nơi chứa toàn bộ dữ liệu của tài khoản.

Cách xóa dữ liệu và kết thúc Session

PHP cung cấp nhiều mức độ xử lý khác nhau khi bạn muốn loại bỏ dữ liệu trong Session. Việc lựa chọn cách nào phụ thuộc vào mục đích thực tế.

Xóa một biến Session

Nếu chỉ muốn loại bỏ một giá trị cụ thể, bạn có thể sử dụng unset().

<?php
session_start();

unset($_SESSION['username']);
?>

Các dữ liệu khác trong Session vẫn được giữ nguyên.

Xóa toàn bộ dữ liệu Session

Nếu muốn loại bỏ toàn bộ biến dữ liệu đã lưu trong Session, có thể sử dụng session_unset().

<?php
session_start();

session_unset();
?>

Cách này tập trung vào việc xóa các biến Session hiện có. Nó không đồng nghĩa với việc mọi thành phần liên quan đến phiên làm việc đều đã bị hủy hoàn toàn.

Hủy Session

Khi muốn kết thúc phiên làm việc, bạn có thể sử dụng session_destroy().

<?php
session_start();

session_unset();
session_destroy();
?>

Trong chức năng đăng xuất, việc hủy Session là một phần quan trọng. Tuy nhiên, nếu ứng dụng có Cookie chứa thông tin ghi nhớ đăng nhập hoặc token riêng, bạn cũng cần xử lý những thành phần đó theo thiết kế xác thực của hệ thống.

Session và Cookie liên quan với nhau như thế nào?

Đây là phần thường gây nhầm lẫn nhất đối với người mới học PHP. Nhiều người cho rằng Session hoàn toàn không liên quan đến Cookie vì dữ liệu Session được lưu trên máy chủ. Thực tế, trong mô hình Session mặc định phổ biến của PHP, Cookie có thể được sử dụng để giữ Session ID.

Có thể hình dung đơn giản như sau:

  1. Người dùng truy cập website.
  2. PHP khởi động hoặc tạo một phiên làm việc.
  3. Máy chủ tạo một Session ID để nhận diện phiên.
  4. Session ID được lưu hoặc truyền cho trình duyệt theo cơ chế phù hợp.
  5. Ở request tiếp theo, trình duyệt gửi Session ID trở lại.
  6. PHP dùng Session ID để xác định dữ liệu Session tương ứng ở phía máy chủ.

Vì vậy, Cookie và Session không nhất thiết là hai cơ chế tách biệt hoàn toàn. Cookie có thể đóng vai trò như chiếc vé nhận diện, còn dữ liệu Session nằm ở phía máy chủ là nơi lưu trạng thái của phiên.

So sánh Session và Cookie trong PHP

Tiêu chí Session Cookie
Vị trí lưu dữ liệu Thường được quản lý ở phía máy chủ Được lưu ở trình duyệt
Dung lượng Phụ thuộc cơ chế lưu trữ Session và tài nguyên máy chủ Có giới hạn theo chính sách và khả năng của trình duyệt
Thời gian tồn tại Phụ thuộc cấu hình và vòng đời Session Được kiểm soát bằng thời hạn Cookie hoặc vòng đời trình duyệt
Khả năng người dùng nhìn thấy Dữ liệu không được lưu trực tiếp dưới dạng Session ở trình duyệt Người dùng có thể xem Cookie trong công cụ trình duyệt
Phù hợp với Trạng thái đăng nhập, dữ liệu tạm thời, quy trình nhiều bước Tùy chọn người dùng, nhận diện, thiết lập cá nhân
Rủi ro chính Quản lý Session ID và vòng đời phiên không an toàn Lộ dữ liệu, giả mạo hoặc sử dụng sai thuộc tính bảo mật

Không có cơ chế nào luôn tốt hơn cơ chế còn lại. Điều quan trọng là chọn đúng nơi lưu dữ liệu dựa trên tính chất của thông tin và yêu cầu của ứng dụng.

Khi nào nên dùng Session?

Session phù hợp khi dữ liệu cần được duy trì trong một phiên làm việc và không nên phụ thuộc hoàn toàn vào dữ liệu do trình duyệt cung cấp.

  • Trạng thái người dùng đã đăng nhập.
  • Thông tin tạm thời trong quy trình nhiều bước.
  • Thông báo một lần sau khi chuyển hướng trang.
  • Thông tin giỏ hàng trong các ứng dụng có thiết kế lưu trữ phía máy chủ.
  • Trạng thái tạm thời của biểu mẫu.
  • Các dữ liệu không nên gửi toàn bộ về trình duyệt trong mỗi request.

Session đặc biệt hữu ích khi người dùng thực hiện một chuỗi hành động liên tiếp và website cần ghi nhớ trạng thái giữa các trang.

Khi nào nên dùng Cookie?

Cookie phù hợp với những dữ liệu có thể được trình duyệt lưu giữ và website cần sử dụng lại trong các lần truy cập sau.

  • Tùy chọn ngôn ngữ.
  • Chế độ sáng hoặc tối.
  • Một số thiết lập hiển thị của người dùng.
  • Thông tin nhận diện phục vụ một cơ chế xác thực được thiết kế đúng cách.
  • Thông tin dùng để ghi nhớ lựa chọn trên website.

Không nên mặc định rằng Cookie là nơi phù hợp để lưu mọi dữ liệu. Đặc biệt, các thông tin nhạy cảm không nên được đưa vào Cookie chỉ vì thao tác này đơn giản.

Ví dụ xây dựng chức năng đăng nhập bằng Session

Một mô hình cơ bản thường là sau khi xác thực tài khoản thành công, ứng dụng lưu ID người dùng vào Session.

<?php
session_start();

$loginSuccess = true;
$userId = 123;

if ($loginSuccess) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = $userId;
    $_SESSION['logged_in'] = true;
}
?>

Ở đây, việc gọi session_regenerate_id(true) sau khi xác thực thành công có thể giúp giảm nguy cơ Session Fixation bằng cách tạo Session ID mới.

Ở các ứng dụng thực tế, quá trình đăng nhập còn cần xử lý mật khẩu bằng các hàm phù hợp, kiểm tra trạng thái tài khoản, chống tấn công tự động và áp dụng các biện pháp bảo mật khác.

Kiểm tra người dùng đã đăng nhập

<?php
session_start();

if (!empty($_SESSION['logged_in']) && !empty($_SESSION['user_id'])) {
    echo 'Người dùng đã đăng nhập';
} else {
    echo 'Vui lòng đăng nhập';
}
?>

Không nên chỉ kiểm tra một giá trị tùy ý rồi kết luận người dùng đã xác thực. Hệ thống cần có quy trình xác thực rõ ràng và kiểm tra dữ liệu Session theo đúng thiết kế.

Ví dụ đăng xuất an toàn hơn

Đăng xuất không nên chỉ đơn giản là chuyển người dùng về trang chủ. Ứng dụng cần xử lý trạng thái xác thực hiện tại.

<?php
session_start();

$_SESSION = [];

if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();

    setcookie(
        session_name(),
        '',
        time() - 42000,
        $params['path'],
        $params['domain'],
        $params['secure'],
        $params['httponly']
    );
}

session_destroy();
?>

Cách xử lý cụ thể có thể thay đổi tùy phiên bản PHP và cấu hình ứng dụng. Ý tưởng quan trọng là cần xem xét cả dữ liệu Session lẫn Cookie nhận diện Session nếu muốn kết thúc phiên một cách đầy đủ.

Session Flash dùng để làm gì?

Một trường hợp sử dụng Session rất thực tế là hiển thị thông báo chỉ một lần. Ví dụ, sau khi người dùng lưu bài viết, hệ thống chuyển hướng về danh sách và hiển thị thông báo Lưu thành công.

Thay vì truyền thông báo qua URL, bạn có thể lưu tạm trong Session rồi xóa sau khi hiển thị.

<?php
session_start();

$_SESSION['flash_message'] = 'Lưu dữ liệu thành công';

header('Location: /danh-sach.php');
exit;
?>

Ở trang đích:

<?php
session_start();

if (isset($_SESSION['flash_message'])) {
    echo $_SESSION['flash_message'];
    unset($_SESSION['flash_message']);
}
?>

Mô hình này rất hữu ích trong các ứng dụng PHP truyền thống sử dụng POST rồi Redirect. Nó giúp tránh gửi lại biểu mẫu khi người dùng tải lại trang sau khi chuyển hướng.

Lưu ý quan trọng về bảo mật Session

Session thường được sử dụng trong các chức năng liên quan đến đăng nhập, vì vậy việc bảo vệ Session cần được xem là một phần quan trọng của bảo mật ứng dụng.

Đổi Session ID sau khi đăng nhập

Sau khi người dùng đăng nhập thành công, nên cân nhắc sử dụng session_regenerate_id(true) để thay đổi Session ID.

<?php
session_start();

if ($authenticated) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = $userId;
}
?>

Điều này giúp giảm nguy cơ kẻ tấn công tận dụng một Session ID đã được biết trước trong các tình huống Session Fixation.

Không lưu mật khẩu dạng thô trong Session

Session không phải nơi thích hợp để lưu mật khẩu người dùng. Sau khi xác thực, ứng dụng thường chỉ cần lưu một định danh cần thiết như user ID hoặc các thông tin trạng thái tối thiểu.

Mật khẩu nên được lưu trữ ở cơ sở dữ liệu dưới dạng hash an toàn bằng các cơ chế phù hợp của PHP, chẳng hạn như password_hash()password_verify().

Không tin tưởng dữ liệu từ Cookie

Dữ liệu Cookie nằm ở phía trình duyệt và người dùng có thể thay đổi nó. Vì vậy, Cookie không nên được xem là nguồn dữ liệu đáng tin cậy cho các quyết định bảo mật.

Nếu Cookie chứa một giá trị như vai trò người dùng là admin, ứng dụng không nên chỉ đọc giá trị đó rồi cấp quyền quản trị. Quyền cần được xác minh từ nguồn đáng tin cậy ở phía máy chủ.

Thiết lập Cookie bảo mật phù hợp

Đối với Cookie có vai trò quan trọng trong xác thực, cần cân nhắc các thuộc tính như Secure, HttpOnlySameSite. Cách thiết lập cụ thể phụ thuộc vào kiến trúc ứng dụng và yêu cầu nghiệp vụ.

Những lỗi thường gặp khi làm việc với Session và Cookie

Gọi session_start() sau khi đã xuất HTML

Một lỗi phổ biến là gửi nội dung ra trình duyệt trước rồi mới khởi động Session. Vì Session thường cần gửi hoặc xử lý HTTP header, việc xuất dữ liệu trước đó có thể dẫn đến lỗi liên quan đến header.

Trong thiết kế ứng dụng, nên khởi động Session ở vị trí phù hợp trước khi có output không cần thiết.

Đọc Cookie ngay sau khi vừa tạo

Cookie được gửi từ máy chủ đến trình duyệt thông qua response. Trình duyệt sau đó mới gửi Cookie trong request tiếp theo. Vì vậy, việc tạo Cookie và mong đợi giá trị lập tức xuất hiện trong $_COOKIE của cùng request là một nhầm lẫn thường gặp.

Lưu dữ liệu nhạy cảm trực tiếp trong Cookie

Cookie có thể được người dùng xem và thay đổi. Vì vậy, không nên lưu mật khẩu, dữ liệu bí mật hoặc thông tin có thể dẫn đến cấp quyền trái phép trực tiếp trong Cookie.

Lưu quá nhiều dữ liệu trong Session

Session giúp lưu trạng thái nhưng không có nghĩa là mọi dữ liệu đều nên đưa vào Session. Việc lưu trữ quá nhiều thông tin có thể gây khó khăn trong quản lý tài nguyên và khiến hệ thống trở nên phức tạp.

Hãy lưu những gì thực sự cần thiết cho phiên làm việc và dùng cơ sở dữ liệu hoặc hệ thống lưu trữ chuyên dụng cho dữ liệu lớn.

Không kiểm tra dữ liệu đầu vào

Dù dữ liệu đến từ Cookie, Session hay bất kỳ nguồn nào khác, ứng dụng vẫn cần xử lý dữ liệu đúng cách. Việc dữ liệu nằm trong Session không đồng nghĩa mọi giá trị liên quan đều tự động an toàn.

Session Cookie và Session lưu trữ phía máy chủ khác nhau ra sao?

Trong PHP, khái niệm Session thường khiến người học nhầm rằng toàn bộ Session luôn nằm trên máy chủ và Cookie luôn là một cơ chế hoàn toàn độc lập. Trên thực tế, cần tách hai phần: dữ liệu phiênthông tin nhận diện phiên.

Dữ liệu phiên có thể được lưu ở phía máy chủ thông qua các cơ chế lưu trữ khác nhau. Session ID lại thường được trình duyệt gửi qua Cookie trong mô hình phổ biến.

Điều này tạo nên một kiến trúc khá hiệu quả: trình duyệt không cần mang theo toàn bộ dữ liệu Session trong mỗi request, mà chỉ cần gửi thông tin nhận diện để máy chủ tìm dữ liệu tương ứng.

Có nên dùng Session và Cookie cùng lúc không?

Câu trả lời là có, nếu mỗi cơ chế đảm nhận đúng vai trò của nó.

Ví dụ, một website có thể sử dụng Session để lưu trạng thái người dùng trong phiên hiện tại. Đồng thời, Cookie có thể lưu một mã nhận diện phục vụ tính năng ghi nhớ đăng nhập lâu dài. Khi người dùng quay lại, máy chủ có thể dùng mã đó để thực hiện quy trình xác thực phù hợp.

Tuy nhiên, tính năng Remember Me không nên được triển khai bằng cách lưu username và password trong Cookie. Cách an toàn hơn là sử dụng token ngẫu nhiên, có khả năng thu hồi và được quản lý ở phía máy chủ.

Session và Cookie trong ứng dụng PHP hiện đại

Trong một website PHP đơn giản, Session và Cookie có thể được sử dụng trực tiếp thông qua các hàm và biến có sẵn. Tuy nhiên, khi ứng dụng phát triển, bạn nên tổ chức chúng thành một kiến trúc rõ ràng.

Ví dụ, lớp xác thực có thể chịu trách nhiệm đăng nhập và đăng xuất. Một lớp riêng có thể quản lý Session. Cookie có thể được tạo thông qua một lớp hoặc dịch vụ chuyên biệt để thống nhất các thuộc tính bảo mật.

Cách tiếp cận này giúp giảm việc rải rác các lệnh setcookie(), session_start() hoặc thao tác trực tiếp với $_SESSION ở quá nhiều nơi trong mã nguồn.

Đối với ứng dụng lớn, bạn cũng cần cân nhắc nơi lưu Session như file, database hoặc hệ thống lưu trữ tập trung. Khi ứng dụng chạy trên nhiều máy chủ, việc phụ thuộc vào Session file cục bộ có thể gây ra vấn đề nếu không có kiến trúc đồng bộ hoặc cơ chế định tuyến phù hợp.

Session và Cookie có thay thế hoàn toàn cho nhau không?

Không. Hai cơ chế có thể phối hợp nhưng không nên xem chúng là hai phiên bản khác nhau của cùng một thứ.

Cookie phù hợp với dữ liệu mà trình duyệt cần lưu và gửi lại theo quy tắc của website. Session phù hợp với trạng thái mà ứng dụng cần quản lý ở phía máy chủ.

Nếu bạn cần lưu một lựa chọn giao diện đơn giản như chế độ tối, Cookie có thể là lựa chọn thuận tiện. Nếu cần duy trì trạng thái xác thực trong một phiên làm việc, Session thường phù hợp hơn.

Trong các hệ thống phức tạp, câu trả lời có thể là kết hợp cả hai: Cookie giữ thông tin nhận diện, Session duy trì trạng thái hiện tại và database lưu dữ liệu lâu dài.

Cách lựa chọn giữa Session và Cookie trong thực tế

Thay vì ghi nhớ một quy tắc cứng nhắc, bạn có thể tự đặt một số câu hỏi trước khi quyết định nơi lưu dữ liệu.

  1. Dữ liệu này có nhạy cảm hay không?
  2. Người dùng có cần nhìn thấy hoặc thay đổi dữ liệu hay không?
  3. Dữ liệu có cần tồn tại sau khi đóng trình duyệt hay không?
  4. Máy chủ có cần kiểm soát hoàn toàn giá trị này hay không?
  5. Dữ liệu có lớn hay không?
  6. Thông tin có liên quan trực tiếp đến quyền truy cập hay xác thực không?

Nếu dữ liệu liên quan đến quyền truy cập, hãy ưu tiên thiết kế theo hướng máy chủ kiểm soát trạng thái. Nếu chỉ là một tùy chọn nhỏ và không nhạy cảm, Cookie có thể phù hợp hơn.

Checklist sử dụng Session và Cookie trong PHP

  • Khởi động Session đúng thời điểm trước khi cần đọc hoặc ghi dữ liệu.
  • Không lưu mật khẩu dạng thô trong Session hoặc Cookie.
  • Không tin tưởng tuyệt đối dữ liệu do trình duyệt gửi lên.
  • Cân nhắc Secure khi website sử dụng HTTPS.
  • Sử dụng HttpOnly cho Cookie phù hợp với dữ liệu cần hạn chế truy cập từ JavaScript.
  • Cấu hình SameSite phù hợp với luồng hoạt động của ứng dụng.
  • Đổi Session ID sau khi người dùng đăng nhập thành công.
  • Xóa hoặc hủy trạng thái xác thực khi đăng xuất.
  • Không lưu quá nhiều dữ liệu không cần thiết trong Session.
  • Không dùng Cookie để lưu trực tiếp các thông tin bí mật.
  • Kiểm tra và xác thực dữ liệu trước khi dùng cho các quyết định quan trọng.
  • Thiết kế cơ chế Remember Me bằng token thay vì lưu username và password.

Tổng kết

Session và Cookie là hai thành phần nền tảng trong nhiều ứng dụng PHP có nhu cầu duy trì trạng thái giữa các request. Cookie hoạt động ở phía trình duyệt và phù hợp với những dữ liệu nhỏ, tùy chọn hoặc thông tin nhận diện được thiết kế đúng cách. Session lại giúp ứng dụng quản lý trạng thái làm việc ở phía máy chủ và thường được sử dụng trong các chức năng xác thực.

Điều quan trọng không phải là ghi nhớ rằng Session tốt hơn Cookie hay Cookie nhanh hơn Session, mà là hiểu rõ dữ liệu đang được lưu ở đâu, ai có thể kiểm soát nó, thời gian tồn tại bao lâu và hậu quả sẽ như thế nào nếu giá trị đó bị thay đổi.

Khi xây dựng website PHP, hãy xem Session và Cookie như hai công cụ có thể bổ trợ cho nhau. Session có thể đảm nhận trạng thái phiên, Cookie có thể hỗ trợ nhận diện hoặc lưu tùy chọn. Khi kết hợp với HTTPS, các thuộc tính Cookie phù hợp, cơ chế thay đổi Session ID và quy trình xác thực chặt chẽ, bạn sẽ có nền tảng tốt hơn để xây dựng những ứng dụng PHP an toàn, ổn định và dễ mở rộng.

  • 0 Bình luận
Trần Thị Vân | Content Creator Web Mới
Trần Thị Vân
Trần Thị Vân là Content Creator tại Web Mới, phụ trách nghiên cứu, biên soạn nội dung và chia sẻ kiến thức về website, SEO, lập trình cùng các xu hướng công nghệ
Chia sẻ nội dung đánh giá của bạn về Tổng hợp Session và Cookie trong PHP
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Đăng ký tư vấn thiết kế website
Tìm hiểu 1 năm không bằng lắng nghe 1 câu tư vấn