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
操作步驟
- 開啟 JWT 解碼工具
- 貼上 JWT 字串
- 查看解碼後的 Header 和 Payload JSON
- 檢查過期時間、簽發者等欄位
常見 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 中的 alg 為 none,去掉 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 問題的步驟
- 解碼 JWT:使用 JWT 解碼工具 查看 Header 和 Payload
- 檢查 exp:Token 是否已過期?
- 檢查 alg:簽章演算法是否符合預期?
- 檢查 iss/aud:簽發者和受眾是否正確?
- 驗證簽章:使用 JWT 產生器 用相同密鑰重新簽章對比
- 檢查傳輸:Authorization 標頭格式是否為
Bearer <token>?
相關工具
- JWT 解碼 — 解析 Header 和 Payload
- JWT 產生器 — 自訂產生 JWT 用於測試
- HMAC 計算 — 理解 HMAC 簽章原理
- Base64 編解碼 — JWT 使用的編碼方式
總結
JWT 是現代 API 認證的基石,但其 Base64 編碼而非加密的特性帶來了獨特的安全挑戰。理解 JWT 的結構、簽章機制和常見漏洞,是每一個全端開發者的必備知識。工具庫的 JWT 解碼工具讓你可以快速排查認證問題,但請記住——解碼不等於驗證,生產環境必須在伺服器端驗證簽章。
#JWT#认证#安全#OAuth#API