🎫 JWT 令牌完全理解
📖 定義
JWT(JSON Web Token)是用於在客戶端和伺服器之間安全傳輸資訊的基於JSON的令牌。由三部分(Header、Payload、Signature)組成,由伺服器頒發,客戶端在請求時一起發送進行認證處理。與會話不同,不在伺服器儲存狀態(stateless),因此擴展性優秀。
🎯 用類比理解
遊樂園門票
將JWT比作遊樂園門票:
普通門票(會話方式)
├─ 入場時獲得手環
├─ 每次乘坐時工作人員檢查手環
└─ 工作人員需要記住所有訪客(伺服器負擔)
VIP門票(JWT方式)
├─ 入場時獲得防偽印章的門票
├─ 門票上記錄姓名、有效期、等級
├─ 每次乘坐只需出示門票
└─ 工作人員只檢查印章(伺服器負擔小)
JWT = 帶有防偽印章的資訊卡
⚙️ 工作原理
1. JWT結構
JWT = Header.Payload.Signature
例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywidXNlcm5hbWUiOiJraW0ifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│ │ │
Header (標頭) Payload (有效載荷) Signature (簽章)
Header (標頭)
{
"alg": "HS256", // 簽章演算法
"typ": "JWT" // 令牌類型
}
// Base64編碼
Payload (有效載荷) - 實際資料
{
"userId": 123,
"username": "kim",
"email": "kim@example.com",
"role": "admin",
"iat": 1640000000, // Issued At (頒發時間)
"exp": 1640086400 // Expiration (過期時間)
}
// Base64編碼
Signature (簽章) - 防止偽造
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret // 金鑰(只有伺服器知道)
)
2. JWT認證流程
1. 登入
客戶端 → 伺服器: username, password
伺服器: 認證成功 → 產生JWT並返回
2. 請求時包含JWT
客戶端 → 伺服器: Authorization: Bearer <JWT>
3. 伺服器驗證JWT
- 驗證簽章(是否偽造)
- 驗證過期時間
- 從Payload提取使用者資訊
4. 回應
伺服器 → 客戶端: 請求的資料