繁體中文(香港)
  • token
  • oidc
  • refresh token
  • access token
  • ID token

理解在 OpenID Connect (OIDC) 協議中的存取權杖、更新權杖和 ID 權杖

OpenID Connect (OIDC) 協議已經成為身份管理的廣泛採用標準。但你是否真正理解這些權杖的角色和屬性呢?

Charles
Charles
Developer

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 權杖,驗證簽名和過期時間,以及範圍聲明以確保用戶端具有必要的許可權。

然而,你可能會想:如果我的客戶端應用程式在成功登入後可以獲得有效的存取權杖,並使用該權杖請求伺服器的 API,這不是已經足夠了嗎?為什麼我還需要其他權杖?

確實是一個合理的問題,讓我們一步步來解釋。

為什麼我們需要更新權杖?

雖然技術上講存取權杖滿足了使系統運行的最低要求,但由於安全考量,存取權杖的有效期通常非常短(通常是一小時)。所以想像一下,如果我們只有存取權杖,終端用戶必須在每次存取權杖過期後重新驗證。對於現代單頁網頁應用程式(SPAs)尤其是移動應用程式來說,頻繁地退出登入是一種相當痛苦的用戶體驗,即使我們只是在保護他們的用戶安全。

因此,我們需要權杖安全和用戶便利之間的平衡。這就是為什麼引入了更新權杖。

為什麼更新權杖可以擁有更長的壽命?

存取權杖用於訪問 API 資源,因此其短期性質有助於減少被洩露或損壞的風險。而另一方面,由於更新權杖僅用於交換新的存取權杖,使用的頻率不如存取權杖高,因此暴露的風險降低。因此,對於更新權杖來說,擁有更長的有效期被認為是可以接受的。

確保更新權杖的安全性

由於更新權杖也儲存在客戶端,因此確保其不被洩露是具有挑戰性的,特別是對於單頁網頁應用程式(SPA)和移動應用程式等公共客戶端。

在 Logto 中,更新權杖默認啟用了自動旋轉機制,這意味著授權伺服器在符合條件時將發出新的更新權杖:

  • 單頁應用程式:被認為是非傳送者約束客戶端,這些應用要求更新權杖旋轉。無法指定更新權杖的生存時間(TTL)。
  • 原生應用和傳統網頁應用:更新權杖旋轉本身被啟用,當達到其 TTL 的 70% 時會自動續期。了解更多

儘管你仍然可以在管理控制台的應用程式詳細資訊頁面上禁用更新權杖旋轉,但強烈建議保留此保護措施。

什麼是 ID 權杖及其重要性?

ID 權杖是 OIDC 的一個獨特功能,提供有關已身份驗證用戶的身份信息。

在訪問權杖用於訪問受保護資源且更新權杖用於獲取新存取權杖的情況下,ID 權杖通常用於在客戶端緩存用戶信息,減少需要向授權伺服器發出更多用戶數據請求的需求。在大多數情況下,甚至可以安全地說,擁有 ID 權杖相當於用戶已經驗證。

處理權杖的最佳實踐

  • 使用 HTTPS:始終使用 HTTPS 來保護客戶端和授權伺服器之間的通信。這樣可以防止未經授權的第三方攔截和偷取權杖。
  • 設置合適的權杖過期時間:存取權杖應有較短的使用壽命以最小化暴露風險。更新權杖可以有較長的有效期。
  • 啟用更新權杖旋轉:實施更新權杖旋轉以減輕更新權杖洩露的風險。
  • 使用細粒度訪問控制:使用細粒度的範圍來限制存取權杖的權限。只申請客戶端應用真正需要的權限。除非絕對必要,否則避免使用 "all" 或 "admin" 範圍來繞過大多數權限檢查。

回顧:OIDC 中存取權杖、更新權杖和 ID 權杖的關鍵區別

在 OIDC 協議中,更新權杖、存取權杖和 ID 權杖共同提供安全無縫的用戶身份驗證。

  • 存取權杖提供訪問受保護資源的授權。
  • 更新權杖消除了用戶獲取新存取權杖的介入。
  • ID 權杖在客戶端提供緩存的用戶信息,提升效能。

理解這些權杖的角色和重要性對於實施 OIDC 身份驗證的開發者來說至關重要。