Giới thiệu
Trong phát triển backend, đặc biệt khi làm việc với các hệ thống web tương tác cao, một thách thức cốt lõi là duy trì trạng thái người dùng qua nhiều yêu cầu HTTP. Do giao thức HTTP vốn dĩ không lưu trạng thái (stateless), máy chủ không thể tự động phân biệt giữa các request từ cùng một người dùng. Để giải quyết vấn đề này, hai cơ chế then chốt được sử dụng rộng rãi: Cookie và Session. Chúng hoạt động song song hoặc bổ trợ nhau nhằm nhận diện người dùng và duy trì thông tin phiên làm việc.
Cookie: Lưu trữ trạng thái tại phía người dùng
Cookie là một đoạn dữ liệu nhỏ do máy chủ gửi đến trình duyệt người dùng thông qua header Set-Cookie trong phản hồi HTTP. Trình duyệt lưu trữ dữ liệu này và tự động đính kèm lại vào các request tiếp theo nếu điều kiện về tên miền và đường dẫn phù hợp.
Cơ chế hoạt động
- Gửi Cookie từ server: Khi xử lý một request, server có thể thêm header
Set-Cookie: - Lưu trữ tại client: Trình duyệt lưu cookie này theo các thuộc tính đi kèm.
- Gửi lại lên server: Các request kế tiếp tới cùng miền và đường dẫn sẽ bao gồm header
Cookie:
Set-Cookie: session_key=xyz987; Max-Age=3600; Path=/; HttpOnly; Secure; SameSite=Lax
Cookie: session_key=xyz987
Phân loại cookie
- Cookie tạm thời (Session Cookie): Không có
Max-AgehayExpires, chỉ tồn tại trong phiên làm việc của trình duyệt. Bị xóa khi đóng tab hoặc trình duyệt. - Cookie kéo dài (Persistent Cookie): Có thời hạn sống rõ ràng thông qua
Max-AgehoặcExpires, được lưu trên ổ cứng và tồn tại sau khi trình duyệt tắt.
Thuộc tính bảo mật quan trọng
| Thuộc tính | Mục đích |
|---|---|
HttpOnly |
Ngăn JavaScript truy cập cookie, giảm thiểu rủi ro tấn công XSS. |
Secure |
Chỉ cho phép truyền cookie qua kết nối HTTPS, tránh bị đánh cắp trên mạng không an toàn. |
SameSite |
Kiểm soát việc gửi cookie trong ngữ cảnh cross-site: Strict, Lax, hoặc None – giúp phòng chống tấn công CSRF. |
Hạn chế và lưu ý
- Dung lượng giới hạn (~4KB mỗi cookie, số lượng cookie mỗi miền cũng bị giới hạn).
- Không nên lưu dữ liệu nhạy cảm như mật khẩu trực tiếp trong cookie.
- Chính sách cùng nguồn (same-origin) ảnh hưởng đến việc truy cập cookie giữa các miền khác nhau.
Session: Quản lý trạng thái tại phía máy chủ
Session là cơ chế lưu trữ trạng thái người dùng ở phía server. Mỗi người dùng khi truy cập lần đầu sẽ được cấp một định danh duy nhất (session ID), định danh này thường được lưu trong cookie tại phía client.
Nguyên lý hoạt động
- Người dùng truy cập trang web lần đầu tiên.
- Server tạo một session mới, sinh ra
session_idngẫu nhiên và lưu trữ dữ liệu liên quan (ví dụ: user_id, role) trong bộ nhớ hoặc Redis. - Server trả về response kèm
Set-Cookie: session_id=abc123. - Client lưu
session_idvà gửi lại trong mỗi request tiếp theo. - Server dùng
session_idđể tra cứu thông tin người dùng từ kho lưu trữ session.
Quản lý vòng đời
- Timeout: Session có thể được cấu hình để tự động hết hạn sau một khoảng thời gian không hoạt động (ví dụ: 30 phút).
- Hủy chủ động: Khi người dùng đăng xuất, server xóa session khỏi bộ nhớ và yêu cầu client xóa cookie bằng cách đặt thời gian hết hạn trong quá khứ:
Set-Cookie: session_id=; Max-Age=0; Path=/
Ưu điểm bảo mật
Vì dữ liệu người dùng thật sự được lưu ở server, chỉ có session_id được truyền qua mạng, nên mức độ an toàn cao hơn so với việc lưu tất cả dữ liệu tại client. Tuy nhiên, cần đảm bảo session_id đủ ngẫu nhiên và được bảo vệ bằng các thuộc tính HttpOnly và Secure.
So sánh Cookie và Session
| Tiêu chí | Cookie | Session |
|---|---|---|
| Vị trí lưu trữ | Client (trình duyệt) | Server (RAM, Redis, DB...) |
| Dung lượng | Giới hạn (~4KB) | Linh hoạt, phụ thuộc tài nguyên server |
| Bảo mật | Thấp hơn – dễ bị đọc/trộm nếu không cấu hình đúng | Cao hơn – dữ liệu không nằm trên client |
| Hiệu năng | Không tốn tài nguyên server để lưu | Tốn bộ nhớ server, cần cơ chế lưu trữ ngoài như Redis nếu mở rộng |
| Ứng dụng điển hình | Theme, ngôn ngữ, tracking | Xác thực người dùng, giỏ hàng, form đa bước |
Quan hệ giữa Cookie và Session
Session thường phụ thuộc vào Cookie để truyền session_id. Tuy nhiên, trong một số trường hợp (như ứng dụng mobile hoặc API), session ID có thể được truyền qua header (ví dụ: Authorization: Bearer <token>) hoặc URL parameter. Dù vậy, mô hình phổ biến nhất trên web vẫn là dùng Cookie để giữ session ID.
Kết luận
Cookie và Session là hai nền tảng cơ bản để xây dựng trải nghiệm người dùng cá nhân hóa và an toàn trên nền tảng web. Việc lựa chọn sử dụng cái nào phụ thuộc vào yêu cầu cụ thể về bảo mật, dung lượng dữ liệu và kiến trúc hệ thống. Một giải pháp hiện đại còn kết hợp cả hai với các công nghệ như JWT hoặc lưu session phi trạng thái (stateless session) để tăng khả năng mở rộng. Tuy nhiên, hiểu rõ bản chất và cách vận hành của Cookie và Session vẫn là nền tảng thiết yếu cho mọi kỹ sư phần mềm làm việc với ứng dụng web.