JWT 安全完全指南:解碼、驗證與常見漏洞防範

實用工具(更新於 2026年5月1日)

JWT 是什麼?

JWT(JSON Web Token)是一種開放標準(RFC 7519),用於在各方之間安全地傳輸資訊。它是目前最流行的 API 認證方案,被 OAuth 2.0、OpenID Connect 廣泛採用。

JWT 的結構

一個 JWT 由三部分組成,用 . 分隔:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│        Header        │.│         Payload        │.│        Signature        │
部分 內容 編碼方式
Header 演算法 + 類型 Base64URL
Payload 宣告(claims) Base64URL
Signature 簽章 演算法(Header + Payload, Secret)

⚠️ Header 和 Payload 只是 Base64URL 編碼,不是加密。任何人都可以解碼查看內容。


使用工具庫解碼 JWT

操作步驟

  1. 開啟 JWT 解碼工具
  2. 貼上 JWT 字串
  3. 查看解碼後的 Header 和 Payload JSON
  4. 檢查過期時間、簽發者等欄位

常見 Payload 欄位

欄位 含義 範例
sub 主題(使用者 ID) "user_12345"
iss 簽發者 "https://auth.example.com"
aud 受眾 "api.example.com"
exp 過期時間(Unix 秒) 1717200000
iat 簽發時間 1717196400
nbf 生效時間 1717196400
jti JWT ID(唯一識別碼) "a1b2c3d4"

JWT 簽章演算法

演算法 類型 安全性 使用情境
HS256 對稱 單一服務、內部 API
HS384/HS512 對稱 中高 高安全要求
RS256 非對稱 多服務、OAuth
ES256 非對稱 行動端、IoT
none 無簽章 ❌ 危險 絕不應使用

對稱 vs 非對稱

HS256(對稱):
  簽章: HMAC-SHA256(header.payload, shared_secret)
  驗證: 同一個 shared_secret
  問題: 所有服務共享密鑰,洩漏影響全部

RS256(非對稱):
  簽章: RSA-SHA256(header.payload, private_key)
  驗證: RSA-SHA256(header.payload, public_key)
  優勢: 公鑰可以公開分發,私鑰僅簽發方持有

常見安全漏洞

1. alg: none 攻擊

攻擊者修改 Header 中的 algnone,去掉 Signature 部分:

// 原始 Header
{"alg": "HS256", "typ": "JWT"}

// 攻擊修改
{"alg": "none", "typ": "JWT"}

防禦:伺服器端必須白名單允許的演算法,拒絕 none

2. 密鑰混淆攻擊

RS256 改為 HS256,使用公鑰作為 HMAC 密鑰:

攻擊者取得公鑰 → 修改 alg 為 HS256 → 用公鑰簽章 → 伺服器用公鑰驗證 HMAC → 通過

防禦:嚴格校驗 Header 中的 alg 與預期一致。

3. 敏感資訊洩漏

因為 Payload 只是 Base64 編碼,絕不應在 JWT 中儲存

  • ❌ 密碼、信用卡號
  • ❌ 個人隱私資訊
  • ✅ 使用者 ID、角色、權限

4. 過期時間設定不當

// ❌ 無過期時間 — Token 永久有效
{"sub": "user_123"}

// ❌ 過期時間過長 — 洩漏後長期有效
{"sub": "user_123", "exp": 1893456000}  // 2030年

// ✅ 合理過期 + 重新整理機制
{"sub": "user_123", "exp": 1717200000}   // 15-60 分鐘

JWT 最佳實踐

1. 使用短期 Access Token + Refresh Token

Access Token:  15-60 分鐘過期,用於 API 呼叫
Refresh Token: 7-30 天過期,用於取得新的 Access Token

2. 儲存位置

儲存方式 XSS 風險 CSRF 風險 推薦
localStorage
sessionStorage
HttpOnly Cookie ⚠️ 需 CSRF 防護
記憶體變數 ✅ SPA 推薦

3. 驗證清單

伺服器端驗證 JWT 時必須檢查:

  • 簽章是否有效
  • exp 是否過期
  • nbf 是否已生效
  • iss 是否為預期的簽發者
  • aud 是否包含目前服務
  • alg 是否在白名單中

除錯 JWT 問題的步驟

  1. 解碼 JWT:使用 JWT 解碼工具 查看 Header 和 Payload
  2. 檢查 exp:Token 是否已過期?
  3. 檢查 alg:簽章演算法是否符合預期?
  4. 檢查 iss/aud:簽發者和受眾是否正確?
  5. 驗證簽章:使用 JWT 產生器 用相同密鑰重新簽章對比
  6. 檢查傳輸:Authorization 標頭格式是否為 Bearer <token>

相關工具


總結

JWT 是現代 API 認證的基石,但其 Base64 編碼而非加密的特性帶來了獨特的安全挑戰。理解 JWT 的結構、簽章機制和常見漏洞,是每一個全端開發者的必備知識。工具庫的 JWT 解碼工具讓你可以快速排查認證問題,但請記住——解碼不等於驗證,生產環境必須在伺服器端驗證簽章

#JWT#认证#安全#OAuth#API