了解 OpenID Connect (OIDC) 協議中的訪問令牌、刷新令牌和 ID 令牌
OpenID Connect (OIDC) 協議已成為身份管理中的廣泛採用標準。但你是否真正了解這些令牌的角色和屬性?
OIDC、OAuth 2.0 以及令牌
OpenID Connect 協議,又稱 OIDC,已成為提供身份管理基本框架的廣泛採用標準。 它是在著名的 OAuth 2.0 協議 基礎上構建的身份驗證層。雖然 OAuth 2.0 僅用於資源授權,但 OIDC 是標準化和加強客戶端身份驗證的協議,並引入了新的 ID 令牌。
等等... 在 OAuth 時代你可能聽過訪問令牌和刷新令牌,而現在在 OIDC 中又出現了新的概念?你真的了解這些令牌之間的區別嗎?
OIDC 中的訪問令牌、刷新令牌和 ID 令牌是什麼?
讓我們從一個實際場景開始。
假設你正在開發一個典型的客戶端-服務器應用程式,並且它們通過 RESTful API 相互通信。你希望將大多數 API 保持為私有,僅允許授權的客戶端訪問。你將需要一種機制來驗證客戶端並授權對服務器的 API 請求。
理想情況下,你的 RESTful API 應該是無狀態的,這意味着服務器不應該存儲任何客戶端會話信息。每當有有效請求進來時,服務器應直接以請求的數據響應。這時候令牌就派上用場了。因此,在這種情況下你應該使用哪種類型的令牌呢?
訪問令牌用於保護你的 API
在 OAuth 2.0 和 OIDC 中,每個受保護的 API 被視為資源。訪問令牌是客戶端在請求 API 資源時傳輸給服務器的令牌,通常通過請求標頭並以 JWT 格式傳輸。
在服務器端,當有請求進來時,服務器只需要驗證是否攜帶了一個有效的訪問令牌。驗證過程通常包括解碼 JWT 令牌、驗證簽名和過期時間,以及 scope 聲明,以確保客戶端擁有必要的權限。
然而,你可能會想:如果我的客戶端應用程式在成功登錄後可以擁有一個有效的訪問令牌,並使用該訪問令牌請求服務器 API,這難道不夠嗎?為什麼我還需要其他令牌?
這確實是一個合理的問題,讓我們一步一步解釋。
為什麼我們需要刷新令牌?
雖然從技術上講,訪問令牌確實滿足系統運行的最低要求,但是由於安全問題,訪問令牌的有效期通常非常短(通常為一小時)。所以想像一下如果我們只有訪問令牌,最終用戶在訪問令牌過期後每次都必須重新驗證。對於現代單頁 Web 應用程式 (SPA) 和特別是移動應用程式,頻繁登出是一個相當痛苦的用戶體驗,即使我們只是嘗試保護他們的用戶安全。
因此,我們需要在令牌安全性和用戶便利性之間尋找平衡。這就是為什麼引入刷新令牌的原因。
為什麼刷新令牌可以擁有較長的壽命?
訪問令牌用於訪問 API 資源,因此其短期性有助於減少被洩露或妥協的風險。另一方面,由於刷新令牌僅用於交換新的訪問令牌,使用頻率遠低於訪問令牌,因此暴露風險減少。因此,對於刷新令牌,擁有較長的有效期被認為是可以接受的。
確保刷新令牌的安全性
由於刷新令牌也存儲在客戶端,確保其不被妥協是一個挑戰,特別是對於單頁 Web 應用程式 (SPA) 和移動應用等公開客戶端。
在 Logto 中,刷新令牌默認啟用了自動旋轉機制,這意味着當滿足特定條件時,授權服務器會發出新的刷新令牌:
- 單頁應用程式:被識別為非寄送方約束的客戶端,這些應用程式須啟用刷新令牌旋轉。不能指定刷新令牌的生存時間 (TTL)。
- 原生應用和傳統 Web 應用:刷新令牌旋轉 固有啟用,當達到其 TTL 的 70% 時自動更新。了解更多關於在 Logto 中的刷新令牌旋轉
儘管你仍可以在管理控制台的應用詳細信息頁面中選擇禁用刷新令牌旋轉,但強烈建議保留此保護措施。
什麼是 ID 令牌,為什麼它很重要?
ID 令牌是 OIDC 的獨特特徵,提供了有關已驗證用戶的身份信息。
當訪問令牌用於訪問受保護的資源,刷新令牌用於獲取新的訪問令牌時,ID 令牌通常用於在客戶端緩存用戶信息,減少向授權服務器請求用戶數據的需求。在大多數情況下,甚至可以安全地說擁有 ID 令牌等同於用戶已通過驗證。
處理令牌的最佳實踐
- 使用 HTTPS:始終使用 HTTPS 來保護客戶端與授權服務器之間的通信。這防止未經授權的第三方攔截和竊取令牌。
- 設置適當的令牌有效期:訪問令牌應有一個短的壽命以最大限度地減少暴露風險。刷新令牌可有較長的有效期。
- 啟用刷新令牌旋轉:實施刷新令牌旋轉以緩解刷新令牌洩漏的風險。
- 使用精細的訪問控制:使用精細的範圍來限制訪問令牌的權限。只請求客戶端應用程式所需的權限。除非絕對必要,否則避免使用 "all" 或 "admin" 範圍來繞過大多數權限檢查。
回顧:OIDC 中訪問令牌、刷新令牌和 ID 令牌的關鍵差異
在 OIDC 協議中,刷新令牌、訪問令牌和 ID 令牌一起合作提供安全和無縫的用戶身份驗證。
- 訪問令牌提供訪問受保護資源的授權。
- 刷新令牌消除了用戶干預以獲取新的訪問令牌。
- ID 令牌在客戶端提供緩存用戶信息,提高性能。
理解這些令牌的角色及其重要性對於在應用程式中實施 OIDC 身份驗證的開發者至關重要。