初识JWT
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了。