JWT详解(中) | 青训营笔记

159 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

接上篇:JWT详解(上) | 青训营笔记 - 掘金 (juejin.cn)

2.2.2 载荷(Payload)

载荷这个名字就知道是存放有效信息的地方。对payload进行Base64编码就得到JWT的第二部分。这些有效信息包含三个部分:

  • 标准声明 registered(参与令牌校验,非强制):一组预定义的声明
  • 公共声明 public(不参与令牌校验,可以不加密): 可以随意定义,但不建议添加敏感信息,因为该部分在客户端可解密。
  • 私有声明 private(不参与令牌校验,要加密):用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。
  1. 标准声明 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
三者用“.”相连