一、头部
通常包含两部分信息:令牌类型和签名算法。
例如在 JWT 中,头部会指明这是一个 JWT(typ
字段,值为JWT
),并且说明所使用的签名算法(如alg
字段,可能的值包括HS256
、RS256
等)。
这部分内容是一个 JSON 对象(例如下方),然后会进行 Base64Url 编码,形成 token 的第一部分。
{"typ": "JWT", "alg": "HS256"}
二、载荷
包含了用户或其他实体相关的信息。这些信息可以分为标准声明和自定义声明。标准声明包括一些预定义的字段,如sub
(代表主题,通常是用户 ID)、exp
(过期时间)、iat
(令牌发布时间)等。
- 例如,一个包含用户 ID 为
12345
,用户角色为admin
,并且在2024 - 11 - 30T12:00:00Z
过期的载荷信息,JSON 对象如下:
{"sub": "12345","role": "admin","exp": 1701331200}
三、签名
签名是用于验证 token 的真实性和完整性的部分。它是通过对头部和载荷进行加密计算得到的。具体的计算方式取决于头部中指定的签名算法。如果是HS256
算法(一种对称加密算法),则会使用一个密钥,将编码后的头部和载荷作为输入,通过 HMAC - SHA256 算法计算出签名。这个签名是 token 的第三部分。签名的存在确保了 token 在传输过程中没有被篡改,接收方可以使用相同的算法和密钥来验证签名的正确性。
得到签名后,整个 JWT 令牌就是header.payload.signature
的格式,例如:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NSIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcwMTMzMTIwMH0.signed_signature
(其中signed_signature
是实际计算得到的签名部分)。
四、简单访问令牌示例
-
标识符(Identifier)
- 假设令牌标识符是
token_abcdef
。
- 假设令牌标识符是
- 权限范围(Scope)
- 权限范围是
["read", "write"]
,表示该令牌具有读取和写入权限。
- 权限范围是
- 有效期(Validity Period)
- 有效期从
2024 - 10 - 01T00:00:00Z
到2024 - 10 - 31T23:59:59Z
。
- 有效期从
- 整个令牌可能在系统中以一个对象的形式存储或者传输,如下:
{"identifier": "token_abcdef","scope": ["read", "write"],"validityPeriod": {"start": "2024 - 10 - 01T00:00:00Z","end": "2024 - 10 - 31T23:59:59Z"}}