JWT 的運作原理是什麼?

2023年2月5日

💎 加入 E+ 成長計畫 與超過 300+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

JWT 是什麼?

JWT 全名為 JSON Web Token,是一種基於 JSON 的開放標準(RFC 7519),JWT 會透過 HMAC、RSA、ECDS 等演算法進行加密,而 JWT 是以 Header、Payload、Signature 以 Base64 做做編碼,並且以 . 來做分開(例如: xxxxxx.yyyyyy.zzzzz )。

  • Header:由 algtyp 兩個欄位組成
    • 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
    }
    
  • Signature:由三個部分組成
    • base64UrlEncode(header)
    • base64UrlEncode(payload)
    • secret
    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 256 - bit - secret)
    

Payload 和 Header 被轉換成 Base64 編碼後可以被輕易的轉換回來,因此不建議放機敏資訊在其中。

JWT 運作原理

JWT 運作
JWT 運作

Client 登入後取得 Token,獲取資源時,可以在 Authorization header 掛上 Bearer

Authorization: Bearer <Token>

JWT 使用時機

近年來有多篇文章 [1] 提到,盡量不要用 JWT 代替 Session 使用,因為 JWT 本身存在著某些缺點,因此他得使用時機很限定,JWT 的缺點如下:

  1. Cross-site 攻擊:任何人擁有 Token 都能夠和後端做溝通,因此是有可能做到 Cross-site 攻擊的。
  2. Local Storage 不安全:會將數據直接編碼進 Token ,所以很有可能超過 Cookie 或者 URL 的長度限制,若存在 Local Storage 則可能會有安全性的問題,因為他並不像 Cookie 一樣有安全措施。
  3. 無法被單獨銷毀:Session 可以隨時被銷毀,但是 JWT 的設計是在過期以前都會保持有效,除非去建構有狀態 (Stateful)的架構,但這就違背了當初設計的目的。

那我們到底要怎麼使用 JWT 呢?可以根據它存在的特性:

  • Token 生命期較短時:讓擁有此 Token 的用戶能夠在時間以內完成某些操作(e.g. 登入、下載檔案等)
  • Token 僅單次使用:任何 Token 只用於一次後就會被拋棄,不存在於任何持久化的狀態。

相關連結

[1] Stop Using JSON Web Tokens For Authentication. Use Stateful Sessions Instead | by Francisco Sainz | Better Programming

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們