JSON Web Token - 入门

在上一篇,我们介绍了 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
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

将这部分值进行 Base64 得到 JWT 第一部分: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

🔅 Payload

Payload 是存放信息的地方,它有也一些标准字段的定义,但都不是强制的。

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明

JWT 标准所定义了五个值

  • iss: 该JWT的签发者
  • sub: 该JWT所面向的用户
  • aud: 接收该JWT的一方
  • exp(expires): 什么时候过期,这里是一个Unix时间戳
  • iat(issued at): 在什么时候签发的
  • nbf: 定义在什么时间之前,该jwt都是不可用的
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

这里我们不使用标准,自行放一些数据:

1
2
3
4
5
{
"id": "1234567890",
"name": "Zhiming Jiang",
"handsome": true
}

最后将这部分值进行 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
2
3
headers: {
'Authorization': 'Bearer ' + token
}

服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的:


⭐️ ️️总结

JSON 现在是事实的 DSF 标准了,所有的主流语言都支持 序列化/反序列化,所以使用 JSON 是一个不错的选择。

Payload 部分可以自由存储,方便扩展。

JWT 相对比较小巧,便于传输。

保证了数据不会被篡改,对安全性有保证

安全

依然要使用 HTTPS 协议来进行安全保证

Payload 部分不应该放敏感信息。

不要泄露 Secret 信息。