Khác biệt gốc: session giữ trạng thái ở server (cookie chỉ mang session id, muốn thu hồi thì xoá bản ghi), còn JWT đẩy trạng thái vào token đã ký để mỗi service tự verify mà không gọi về auth service — đổi lại token đã phát thì không rút lại được trước hạn. Interviewer hỏi dạng này là chờ quyết định cho một hệ cụ thể kèm luồng vận hành. Trả lời bằng khung 3 câu hỏi:
1. Cần thu hồi tức thì không? (ban user, đổi mật khẩu phải logout mọi thiết bị ngay) → nghiêng session/stateful.
2. Bao nhiêu bên dùng token? Một web app cùng domain → session cookie là đủ; nhiều service/mobile/API cho bên thứ ba → JWT tiện vì mỗi service tự verify chữ ký, không gọi về auth service.
3. Đã có store chia sẻ chưa? Hệ đã chạy Redis sẵn → chi phí "stateful" gần bằng 0, bớt hẳn một lý do chọn JWT.
Áp vào hệ cụ thể:
- App ngân hàng / admin monolith → session cookie (httpOnly + Secure + SameSite): revoke tức thì là yêu cầu cứng, một domain nên dùng cookie là hợp lý.
- Hệ microservice + mobile app → JWT access 10–15 phút + refresh token, và phần "thu hồi" nằm ở refresh:
- Refresh lưu hash trong DB theo phiên/thiết bị → thu hồi được từng thiết bị; access ngắn nên khoảng "không thu hồi được" chỉ tối đa vài phút.
- Xoay vòng (rotation): mỗi lần refresh cấp token mới + vô hiệu cái cũ; refresh cũ bị dùng lại → coi là bị đánh cắp, thu hồi cả phiên.
- Logout = xoá bản ghi refresh + xoá cookie; cần ban khẩn cấp → thêm denylist jti hoặc token_version trên user.
Chốt: mô hình lai này lấy JWT cho tốc độ verify giữa các service, nhưng giữ quyền thu hồi ở phần stateful của refresh token — không phải "dùng JWT thì chịu, không logout được".