什麼是 JWT 解碼?
JWT 解碼是將 JWT Token 分解為其組成部分(Header、Payload、Signature)並顯示其內容的過程。解碼不需要金鑰,因為 JWT 的 Header 和 Payload 部分只是 Base64 編碼的 JSON 資料。
JWT 結構解析
Header(頭部):包含令牌型別(typ)和簽名演算法(alg)資訊
Payload(載荷):包含宣告(claims),如使用者資訊、過期時間等
Signature(簽名):用於驗證令牌的完整性,需要金鑰才能驗證
JWT 主要使用場景
- 身份認證:使用者登入後,伺服器生成 JWT 返回給客戶端,後續請求攜帶此令牌進行身份驗證
- 資訊交換:在不同服務之間安全地傳輸資訊,因為 JWT 可以被簽名驗證
- 單點登入(SSO):使用者在一個應用中登入後,可以訪問其他相關應用而無需重新登入
- API 授權:為 RESTful API 提供無狀態的授權機制
- 移動應用認證:移動應用與後端服務的安全通訊
- 微服務架構:在微服務之間傳遞使用者身份和許可權資訊
常用 JWT 演算法詳解
對稱加密演算法(HMAC)
- HS256(HMAC-SHA256):最常用的演算法,使用共享金鑰進行簽名和驗證
- HS384(HMAC-SHA384):更強的雜湊演算法,提供更高的安全性
- HS512(HMAC-SHA512):最強的 HMAC 演算法,適用於高安全要求場景
非對稱加密演算法(RSA)
- RS256(RSA-SHA256):使用 RSA 私鑰簽名,公鑰驗證,適合分散式系統
- RS384(RSA-SHA384):更強的 RSA 簽名演算法
- RS512(RSA-SHA512):最強的 RSA 簽名演算法
橢圓曲線演算法(ECDSA)
- ES256(ECDSA-SHA256):使用橢圓曲線數字簽名,效能優於 RSA
- ES384(ECDSA-SHA384):更強的橢圓曲線簽名演算法
- ES512(ECDSA-SHA512):最強的橢圓曲線簽名演算法
常見的 Payload 欄位
- iss(Issuer):令牌頒發者
- sub(Subject):令牌主題,通常是使用者ID
- aud(Audience):令牌接收者
- exp(Expiration):令牌過期時間
- iat(Issued At):令牌頒發時間
- nbf(Not Before):令牌生效時間
- jti(JWT ID):JWT 的唯一識別符號
JWT 安全最佳實踐
- 使用強金鑰:HMAC 演算法至少使用 256 位金鑰,RSA 至少使用 2048 位金鑰
- 設定合理的過期時間:避免令牌長期有效,建議訪問令牌 15-30 分鐘過期
- 使用 HTTPS:始終通過 HTTPS 傳輸 JWT,防止中間人攻擊
- 驗證所有宣告:檢查 iss、aud、exp 等關鍵欄位
- 實施令牌撤銷機制:維護黑名單或使用短期令牌配合重新整理令牌
- 避免儲存敏感資訊:JWT 內容可被解碼,不要儲存密碼、個人敏感資訊
- 使用適當的演算法:生產環境避免使用 "none" 演算法
- 定期輪換金鑰:定期更換籤名金鑰以降低洩露風險
安全注意事項
- JWT 的 Header 和 Payload 部分是 Base64 編碼的,任何人都可以解碼檢視
- 不要在 JWT 中儲存敏感資訊,如密碼、信用卡號等
- 解碼 JWT 不等於驗證 JWT,驗證需要金鑰
- 始終檢查 JWT 的過期時間和其他重要欄位
- 防範演算法混淆攻擊:嚴格驗證演算法型別
- 注意時鐘偏移:在驗證時間宣告時考慮伺服器時鐘差異
實際應用案例
Web 應用身份認證
使用者登入後,伺服器生成包含使用者 ID 和許可權的 JWT,前端儲存在 localStorage 或 sessionStorage 中,後續 API 請求在 Authorization 頭中攜帶此令牌。
微服務間通訊
API 閘道器驗證使用者身份後,生成包含使用者資訊的 JWT 傳遞給下游服務,各服務無需再次驗證使用者身份,只需驗證 JWT 簽名。
移動應用 API 訪問
移動應用通過使用者名稱密碼獲取 JWT,後續 API 呼叫攜帶此令牌,伺服器驗證令牌有效性和許可權。
權威資訊來源