Cần một thứ phía server để phân biệt token phát trước và sau thời điểm thu hồi. Ba cách hay dùng:
1. Cột token_version trên user — đơn giản nhất. Access token mang claim ver; middleware so token.ver với user.token_version. Đăng xuất mọi thiết bị = update users set token_version = token_version + 1.
update users set token_version = token_version + 1 where id = $1;2. Mốc sessions_valid_from — lưu timestamp; token nào có iat < sessions_valid_from thì từ chối. Ưu điểm: không cần tăng version, chỉ cần now().
3. Bảng session/refresh token thật — mỗi thiết bị một hàng (kèm user agent, IP, lần dùng cuối). Cho phép hiển thị danh sách thiết bị và thu hồi từng cái, không phải tất cả. Đây là cách các sản phẩm lớn làm.
Cách 1 và 2 tốn thêm một lần đọc user cho mỗi request — thường cache Redis với TTL ngắn để giảm tải.
Đổi mật khẩu: theo OWASP, phải hủy toàn bộ phiên khác và cấp phiên mới cho chính thiết bị vừa đổi (không bắt user đang thao tác phải đăng nhập lại). Lý do: nếu tài khoản đã bị chiếm, đổi mật khẩu mà không cắt phiên thì kẻ tấn công vẫn còn nguyên quyền truy cập. Áp dụng tương tự cho reset password và cho việc tắt/bật 2FA.
Một lưu ý thực tế: access token vẫn sống tới exp nếu bạn không kiểm gì phía server — nên giữ access token ngắn (5–15 phút) để cửa sổ rủi ro nhỏ lại.