什么是JWT

JSON Web Token (JWT) 是一个开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,可以在客户端与服务器之间作为JSON对象安全地传输信息。

JWT的使用场景

  • 身份验证: 用户在登录以后,后续的每个请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源等。Session同样也可以实现这个功能,但是在使用Session的同时也会相应的增加服务器的压力;而JWT的开销则相对较小,因为其将存储的压力分布到各个客户端中,从而减轻了服务器的压力,并且能够在不同域的系统当中轻松的使用。单点登录(SSO)就广泛使用了JWT的功能。
  • 信息交换: JWT能够在客户端与服务器之间安全地传输信息,因为其可以签名,通过签名可以验证传输信息是否被修改。

JWT的组成

JWT就是一个字符串,经过加密处理与校验处理的字符串,由 . 分割的三个部分组成,分别是头(Header)、有效荷载(Playload)、签名(Signature),因此JWT的格式通常也是这样: header.playload.signature(header由JWT的表头信息经过加密后得到;playload由JWT用到的身份验证信息JSON数据加密得到;signature是由header和playload加密得到,这一部分作为校验部分)。

Header

通常是由两部分组成的:一是令牌的类型,即JWT;二是哈希算法,比如SHA256
例如:

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

然后这个JSON通过Base64加密形成JWT的第一个部分即header

Playload

JWT的第二个部分是有效荷载,其中包含了声明(Claim)。JWT提供了一组预定义的声明,这些声明都是可选的,并不是强制性的。当然你也可以自定义声明传输所需信息,比如系统用户ID。出于安全考虑,一般不会将用户的敏感信息存放在声明当中。

声明属性说明
iss发行人,JWT由谁签发
iat JWT创建时间,unix时间戳格式
expJWT过期时间,unix时间戳格式
subJWT所面向的用户
aud接收方,接收JWT的一方
nbf当前时间在nbf之前,JWT不能被接收处理
jti JWT唯一ID

例如:

{
	"iss": "Hilox",
	"sub": "HiloxApiUser",
	"iat": "1542337107",
	"exp": "1542340707",
	"userId": "5"
}

将上述声明(Claim)通过Base64加密后得到payload

Signature

将表头经过Base64加密得到的headerClaim经过Base64加密得到的playload进行组合,形成一个新字符串header.playload,对新形成的字符串使用标头当中指定的算法(例如:上述Header例子中使用HS256算法)和自定义的密钥(例如:Hilox)进行加密得到signature
最后,将字符串组合 header.playload.signature就是生成的token了。