这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
接上篇:JWT详解(上) | 青训营笔记 - 掘金 (juejin.cn)
2.2.2 载荷(Payload)
载荷这个名字就知道是存放有效信息的地方。对payload进行Base64编码就得到JWT的第二部分。这些有效信息包含三个部分:
- 标准声明 registered(参与令牌校验,非强制):一组预定义的声明
- 公共声明 public(不参与令牌校验,可以不加密): 可以随意定义,但不建议添加敏感信息,因为该部分在客户端可解密。
- 私有声明 private(不参与令牌校验,要加密):用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
- 标准声明 registered
iss: jwt签发者
sub: 当前令牌的描述说明
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
下面是一个例子:
{
"exp": time.Now().Unix() + 5,//jwt的过期时间
"iss": "SXSQ",//jwt签发者
}
2. 公共声明 public
可以随意定义,但不建议添加敏感信息,因为该部分在客户端可解密。
3. 私有声明 private
可自定义私有字段。比如下面面结构举例中的user_id和name都属于自定义私有字段。
{
"user_id": 10000,
"name": "user_name"
}
注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。
2.2.3 签名 Signature
在获得Signature之前,需要三个东西:
- 经过编码的 header
- 经过编码的 payload
- 一个秘钥 将三者按照header中指定的加密算法就行加密得到Signature,其用于校验数据是否被篡改,相当于是一个签证信息
最后将header、payload、Signature这三部分用 “.” 连接成一个完整的字符串,构成了最终的JWT,如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTQyMzc2NzQsInVzZXJfaWQiOiIxMDAwMCJ9.F-6If3xBBSnNrE04u8rBASY9MHBhjspr1-5qYURKiMc
其中:
header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload: eyJleHAiOjE2NTQyMzc2NzQsInVzZXJfaWQiOiIxMDAwMCJ9
Signature: F-6If3xBBSnNrE04u8rBASY9MHBhjspr1-5qYURKiMc
三者用“.”相连