JWT - 组成部分详解

619 阅读3分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

Header(头部)

标题通常有两部分组成:

  • 令牌的类型: 即JWT
  • 签名的算法:如:HMACSHA256RSA

格式是JSON

例如:

{
    "alg": "HS256",
    "typ": "JWT"
}

然后,这个JSONBase64URL编码成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 字符串,可以在 HTMLHTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。