JWT总共包含了三个部分:Header头部、Payload负载、Signature签名。这三部分共同生成Token,三部分之间用“.”做分割。
JWT 头部
JWT的头部是一个描述JWT元数据的JSON对象,如下所示:
其中的alg:表示的是签名使用的算法,默认为HMAC SHA256(写为HS256),typ:表示的是令牌的类型,JWT的令牌统一写为JWT。
这样的一个Json数据,还需要使用Base64 URL算法将其转为字符串保存。
JWT 负载
负载部分就是JWT的主体内容,同样的也是一个Json对象,它包含了需要传递的数据,但是不能传递敏感数据,因为这部分数据别人也是可以拿到并且解密的。
JWT指定有七个默认字段供选择:
1iss:发行人
2exp:到期时间
3sub:主题
4aud:用户
5nbf:在此之前不可用
6iat:发布时间
7jti:JWT ID 用于标识该 JWT
除了默认字段外,我们还可以自定义字段,如下所示:
同样,这部分数据依然是使用Base 64 URL算法转换为字符串加密。
JWT 签名
签名部分是对上面两部分的数据签名,通过指定的算法(在JWT头部指定的算法)生成哈希来确保数据不会被篡改。
一般流程如下:
1.在服务器中保存了一个密码(secret),这个密码仅仅保存在服务器中,不对用户开放。
2.使用JWT头部指定的签名算法以及服务器中保存的密码(secret)来生成对应的签名
3.在计算出签名之后,JWT头、负载、签名,三部分组成一个字符串,每个部分以“.”进行分割,构成JWT对象
![](/images/780-200-2.jpg)