我想構建一個使用 JWT 和使用 RS256 生成的簽名的身份驗證服務。在單服務器解決方案中,實作相當簡單。但是,當涉及到使其成為多節點時,有兩個相關的問題我沒有找到明確的答案:
在集群解決方案中,每個服務器應該使用自己的密鑰對還是共享密鑰對可以被多個節點使用?在那種情況下,如何有效地構建一個不包含太多鍵的 JWK?
另一方面,如果可以在不引起重大安全問題的情況下共享私鑰,那么共享密鑰和管理其輪換的最佳方法是什么?
uj5u.com熱心網友回復:
如果可能 (IMO),您應該使用單個私鑰來簽署訪問令牌。
擁有多個只會增加復雜性(例如,后端資源服務器需要邏輯來計算出用于 JWT 驗證的公鑰,或者回圈使用多個公鑰來驗證 JWT),我真的看不到任何安全優勢.
FWIW 可能有業務原因需要在后端支持多個,例如,如果您的公司有多個產品具有單獨的身份驗證租戶/登錄域,您可能需要在共享后端服務/功能中支持多個密鑰 - 對于在這種情況下,您需要使用諸如令牌頒發者 ( iss) 宣告之類的東西來確定用于 JWT 驗證的公鑰。
WRT旋轉鑰匙;如果您使用的是像 Auth0 這樣的 PaaS IDP,它可能會為您處理。如果您使用的是像 Keycloak 這樣的 COTS 產品(或者如果您已經推出了自己的 IDP),您將需要在 JWKS 端點中定義多個公鑰(盡管是暫時的)。新密鑰將被指定為“主動”并用于對所有后續令牌進行簽名,而舊密鑰將被指定為“被動”并且僅需要驗證輪換之前發布且尚未發布的訪問令牌已到期。注意:一旦使用舊密鑰簽署的所有訪問令牌都過期,您可能可以停用/洗掉舊密鑰。
這是有關可能有用的輪換密鑰的 Keycloak 檔案的鏈接。
在您進行 JWT 驗證的后端服務中,kid應快取與 JWT 上的密鑰 ID ( ) 宣告相對應的公鑰。如果使用新的私鑰對請求進行簽名,則 JWT 應具有不同的密鑰 ID。如果后端服務遇到新的密鑰 ID,它應該懶洋洋地回傳 JWKS 端點以獲取與新密鑰 ID 關聯的公鑰(然后也應該快取)。
在大多數常見的編程語言中,有一些庫可以為您處理大部分作業,例如我已經使用 Microsoft.AspNetCore.Authentication 包在 .NET Core 中完成了 JWT 驗證,我需要做的就是配置一個 Open ID matadata 端點(它參考了JWKS 端點)以及諸如密鑰輪換和快取之類的事情都是透明處理的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349448.html
