JWT(JSON Web Token)

传统的 session、cookie 验证用户登录状态不便于分布式集群系统。(服务器有状态)

JWT 可以轻松的在分布式集群系统中解决验证登录态的问题。(服务器无状态)

JWT 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户。

之后,当用户与服务器通信时,客户在请求中发回JSON对象。
服务器仅依赖于这个JSON对象来标识用户。为了防止用户篡改数据,服务器将在生成对象时添加签名。

服务器不保存任何会话数据,即服务器变为无状态,使其更容易扩展。

一个 JWT 实际上就是一个字符串,它由三部分组成,头部有效载荷签名

头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。

{
    "typ": "JWT",
    "alg": "HS256"
}

在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);
typ属性表示令牌的类型,JWT令牌统一写为JWT。
最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

有效载荷(Payload)

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。这些有效信息包含三个部分:

(1) 七个默认字段供选择。(建议但不强制使用)

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token。

(2) 公共的声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.
但不建议添加敏感信息,因为该部分在客户端可解密.

(3) 私有的声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息。

有效载荷的JSON对象也使用Base64 URL算法转换为字符串保存。

签名(Signature)

JWT 的第三部分是一个签证信息,这个签证信息由三部分组成:

Header (base64URL后的)
Payload (base64URL后的)
Secret

这个部分需要Header和Payload使用.连接组成的字符串,然后通过Header中声明的加密方式进行加盐Secret组合加密,然后就构成了JWT的第三部分。

注意:Secret是保存在服务器端的,JWT的签发生成也是在服务器端的,Secret就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个Secret, 那就意味着客户端是可以自我签发JWT了。