在上一篇,我们介绍了 Web Token 的概念,也提到了 JSON Web Token。这里,再来对 JWT 进行深入的研究。
⭐️ ️️JWT 介绍
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).
特点
- 体积小,因而传输速度快
- 传输方式多样,可以通过URL/POST参数/HTTP头部等方式传输
- 严格的结构化。它自身(在 payload 中)就包含了所有与用户相关的验证消息,如用户可访问路由、访问有效期等信息,服务器无需再去连接数据库验证信息的有效性,并且 payload 支持为你的应用而定制化。
- 支持跨域验证,可以应用于单点登录。
⭐️ ️️JWT 格式
JWT 使用了 JSON 格式,由三个部分组成:
- Header
- Payload
- Signature
看起来像这样:
1 | xxxxx.yyyyy.zzzzz |
🔅 Header
头部由两部分信息:
- 声明类型,这里是 JWT
- 声明加密的算法 通常直接使用 HMAC SHA256/RSA
1 | { |
将这部分值进行 Base64 得到 JWT 第一部分: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
🔅 Payload
Payload 是存放信息的地方,它有也一些标准字段的定义,但都不是强制的。
- 标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明
JWT 标准所定义了五个值:
- iss: 该JWT的签发者
- sub: 该JWT所面向的用户
- aud: 接收该JWT的一方
- exp(expires): 什么时候过期,这里是一个Unix时间戳
- iat(issued at): 在什么时候签发的
- nbf: 定义在什么时间之前,该jwt都是不可用的
- jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
这里我们不使用标准,自行放一些数据:
1 | { |
最后将这部分值进行 Base64 得到 JWT 第二部分: eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiWmhpbWluZyBKaWFuZyIsImhhbmRzb21lIjp0cnVlfQ
🔅 Signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
- header (base64后的)
- payload (base64后的)
- secret
它由前两部分的 Base64 值合在一起,加上一个 salt 什值,再由 Header 中的加密方式对这个字符串进行加密生成这一部分: yHFP8ABW2Oxk3eH1C8ODyPf6UO84yP7zbXOaVY5boUE
🔅 最终
1 | base64(Header) + '.' + base64(Claims) + '.' + base64(Signature) |
最终,就变成这样的一个字符串:
很小,这方便了它的传输,可以放在 Header 里,也可以放在 QueryString 中。
⭐️ ️️应用
一般是在请求头里加入Authorization,并加上Bearer标注:
1 | headers: { |
服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的:
⭐️ ️️总结
JSON 现在是事实的 DSF 标准了,所有的主流语言都支持 序列化/反序列化,所以使用 JSON 是一个不错的选择。
Payload 部分可以自由存储,方便扩展。
JWT 相对比较小巧,便于传输。
保证了数据不会被篡改,对安全性有保证
安全
依然要使用 HTTPS 协议来进行安全保证
Payload 部分不应该放敏感信息。
不要泄露 Secret 信息。