JWT 的運作原理是什麼?
2023年2月5日
💎 加入 E+ 成長計畫 與超過 750+ 位工程師一同在社群成長,並獲得更多深度的軟體前後端學習資源
JWT 是什麼?
JWT 全名為 JSON Web Token,是一種基於 JSON 的開放標準(RFC 7519),JWT 會透過 HMAC、RSA、ECDS 等演算法進行加密,而 JWT 是以 Header、Payload、Signature 以 Base64 做做編碼,並且以 . 來做分開(例如: xxxxxx.yyyyyy.zzzzz )。
- Header:由 
alg和typ兩個欄位組成- alg:Signature 所要使用的加密演算法
 - typ:token 種類,基本上是 JWT
 
{ "alg": "HS256", "typ": "JWT" } - Payload:又被稱為 Claims,主要會分成以下部分
- Registered Claims:一些標準公認訊息
- iss:發行人
 - iat:發行時間
 - exp:到期日
 - sub:主題
 - aud:收件人
 - nbf:不接受早於…日期/時間
 - jti:唯一識別符
 
 - Public Claims:向官方申請公開聲明
 - Private Claims:自定義訊息,可以放一些非機敏的資料。
 
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Registered Claims:一些標準公認訊息
 - Signature:由三個部分組成
- base64UrlEncode(header)
 - base64UrlEncode(payload)
 - secret
 
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 256 - bit - secret) 
Payload 和 Header 被轉換成 Base64 編碼後可以被輕易的轉換回來,因此不建議放機敏資訊在其中。
JWT 運作原理

Client 登入後取得 Token,獲取資源時,可以在 Authorization header 掛上 Bearer
Authorization: Bearer <Token>
JWT 使用時機
近年來有多篇文章 [1] 提到,盡量不要用 JWT 代替 Session 使用,因為 JWT 本身存在著某些缺點,因此他得使用時機很限定,JWT 的缺點如下:
- Cross-site 攻擊:任何人擁有 Token 都能夠和後端做溝通,因此是有可能做到 Cross-site 攻擊的。
 - Local Storage 不安全:會將數據直接編碼進 Token ,所以很有可能超過 Cookie 或者 URL 的長度限制,若存在 Local Storage 則可能會有安全性的問題,因為他並不像 Cookie 一樣有安全措施。
 - 無法被單獨銷毀:Session 可以隨時被銷毀,但是 JWT 的設計是在過期以前都會保持有效,除非去建構有狀態 (Stateful)的架構,但這就違背了當初設計的目的。
 
那我們到底要怎麼使用 JWT 呢?可以根據它存在的特性:
- Token 生命期較短時:讓擁有此 Token 的用戶能夠在時間以內完成某些操作(e.g. 登入、下載檔案等)
 - Token 僅單次使用:任何 Token 只用於一次後就會被拋棄,不存在於任何持久化的狀態。