JWT是什么

1.用户状态认证:
传统的登录状态保存,一般是使用session,用户登录之后,给用户自动生成一个sessionId,保存在服务端,sessionId同时会返回至客户端,每次的http请求,cookie会携带者sessionId访问服务器,然后和服务器的sessionId进行对比,相同则认为保持登录状态。
但是,随着业务的发展,这个sessionId的使用有一定的局限性,比如用户量很大的情况,每个用户分配一个session,会占用很大的内存。另外,服务器在分布式的部署情况下,session的同步同样是个头疼的问题。
JWT的出现,转换了用户信息验证实现的思路。简单的讲,就是每次用户登录之后,服务端将用户的部分信息加密,生成一个token字符串,并且设置过期时间,然后将这个token返回至客户端进行保存,客户端每次携带token进行http请求,完成验证。

2.JWT(JSON WEB TOKENS)
JWT本身是无状态的,仅仅是存储登录授权的信息,可以实现单点登录的功能,因为在多个系统中只要在实现JWT token的时候用同一个密钥进行加密,则可以实现跨平台而登陆。比如,web端、移动端、甚至小程序,可以使用同一套的token方案。

3.JWT构成分解
JWT token的构成部分
token包含三个部分:Header,Payload,Signature
header 头部
标头通常由两部分组成:
令牌的类型,即JWT,
以及哈希算法,如HMAC SHA256或RSA。

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

HS256 表示使用了 HMAC-SHA256 来生成签名。接下来对这部分内容使用 Base64Url编码组成了JWT结构的第一部分。
Payload 载荷
payload包含三种类型的claim:reserved, public 和 private

{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强制使用它们,而是推荐使用,常用的有:

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
Public claims:根据需要定义自己的字段,注意应该避免冲突
Private claims:这些是自定义的字段,可以用来在双方之间交换信息

上述的负载需要经过Base64Url编码后作为JWT结构的第二部分。

Signature 签名
jwt的第三部分是一个签证信息,这个签证信息算法如下:

base64UrlEncode(header) + "." + base64UrlEncode(payload)+your-256-bit-secret
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

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