JWT
2024年12月20日大约 2 分钟
00. 前言
现在,正视JWT,系统地了解什么是JWT
01. Head包含的字段
- alg: 指定用于签名的算法,例如
HS256
、RS256
等。这是一个必需字段。 - typ: 指定令牌的类型,通常为
JWT
。这个字段是可选的,但通常会包含。 - kid: 指定密钥的标识符,用于在使用多个密钥时帮助接收方选择正确的密钥进行验证。这个字段是可选的。
- jku: 指定一个 URL,指向一个包含公钥的 JSON Web Key Set(JWKS)。这个字段也是可选的。
- x5u: 指向一个 X.509 证书的 URL,用于验证签名。这个字段是可选的。
- x5c: 包含一个 X.509 证书链的数组,用于验证签名。这个字段是可选的。
- x5t: 指定 X.509 证书的指纹,用于验证签名。这个字段是可选的。
- cty: 指定内容类型,通常用于嵌套 JWT。这个字段是可选的。
这些字段共同构成了 JWT 的头部部分,通常以 JSON 格式表示,并在 JWT 的编码过程中进行 Base64Url 编码。JWT 的结构通常是由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
02. payload包含字段
1. 注册声明(Registered Claims)
这些是预定义的字段,建议使用但不是必需的。常见的注册声明包括:
- iss (Issuer): 发行者的标识,通常是一个 URL 或者一个字符串,表示谁发行了这个 JWT。
- sub (Subject): 主题,表示这个 JWT 的主体,通常是用户的唯一标识符。
- aud (Audience): 接收者,表示这个 JWT 的目标受众,通常是一个或多个接收者的标识符。
- exp (Expiration Time): 过期时间,表示这个 JWT 的有效期,通常是一个 Unix 时间戳。
- nbf (Not Before): 不可用时间,表示在这个时间之前,JWT 不应被接受。
- iat (Issued At): 签发时间,表示 JWT 被签发的时间。
- jti (JWT ID): JWT 的唯一标识符,通常用于防止重放攻击。
2. 公共声明(Public Claims)
这些是可以自定义的声明,通常用于共享信息。为了避免冲突,建议使用 URI 作为命名空间。例如:
- name: 用户的姓名。
- email: 用户的电子邮件地址。
3. 私有声明(Private Claims)
这些是自定义的声明,通常用于特定应用程序之间的信息交换。私有声明没有预定义的名称,通常是应用程序特定的。例如:
- role: 用户的角色(如管理员、用户等)。
- permissions: 用户的权限列表。
03. Signature包含的字段
此部分不包含字段,只是一个经过加密的字符串,加密算法在头部指定
构造JWT流程
- 将头部金和载荷进行base64和url编码,随后将头部和载荷连接起来,之后对