JWT原理

Json web token (JWT),是一种json格式定义的安全令牌格式。
JWT一般是用来身份提供者与服务提供者之间传递被认证的用户身份信息。便于从服务器获取到资源。它也可以用来记录用户信息。与token不同的是,它不用查询数据库,只要在服务端使用密钥完成校验就行,JWT安全性不太好, 所以不能存储敏感信息。

JWT构成

主要有有三部分头部(Header)、载荷(Payload)、签证(Signature)
Jwt

头部由两部分组成:声明类型和声明加密的算法。最后用Base64进行加密,得到jwt第一部分。

Payload

这一部分就是存放有效信息的地方。这些有效信息包含三个部分。
标准注册的声明,公共的声明和私有的声明。标准注册的声明并不强制使用。
同时也用Base64进行加密,得到jwt第二部分。

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

Signature

这一部分是对前两部分的签名,防止数据被纂改。
由三部分组成:
head(base64后)+ payloader(base64后)+ secret

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');

secret(秘钥)只存储在服务器,是在服务端进行jwt的签发和校验,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

JWT实践

jwt应用流程

jwt-diagram

Q.E.D.