JWT 的運作原理是什麼?
2023年2月5日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
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 只用於一次後就會被拋棄,不存在於任何持久化的狀態。