Vấn đề: JWT tự chứa chữ ký, server không lưu → không có "công tắc" tắt token còn hạn. Vài cách:
- Access TTL ngắn + refresh token: cho access sống rất ngắn (5–15 phút); logout = xóa/thu hồi refresh token phía server. Access cũ vẫn dùng được tối đa vài phút rồi tự chết. Đây là cách phổ biến nhất, cân bằng giữa stateless và khả năng thu hồi.
- Blacklist / denylist: lưu jti (id token) đã thu hồi vào Redis với TTL = thời gian còn lại của token; mỗi request check denylist. Thu hồi tức thì nhưng đánh đổi tính stateless (lại phải tra store).
- Token version / "not before": lưu
token_versiontrên user; đổi mật khẩu hay "logout mọi thiết bị" thì tăng version → mọi token cũ có version thấp hơn bị từ chối. - Rotation: xoay refresh mỗi lần dùng + phát hiện reuse để thu hồi cả family.
Chọn: cần thu hồi tức thì (ban user, đổi pass) → denylist hoặc token-version; chấp nhận trễ vài phút → chỉ cần TTL ngắn + refresh. Bẫy: đặt TTL access quá dài rồi mới nhận ra "không logout được".