JSON Web 令牌 (JSON Web Token, JWT) 是一种开放标准 (RFC 7519),用于在各方(客户端和服务器)之间安全地传输信息。
JWT 是一组捆绑在一起的 JSON 对象,用于通过 Web 或在客户端和服务器之间验证或授权用户。它们在客户端使用私钥进行签名,并使用 IDP 提供的公钥完成验证。当客户端提供令牌时,服务器会表示一个签名令牌。可以验证和信任此信息,因为它经过了数字签名。JWT 验证是一种授权方法,用于根据授权服务器颁发的 JWT 提供对保护的资源的访问。
在 NSX Advanced Load Balancer 中,支持将 JWT 验证作为通过 NSX Advanced Load Balancer 的安全通信的访问策略之一,它基于授权服务器颁发的 JWT。
JWT 验证主要组件
以下是 JWT 验证过程中使用的主要组件:
JSON Web 密钥集 (JWKS)
JSON Web 令牌 (JWT)
JWT 验证中的常用术语
术语 |
描述 |
kid |
用于对 JWT 进行签名的静态密钥的标识符。 |
algo |
用于对密钥进行签名的算法。 |
iss |
颁发 JWT 的授权服务器。 |
aud |
JWT 的目标接收者(NSX Advanced Load Balancer 虚拟服务)。 |
sub |
指定 JWT 主体。 |
exp |
令牌的过期时间(以秒为单位)。 |
nbf |
指定在接受令牌以进行处理之前必须等待的时间。 |
iat |
令牌的颁发时间(以秒为单位)。 |
jti |
令牌的唯一标识符。 |
JSON Web 密钥集 (JWKS)
JSON Web 密钥集 (JSON Web Key Set, JWKS) 是授权服务器颁发的一组公钥。这些密钥用于验证任何 JSON Web 令牌 (JWT)。JWKS 是表示一组 JWK 的 JSON 对象。每个 JWK 是由密钥标识符 (kid) 唯一标识的。颁发者将 kid 添加到 JWT 标头中,以指定用于对令牌进行签名的密钥。授权服务器对 JWT 进行签名,并在 JWKS(JSON Web 密钥集)中发布签名公钥。
JSON Web 令牌
在精简形式中,JSON Web 令牌 (JSON Web Tokens, JWT) 由以下部分组成,并以圆点 (.) 分隔:
Header
:标头由以下部分组成:令牌类型,即 JWT。
-
可以是 HMAC、SHA256 或 RSA 的签名算法。以下是一个 JWT 标头示例。
Payload
:JWT 负载包含有关源或客户端的信息。JWT 负载包含所设置的声明。声明是有关(用户)实体和附加数据的陈述。声明具有三种类型:已注册、公用和专用。注册的声明:这些声明是在 IANA“JSON Web 令牌声明”注册表中注册的声明。有关更多信息,请参阅 IANA 注册的声明:https://www.iana.org/assignments/jwt/jwt.xhtml#claims
iss:指定颁发 JWT 的主体
aud:指定 JWT 的目标接收者
sub:指定 JWT 主体
exp:令牌的过期时间,这是自 1970 年 1 月 1 日 UTC 以来的秒数(Unix 时间)
nbf:指定在接受令牌以进行处理之前必须等待的时间,这是以自 1970 年 1 月 1 日 UTC 以来的秒数表示的时间戳(Unix 时间)
iat:令牌的颁发时间,这是自 1970 年 1 月 1 日 UTC 以来的秒数(Unix 时间)
jti:令牌的唯一标识符
以下是 JWT 的示例负载。
Signature
:签名用于检查来自用户的消息或请求是否未被篡改。
下面显示了一个示例 JSON 令牌(将上述部分放在一起,但以圆点 (.) 分隔)。