繁體中文(台灣)
  • 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,這不是已經足夠了嗎?為什麼還需要其他權杖?

確實是一個有效的問題,讓我們一步步解釋。

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

雖然從技術上講,存取權杖確實滿足了系統運作的最低要求,但由於安全問題,存取權杖的有效期通常非常短(通常為一小時)。因此,想像一下如果只有存取權杖,最終用戶每次存取權杖過期時都需要重新驗證。對於現代單頁應用程式 (SPA) 尤其是移動應用程式來說,頻繁登出是一種相當痛苦的用戶體驗,儘管我們只是試圖保護他們的用戶安全。

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

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

存取權杖用於存取 API 資源,因此其短暫性質有助於減輕洩露或受損的風險。另一方面,由於更新權杖僅用來兌換新的存取權杖,使用頻率比存取權杖低,從而降低了暴露風險。因此,對於更新權杖而言,擁有更長的有效期被認為是可以接受的。

確保更新權杖的安全性

由於更新權杖也存儲在用戶端,確保其不被洩露是具挑戰性的,尤其是對於單頁應用程式 (SPA) 和移動應用這些公共用戶端。

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

  • 單頁應用程式:被視為非發送者約束的用戶端,這些應用程式強制進行更新權杖旋轉。無法指定更新權杖的存活時間 (TTL)。
  • 原生應用和傳統網頁應用:更新權杖旋轉本質上是啟用的,當其達到 TTL 的70%時自動更新。了解更多 Logto 中的更新權杖旋轉

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

什麼是 ID 權杖,為什麼它很重要?

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

在使用存取權杖存取受保護的資源和使用更新權杖獲取新的存取權杖的情況下,ID 權杖通常用於在用戶端緩存用戶信息,減少向授權伺服器查詢用戶數據的次數。在大多數情況下,甚至可以說,有了 ID 權杖,就相當於用戶已被驗證。

權杖處理的最佳實踐

  • 使用 HTTPS:始終使用 HTTPS 來確保用戶端與授權伺服器之間的通信安全。這樣可以防止未經授權的方攔截和盜取權杖。
  • 設置適當的權杖過期時間:存取權杖應該有短的有效期以最小化暴露風險。更新權杖可以有更長的有效期。
  • 啟用更新權杖旋轉:實施更新權杖旋轉以減少更新權杖洩露的風險。
  • 使用細粒度的存取控制:使用細粒度的範圍來限制存取權杖的權限。只請求用戶端應用程式所需的權限。除非絕對必要,否則避免使用 "all" 或 "admin" 範圍來繞過大多數權限檢查。

總結:OIDC 中存取權杖、更新權杖和 ID 權杖的主要區別

在 OIDC 協議中,更新權杖、存取權杖和 ID 權杖一起工作以提供安全且無縫的用戶驗證。

  • 存取權杖提供訪問受保護資源的授權。
  • 更新權杖消除了用戶干預獲取新存取權杖的需要。
  • ID 權杖在用戶端提供緩存的用戶信息,增強性能。

了解這些權杖的角色和重要性對於開發者實施 OIDC 驗證在其應用程式中至關重要。