[Lv1] JWT 的結構是什麼?
面試官常會接著問:「JWT 長什麼樣子?為什麼要這樣設計?」搞清楚結構、編碼方式與驗證流程,就能快速回答。
1. 基本輪廓
JWT(JSON Web Token)是一種 自包含(self-contained) 的 Token 格式,用來在雙方之間安全地傳遞資訊。內容由三段字串構成,使用 . 串接:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
拆開來看就是三個 Base64URL 編碼的 JSON:
- Header:描述 Token 使用的演算法、類型。
- Payload:存放使用者資訊與宣告(claims)。
- Signature:用密鑰簽章,確保內容未被竄改。
2. Header、Payload、Signature 詳解
2.1 Header(標頭)
{
"alg": "HS256",
"typ": "JWT"
}
alg:簽章演算法,例如HS256(HMAC + SHA-256)、RS256(RSA + SHA-256)。typ:Token 類型,通常為JWT。
2.2 Payload(載荷)
{
"sub": "1234567890",
"name": "Jane Doe",
"iat": 1516239022,
"exp": 1516242622,
"role": "admin"
}
- Registered Claims(官方保留,但非必填):
iss(Issuer ):簽發者sub(Subject):主題(通常是使用者 ID)aud(Audience):接收對象exp(Expiration Time):到期時間(Unix timestamp,秒)nbf(Not Before):在此時間前無效iat(Issued At):簽發時間jti(JWT ID):Token 唯一識別碼
- Public / Private Claims:可加入自訂欄位(例如
role、permissions),但要避免過度冗長。
2.3 Signature(簽章)
簽章生成流程:
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
- 使用密鑰(
secret或私鑰)對前兩段進行簽名。 - 伺服器收到 Token 後重新計算簽章,如果一致,代表 Token 未被竄改且確實由合法來源簽發。
注意:JWT 只保證資料完整性(Integrity),不保證機密性(Confidentiality),除非額外加密。
3. Base64URL 編碼是什麼?
JWT 使用 Base64URL 而非 Base64,差異在於:
- 把
+改成-,/改成_。 - 移除結尾
=。
這樣做的好處是 Token 可以安全地放在 URL、Cookie 或 Header 中,不會因為特殊字元造成問題。
4. 驗證流程簡圖
- 客戶端在 Header 帶入
Authorization: Bearer <JWT>。 - 伺服器收到後:
- 解析 Header、Payload。
- 取得
alg指定的演算法。 - 使用共享密鑰或公開金鑰重新計算簽章。
- 比對簽章是否一致,並檢查
exp、nbf等時間欄位。
- 驗證通過後才能信任 Payload 內容。
5. 面試回答框架
「JWT 由 Header、Payload、Signature 三段組成,用
.串接。
Header 描述演算法與類型;Payload 存放使用者資訊與一些標準欄位,例如iss、sub、exp;Signature 則是用密鑰對前兩段簽名,用來確認內容沒有被改動過。
內容是 Base64URL 編碼的 JSON,但並沒有加密,只是轉碼,所以敏感資料不能直接塞進去。伺服器拿到 Token 後會重新計算簽章比對,如果一致且沒過期,就代表 Token 有效。 」
6. 面試延伸提醒
- 安全性:Payload 可被解碼,請勿放密碼、信用卡等敏感資訊。
- 到期與更新:通常會搭配短效 Access Token + 長效 Refresh Token。
- 簽章演算法:可提到對稱式(HMAC)與非對稱式(RSA、ECDSA)的差別。
- 為什麼不能無限長?:Token 太大會增加網路傳輸成本,也可能被瀏覽器拒絕。