这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
Header(头部)
标题通常有两部分组成:
- 令牌的类型: 即
JWT - 签名的算法:如:
HMAC、SHA256或RSA
格式是JSON
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,这个JSON被Base64URL编码成JWT的第一部分
Payload(有效载荷)
令牌的第二部分是载荷,其中包括声明(claims)。
声明是关于实体(通常是用户)和附加数据。共有三种类型的声明。
注册声明(Registered claims)
这是一些预定义的声明,这些声明不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。
| 声明 | 含义 | 说明 | 是否必填 |
|---|---|---|---|
iss(issuer) | 签发人 | 其值应为大小写敏感的字符串或 Uri。 | 可选 |
aud(Audience) | 接收人 | 其值应为大小写敏感的字符串或 Uri。一般可以为特定的 App、服务或模块。 | 可选 |
sub(subject) | 所有者 | 可以是用户id、唯一标识。 | 可选 |
exp(Expiration Time) | 过期时间 | 必须是可以解析为 时间/时间戳 的数字类型。 服务端在验证当前时间大于过期时间是,应当验证不通过 | 可选 |
nbf(Not Before) | 启用时间 | 必须是可以解析为 时间/时间戳 的数字类型。必须在这个时间后才有效 | 可选 |
iat(Issued At) | 签发时间 | 必须是可以解析为 时间/时间戳 的数字类型。 | 可选 |
jti(JWT ID) | jwt ID | 签发给与token的唯一Id,通常用于一次性消费。 | 可选 |
公共声明(public claims)
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.
私人声明(private claims)
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
示例:
{
"sub" : "1234567890",
"name" : "万恶的沫白"
"admin" : true
}
然后对有效负载进行Base64Url编码以形成 JWt 令牌的第二部分。
声明名称只有三个字符,因为JWT是紧凑的。
对于已签名的令牌,此信息虽然受到保护以防篡改,但任何人都可以读取。除非加密,否则不要将机密信息放在 JWT 的负载或标头元素中。
签名(Signature)
要创建签名部分,您必须获取编码的标头、编码的有效载荷、秘密、标头中指定的算法,并对其进行签名。
例如,如果要使用 HMAC SHA256 算法,则签名将通过以下方式创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证消息在此过程中没有更改,并且在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是它所说的那个人。
合在一起
输出是三个由点分隔的 Base64-URL 字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。