Token Revocation & Logout
Token Revocation 指的是在 Token 尚未自然過期之前,使其提前失效的能力。
觸發時機
- 使用者主動登出
- 權限或角色發生變更
- 偵測到異常行為或風險事件
- 系統進行安全事件回應
- 管理者主動停用帳號或租戶
對於 Opaque Token 而言,撤銷是一個直接操作:只要將對應的伺服器端狀態標記為失效或刪除,後續請求即會被拒絕。
但是對於 JWT,撤銷 Token 是一個特別的議題:由於 JWT 是自帶語意且可離線驗證的憑證,一旦簽發,就無法單方面使其失效。
實務上只能透過縮短有效期限、建立黑名單、或在關鍵節點重新驗證來降低風險,但這些手段都屬於補償機制,而非真正的撤銷。
黑名單
- 當用戶登出或權限被取消時,將該 Token 的唯一識別碼(
jti)存入一個快速查詢的資料庫(如 Redis)。 - 資源伺服器拿到 Token,先驗證簽章與時間(基本校驗)。
- 去 Redis 查一下這個
jti是否在黑名單中。
但是這樣就沒有使用 JWT 的特性了,頂多是把解碼流程分散到各個伺服器節點上。
金鑰滾動與版本號
- 在 Token 的 Payload 放入一個
version: 1。並在用戶資料庫登記current_version: 2。如果 Token 版本小於資料庫版本,則拒絕。 - 如果發現大規模洩漏,直接更換簽署用的私鑰。這會導致所有舊私鑰簽發的 Token 立即集體失效。
| 機制 | 撤銷速度 | 系統負擔 | 適用場景 |
|---|---|---|---|
| Blacklisting | 立即 | 中 (需查 Redis) | 處理用戶主動登出 |
| Session Check | 立即 | 高 (頻繁查 DB) | 金融交易、高敏感操作 |
| Version/Key | 立即 | 低 | 密碼變更、大規模安全事件 |