JWT Token 完全指南:從原理到實作
什麼是 JWT?
JSON Web Token (JWT) 是一種開放標準(RFC 7519),用於在各方之間安全地傳輸資訊。JWT 由三個部分組成,以「.」分隔:Header(標頭)、Payload(負載)和 Signature(簽名)。
JWT 被廣泛應用於 Web 應用程式的身份驗證和資訊交換,是現代 API 認證的主流方案之一。
JWT 的結構
1. Header(標頭)
Header 通常包含兩個部分:Token 的類型(JWT)和使用的簽名演算法(如 HMAC SHA256 或 RSA)。
{
"alg": "HS256",
"typ": "JWT"
}
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload(負載)
Payload 包含聲明(Claims),即關於實體(通常是用戶)和其他數據的陳述。聲明分為三種類型:
- Registered Claims:預定義的聲明,如
iss(簽發者)、exp(過期時間)、sub(主題)、aud(受眾) - Public Claims:自定義的公開聲明
- Private Claims:自定義的私有聲明
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}
3. Signature(簽名)
簽名用於驗證消息的完整性和發送者的身份:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
JWT 的工作流程
- 用戶使用帳號密碼登入
- 伺服器驗證成功後,生成 JWT 並返回給客戶端
- 客戶端將 JWT 儲存(通常在 localStorage 或 Cookie 中)
- 後續請求在 Authorization Header 中攜帶 JWT
- 伺服器驗證 JWT 的有效性,處理請求
安全性最佳實踐
不要在 Payload 中存放敏感資訊
JWT 的 Payload 是 Base64 編碼的,任何人都可以解碼。因此不應在其中存放密碼、信用卡號等敏感資訊。
設定合理的過期時間
- Access Token:建議 15 分鐘到 1 小時
- Refresh Token:建議 7 天到 30 天
使用 HTTPS
JWT 在傳輸過程中應始終使用 HTTPS,防止中間人攻擊。
選擇適當的簽名演算法
- HS256:適用於單一伺服器場景,使用對稱密鑰
- RS256:適用於分散式系統,使用非對稱密鑰對
常見問題
JWT 和 Session 有什麼區別?
Session 將狀態儲存在伺服器端,JWT 將狀態儲存在客戶端。JWT 更適合分散式系統和微服務架構,因為不需要共享 Session 存儲。
JWT 可以被撤銷嗎?
JWT 一旦簽發,在過期之前都是有效的。要實現撤銷,需要維護一個黑名單(Blacklist),這在一定程度上違背了 JWT 的無狀態特性。
如何處理 JWT 過期?
常見做法是使用 Refresh Token 機制:當 Access Token 過期時,使用 Refresh Token 獲取新的 Access Token,無需用戶重新登入。
實用工具推薦
使用我們的 JWT 解碼器 [blocked] 可以快速解析和檢查 JWT Token 的內容,包括 Header、Payload 和過期時間,是開發除錯的好幫手。



