理解 OpenID Connect (OIDC) 協議中的存取權杖、刷新權杖和 ID 權杖
OpenID Connect (OIDC) 協議已成為身分管理的廣泛採用標準。但你真的了解這些權杖的角色和屬性嗎?
OIDC、OAuth 2.0 和權杖
OpenID Connect Protocol,亦稱 OIDC,已成為提供身分管理基本框架的廣泛採用標準。 它是一個構建於著名的 OAuth 2.0 protocol 之上的身份驗證層。雖然 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,這樣行不行?為什麼我需要其他的權杖呢?
確實,這是一個很好的問題,讓我們一步步解釋。
為什麼我們需要刷新權杖?
雖然技術上存取權杖確實滿足系統正常運行的最低要求,但由於安全性的考量,存取權杖的有效期通常非常短(通常為一小時)。所以想像一下如果我們只有存取權杖,終端用戶每次存取權杖過期都必須重新身份驗證。對於現代的單頁面 Web 應用(SPA)和特別是移動應用,頻繁地登出是一個相當痛苦的用戶體驗,即使我們只是試圖保護他們的用戶安全。
因此,我們需要在權杖安全性和用戶便利性之間取得平衡。這就是為什麼引入了刷新權杖。
為什麼刷新權杖可以擁有更長的壽命?
存取權杖用於訪問 API 資源,因此其短暫的本質有助於減少被洩露或受損的風險。另一方面,由於刷新權杖僅用於交換新的存取權杖,它們不像存取權杖那麼頻繁使用,因此暴露風險減少。因此,對於刷新權杖來說,擁有較長的有效期被認為是可以接受的。
確保刷新權杖的安全
由於刷新權杖也存儲在客戶端,特別是作為單頁面 Web 應用(SPA)和移動應用這樣的公開客戶端,保證其不被妥協具有挑戰性。
在 Logto 中,刷新權杖默認啟用了自動 旋轉機制,這意味著授權伺服器會在其符合標準的條件下發行新的刷新權杖:
- 單頁面應用:被識別為非發送者約束的客戶端,這些應用要求刷新權杖旋轉。刷新權杖的存活時間(TTL)不能被指定。
- 原生和傳統 Web 應用:刷新權杖旋轉固有地啟動,在達到其存活時間 70% 時自動更新。了解更 多
雖然你仍有選擇在管理控制台的應用詳情頁上禁用刷新權杖旋轉,但強烈建議保留這一保護措施。
什么是 ID 權杖,為什麼它很重要?
ID 權杖是 OIDC 的一個獨特功能,提供有關經認證的用戶的身份信息。
雖然存取權杖用於訪問受保護的資源,刷新權杖用於獲取新的存取權杖,但 ID 權杖通常用於在客戶端緩存用戶信息,減少向授權伺服器請求用戶數據的需求。在大多數情況下,甚至可以說擁有 ID 權杖就相當於用戶已經身份驗證。
處理權杖的最佳實踐
- 使用 HTTPS:始終使用 HTTPS 來保護客戶端與授權伺服器之間的通信。這樣可以防止未經授權的各方攔截和竊取權杖。
- 設置適當的權杖到期時間:存取權杖應具有短壽命,以最小化暴露風險。刷新權杖可以有更長的有效期。
- 啟用刷新權杖旋轉:實施刷新權杖旋轉以減輕刷新權杖洩露的風險。
- 使用精細的訪問控制:使用精細的範圍來限制存取權杖的權限。只請求客戶端應用所需的權限。除非絕對必要,避免使用“all”或“admin”範圍來繞過大多數權限檢查。
總結:OIDC 中存取權杖、刷新權杖和 ID 權杖的主要差異
在 OIDC 協議中,刷新權杖、存取權杖和 ID 權杖一同運作,以提供安全和無縫的用戶身份驗證。
- 存取權杖提供授權來訪問受保護的資源。
- 刷新權杖消除用戶介入申請新的存取權杖。
- ID 權杖在客戶端提供緩存用戶信息,提升性能。
理解這些權杖的角色和重要性對於在應用中實施 OIDC 認證的開發者至關重要。