JWT 的运作原理是什么?

2023年2月5日

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

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](https://betterprogramming.pub/stop-using-json-web-tokens-for-authentication-use-stateful -sessions-instead-c0a803931a5d)

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