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 只用于一次后就会被抛弃,不存在于任何持久化的状态。