Session và Cookie
# Cookie:
Cookie là cách lưu trữ dữ liệu tại browser. Khi thực hiện request dữ liệu cookie sẽ được gửi kèm đến server. Với server sử dụng cookie, browser sẽ lưu cookie trong respond trả về. VD: Set cookie với php
<?php
$cookie_name = "user";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
2
3
4
5
Inspect tab Network, xem chi tiết Response Headers sẽ thấy
Set-Cookie: user2=John%20Doe; expires=Mon, 27-Sep-2021 14:26:15 GMT; Max-Age=2592000; path=/
# Session
Session là 1 cách lưu trữ thông tin từng user(browser) cho nhiều page khác nhau. Hiểu đơn giản trong 1 request trong php, ta có thể tạo 1 variable để lưu thông tin vậy làm sao có thể lưu thông tin và thay đổi cho nhiều request, lúc này có thể sử dụng session variable ($_SESSION).
Khi bắt đầu học php, thường dùng session cho các xử lí authentication hay shopping cart,..
Khi vừa tiếp xúc với session, dễ nhận định sai lầm là trường hợp các request với các browser khác nhau thì có thể truy cập cùng 1 dữ liệu session. Nếu không thể thì bằng cách nào web server có thể phân biệt được dữ liệu session của từng browser.
# Session work:
Khi browser gửi 1 request, web server sẽ phản hồi (responds) kèm theo cookie để browser lưu trữ và những lần request tiếp theo browser sẽ gửi kèm theo cookie trở lại server. Vậy có thể dùng cookie để lưu trữ thông tin giữa các request nhưng sẽ có vài khuyết điểm là dữ liệu cookie có thể bị chặn hoặc đánh cắp, nguy hiểm nếu dữ liệu cần bảo mật của người dùng.
Giải pháp là dùng kết hợp giữa cookie và lưu trữ thông tin trên server. Đó là session. Server sẽ dựa vào cookie của browser để phân biệt dữ liệu được lưu trên server.
Server sẽ gửi cho browser 1 mã token duy nhất, gọi là session ID và được lưu trong cookie. Server sẽ nhận session ID để xác định browser trong mỗi lần request. Vậy có thể trả lời cho các trường hợp chặn hoặc xóa cookie thì không thể sử dụng hoặc phải đăng nhập lại ứng dụng.
Khi đóng browser, session ID trong cookie sẽ bị xóa nhưng nếu không chủ động xóa dữ liệu session tên server thì dữ liệu đó vẫn còn. Nhưng thường user sẽ đóng tab hoặc chỉ tắt browser.
Vậy nên session sẽ có thời gian timeout. PHP GC (Garbage Collection) sẽ chạy định kì và xóa bỏ dữ liệu session đã quá hạn.