Opaque Token
Opaque Token(不透明權杖)通常只是一段隨機字串,通常使用安全的偽隨機數生成器生成,以確保其不可預測性和安全性,像亂數或 UUID。從內容推不出任何資訊。使用時,資源伺服器必須把這個 Token 拿去問issuer或IdP:這個 Token 是誰?還有效嗎?能做什麼?
與 JWT 的差異
主要區別在於這些權杖如何處理和驗證授權信息:
不透明權杖是一個不包含任何信息的隨機字串。伺服器必須查詢其後端資料庫以檢索與此權杖相關的任何授權數據。這使得不透明權杖完全依賴於授權伺服器進行驗證和解釋。
JWT 是一個包含所有資訊的 Token,內部攜帶了所有必要的訊息。
使用 JWT 時,Token 一發出去,除非等它過期(檢查 exp 欄位),否則很難即時作廢;而 Opaque Token 設計上需要請伺服器進行解碼,因此可以快速進行撤銷。
Client Resource Server Authorization Server
| | |
| ---- request --------> | |
| Bearer TOKEN | |
| | --- lookup TOKEN -------> |
| | |-- check state
| | | user
| | | scope
| | | expiry
| | <-- valid / invalid ----- |
| | |
| <--- response -------- | |
優缺點
優點很明確,集中於安全性與數據大小:
- 安全性:即使攔截了權杖,他們也無法提取任何有用的信息。
- 可撤銷:伺服器可以隨時立即使不透明權杖失效。
- 數據小:不透明權杖通常比 JWT 短得多。
- 好實作:生成一個隨機字串並將其與相關數據一起存儲。
缺點就是引入同步性與性能問題:
- 狀態性:在分散式系統中增加了額外的複雜性,因為權杖數據必須在多個伺服器之間同步。
- 性能問題:在高流量系統中,這些額外的資料庫或快取查詢可能會造成性能瓶頸。
- 操作性:在與第三方服務或不同授權伺服器合作時可能會造成整合問題,因為大家實作不透明權杖的機制未必相同。
| 特色 | JSON Web Token | Opaque Token |
|---|---|---|
| Token 語意 | 自帶語意(Self-contained) | 無語意,只是伺服器的內部索引 |
| 是否可讀 | 可 Base64 解碼看到內容 | 不可解讀,通常是隨機字串 |
| 伺服器端狀態 | 不需要 | 必須存在 |
| 驗證方式 | 金鑰驗證 | 查詢 |
| 是否需呼叫授權伺服器 | 不需要 | 需要 |
| 撤銷能力 | 弱,只能等過期 | 強,可即時失效 |
| Token 體積 | 較大 | 較小 |
| 單次請求效能 | 高 | 較低(多一次查詢) |
| 水平擴展難度 | 低 | 中(需共享狀態儲存) |
| 對授權伺服器依賴 | 低 | 高 |
| Token 洩漏風險 | 洩漏即暴露權限結構 | 洩漏僅是一把鑰匙,無資訊 |
| 適合場景 | 內部服務、高 QPS | 使用者登入、外部客戶、管理後台 |
| 常見生命週期 | 短 | 可短可長 |
| 常見儲存位置 | 無 | DB / Redis / Session Store |
| 信任邊界 | 邊界內 | 跨信任邊界 |