Họ đang đo gì
Bạn có nhận ra đánh đổi thật không, hay tin rằng JWT “hiện đại hơn nên tốt hơn”.
Trả lời ngắn~30 giây
Session lưu ở server: thu hồi tức thì (xoá bản ghi), nhưng mỗi request cần một lần đọc kho phiên. JWT tự chứa: không cần đọc gì, xác minh bằng chữ ký — đổi lại bạn KHÔNG thu hồi được cho tới khi nó hết hạn. Cách xử lý phổ biến là access token sống rất ngắn (5–15 phút) cộng refresh token dài hạn có thể thu hồi. Đáng nói thẳng: khi đã có danh sách thu hồi refresh token thì bạn đã có trạng thái ở server, tức là đã quay lại session, chỉ khác chỗ tần suất kiểm tra.
Giải thích sâu
Lý do thật để chọn JWT không phải hiệu năng mà là ranh giới tin cậy: khi nhiều dịch vụ độc lập cần xác minh danh tính mà không gọi về một dịch vụ trung tâm, chữ ký cho phép mỗi bên tự kiểm tra. Với một monolith nói chuyện với một database, lợi ích đó bằng không và bạn chỉ nhận về phần khó của việc thu hồi.
Về cài đặt, hai lỗ hổng kinh điển đáng nhớ. Một là chấp nhận alg: none — token không có chữ ký nhưng thư viện vẫn coi là hợp lệ; phòng bằng cách chỉ định thuật toán cứng khi xác minh thay vì đọc từ header. Hai là nhầm lẫn giữa thuật toán đối xứng và bất đối xứng: kẻ tấn công lấy khoá công khai RSA rồi ký token bằng HMAC với chính khoá đó, và server nếu tin header sẽ xác minh thành công.
Chỗ lưu token cũng là một quyết định bảo mật riêng. localStorage bị XSS đọc được; cookie HttpOnly thì không, nên một XSS chỉ hành động được thay người dùng chứ không mang token đi nơi khác. Với cookie thì thêm SameSite=Lax và Secure. Nhiều người coi đây là chi tiết triển khai, nhưng nó quyết định hậu quả của một lỗ hổng khác — và đó chính là điều người phỏng vấn muốn nghe.
Câu hỏi tiếp theo họ sẽ hỏi
?Refresh token rotation là gì?
Mỗi lần dùng refresh token thì cấp một cái mới và vô hiệu cái cũ. Nếu một token cũ được dùng lại, bạn biết chắc nó đã bị đánh cắp (vì bản gốc lẽ ra đã bị thay) và có thể huỷ toàn bộ phiên. Đây là cách phát hiện trộm token mà không cần thiết bị nào khác.
?Đặt thông tin gì trong payload JWT?
Càng ít càng tốt, và không có gì bí mật — payload chỉ được base64 chứ không mã hoá, ai cũng đọc được. Đặt vai trò vào token nghe tiện nhưng có nghĩa là thay đổi quyền chỉ có hiệu lực sau khi token hết hạn.
Trả lời thế này là mất điểm
- Nói JWT “an toàn hơn session”. Không phải — nó có đánh đổi khác, và thu hồi là chỗ nó thua.
- Access token sống 30 ngày. Bị lộ là kẻ tấn công có 30 ngày và bạn không làm gì được.