Hai cách giữ trạng thái đăng nhập, khác nhau ở chỗ state nằm đâu:
express-session (stateful, server-side)
- Server lưu dữ liệu session; client chỉ giữ một session id trong cookie.
- Cần một store (Redis/DB) để scale ngang nhiều instance — không nên để MemoryStore ở production.
- Server thu hồi tức thì được (xóa session) → logout/ban hiệu lực ngay.
JWT (stateless, self-contained)
- Token tự chứa claim + chữ ký; server chỉ verify chữ ký, không cần lưu gì → dễ scale, hợp kiến trúc nhiều service.
- Nhược điểm: khó thu hồi trước khi hết hạn → dùng token ngắn hạn + refresh token; payload chỉ base64 (đọc được) nên không đặt dữ liệu nhạy cảm.
Theo OWASP, mặc định ưu tiên session phía server vì kiểm soát vòng đời tốt hơn; chọn JWT khi thực sự cần stateless. Dù cách nào, cookie phải HttpOnly + Secure + SameSite.