什麼是 JWT?
JWT 也就是 JSON Web Token,一個基於 RFC 7519 的標準,可用於在兩個實體(如前端和後端)間進行 JSON 物件的傳輸。由 header
、payload
、signature
三種資料所構成,透過 .
來區隔並使用 Base64 編碼以便傳輸。
header.payload.signature
JWT.io Debugger 是個不錯的平台透過線上範例了解 JWT。

header
包含有關令牌類型以及用於保護其內容的加密演算法的元資料。
{ "alg": "HS256", "typ": "JWT"}
payload
包含可驗證的安全性聲明,例如使用者身分及其允許的權限。存在三種類型的聲明 (Claim)。雖然 JWT 可以傳輸完全自訂的資料(私有聲明),但還是可以透過使用「已被標準化定義的欄位」來表示某些資料意含。
- 已註冊聲明:預設非強制性但建議添加的資訊。
- 公開聲明:可參考 IANA JSON Web Token Registry。
- 私有聲明:自定義內容。
{ "sub": "1234567890", "name": "John Doe", "admin": true}
signature
用於驗證令牌是否可信任且未被竄改。透過 Base64 編碼後的 header、payload 與 secret 執行 header 標示的演算法生成。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT 實做方式
JWT 有許多「實做方式」,不過本篇文章著重 JWS。
- RFC 7515 - JSON Web Signature(JWS)
- RFC 7516 - JSON Web Encryption(JWE)
- RFC 7517 - JSON Web Key(JWK)
- RFC 7518 - JSON Web Algorithms(JWA)
- RFC 7519 - JSON Web Token(JWT)
JWT 做了什麼事?
在生成 JWT 時,根據 signature 使用的演算法會有所不同,不過最常見是使用「非對稱加密」來確保客戶端的資料沒有被竄改,生成時會透過私鑰搭配演算法計算出 signature,只要 JWT 有任何資料竄改都會造成後續驗證有效性不吻合,進而確保資料的完整性。
從上面案例可以發現,重點在於確保資料的「完整性」而非「機密性」,因此還是要留意 payload 的資訊是完全公開的。
JWT 解決什麼問題?
基於 HTTP 無狀態性,通常會需要將用戶資訊存儲在伺服器中,傳統的 Session-based 認證都需要透過 session id 找到對應資料,這對於「多伺服器」或「無狀態 API」非常不利。
使用者登入後,伺服器產生一組 JWT,裡面包含用戶 ID、權限等資訊,直接給用戶保存,往後請求只要附上 JWT,伺服器即可解開驗證,對於擴張伺服器與降低伺服器負載。
JWT 可能帶來什麼問題?
- 只要還沒過期,伺服器就會持續信任創建過的 JWT,若使用者登出、權限變更、帳號遭盜,JWT 無法立即作廢,除非額外實作黑名單機制。
- 前端存儲 JWT 仍可能遭受 XSS 或 CSRF 等攻擊。
延伸閱讀
- What Is JWT and Why Should You Use JWT - Web Dev Simplified
- HMAC explained | keyed hash message authentication code - Jan Goebel
- JWT HS256 - Jan Goebel
- JSON Web Tokens auth0 Docs
- JWT 是如何實作「數位簽名」的?揭秘 signature 的面紗 - 古古的後端筆記