Mục lục

Cuộc chiến ngàn năm: JWT vs Session

Phân tích chiến lược Authentication: Stateless (JWT) hay Stateful (Session). Tại sao Ngân hàng chọn Session còn App Chat chọn JWT?

Khi bắt đầu một dự án mới, câu hỏi đầu tiên của mọi Backend/Fullstack Dev là: "Chúng ta sẽ dùng JWT hay Session?". Chọn sai ở bước này, bạn sẽ trả giá đắt khi hệ thống mở rộng (Scale) hoặc khi gặp sự cố bảo mật.

JWT vs Session Comparison

1. Bản chất vấn đề (The Core Difference)

Session Authentication (Stateful - Có trí nhớ)

  • Cơ chế: User đăng nhập -> Server tạo một bản ghi (Session ID) lưu vào Database/Redis -> Gửi Session ID về cho User (dưới dạng Cookie).
  • Kiểm tra: Mỗi lần User gửi request, Server cầm Session ID chạy vào Database hỏi: "Thằng này còn hạn không? Có bị cấm không?".
  • Ẩn dụ: Giống như Danh sách khách mời tại Club. Bảo vệ phải check list mỗi lần bạn ra vào.

JWT Authentication (Stateless - Mất trí nhớ)

  • Cơ chế: User đăng nhập -> Server ký tên vào một tờ vé (Token) có chứa thông tin cơ bản -> Gửi vé cho User. Server KHÔNG lưu gì cả.
  • Kiểm tra: Server chỉ cần nhìn chữ ký (Signature) trên vé. Nếu chữ ký đúng của mình -> Cho qua. Không cần check Database.
  • Ẩn dụ: Giống như Vé xem phim. Bạn cầm vé là vào được, nhân viên không cần biết bạn là ai, không cần tra danh sách.

2. Ưu & Nhược điểm "Chết người"

JWT (JSON Web Token)

✅ Ưu điểm❌ Nhược điểm chết người
Scalability: Không cần query Database mỗi request. Cực tốt cho Microservices.Cannot Revoke: Không thể thu hồi JWT tức thì. Nếu user bị hack token, hacker dùng được cho đến khi token hết hạn.
Cross-domain: Dễ dàng share login giữa a.comb.com.Size: Token chứa nhiều info -> Request Header nặng.

Session

✅ Ưu điểm❌ Nhược điểm chết người
Instant Revoke: User báo mất máy? Admin xóa Session trong DB -> Hacker bị đá ra ngay lập tức.Database Load: 1 triệu user online = 1 triệu query vào Redis/DB mỗi giây. Tốn tiền hạ tầng.
Small Size: Cookie chỉ chứa ID ngắn gọn.Sticky Session: Khó scale ngang (Horizontal Scaling) nếu không dùng Redis tập trung.

3. Case Study thực tế

🏦 Case 1: Ứng dụng Ngân hàng (Techcombank/VCB)

Lựa chọn: SESSION (Bắt buộc) Tại sao? Vì bảo mật là tối thượng. Nếu khách hàng báo mất thẻ, Ngân hàng phải có khả năng block truy cập ngay lập tức. JWT không làm được điều này (hoặc làm rất khó/tốn kém với Blacklist).

📱 Case 2: Mạng xã hội / App Chat (Facebook/Discord)

Lựa chọn: JWT Tại sao? Vì lượng request cực lớn (hàng tỷ/ngày). Nếu check DB session cho từng tin nhắn, Database sẽ nổ tung. Chấp nhận rủi ro nhỏ (token lọt lộ) để đổi lấy hiệu năng khổng lồ.

4. Lời khuyên của Senior

"Đừng cuồng JWT chỉ vì nó thời thượng".

  1. Start with Session: Với hầu hết dự án Start-up, Admin Dashboard, CMS -> Dùng Session (thông qua thư viện như Auth.js / NextAuth). Nó an toàn hơn, dễ quản lý hơn. Redis đủ rẻ để gánh vài triệu user.
  2. Move to JWT when: Bạn có Microservices, hoặc bạn phải phục vụ User trên Mobile App (nơi Cookie hoạt động kém ổn định hơn Header).

Kết luận

Không có "Cái nào tốt hơn". Chỉ có "Cái nào phù hợp hơn với bài toán của bạn".

  • Cần bảo mật tuyệt đối, thu hồi gấp? -> Session.
  • Cần chịu tải tỷ requests, API public? -> JWT.
Quảng cáo
mdhorizontal