跳至主要内容

Opaque Token

Opaque Token(不透明權杖)通常只是一段隨機字串,通常使用安全的偽隨機數生成器生成,以確保其不可預測性和安全性,像亂數或 UUID。從內容推不出任何資訊。使用時,資源伺服器必須把這個 Token 拿去問issuerIdP:這個 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 TokenOpaque Token
Token 語意自帶語意(Self-contained)無語意,只是伺服器的內部索引
是否可讀可 Base64 解碼看到內容不可解讀,通常是隨機字串
伺服器端狀態不需要必須存在
驗證方式金鑰驗證查詢
是否需呼叫授權伺服器不需要需要
撤銷能力弱,只能等過期強,可即時失效
Token 體積較大較小
單次請求效能較低(多一次查詢)
水平擴展難度中(需共享狀態儲存)
對授權伺服器依賴
Token 洩漏風險洩漏即暴露權限結構洩漏僅是一把鑰匙,無資訊
適合場景內部服務、高 QPS使用者登入、外部客戶、管理後台
常見生命週期可短可長
常見儲存位置DB / Redis / Session Store
信任邊界邊界內跨信任邊界