JWT

JWT结构

在其紧凑形式中,JSON Web Tokens 由三部分组成,以点 (.) 分隔,它们是:

  • Header
  • Payload
  • Signature

因此,JWT 通常如下所示。

1
xxxxx.yyyyy.zzzzz

标头通常由两部分组成:令牌的类型,即 JWT,以及正在使用的签名算法,例如 HMAC SHA256 或 RSA。

例如:

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

然后,这个 JSON 被 Base64Url 编码以形成 JWT 的第一部分。

Payload

令牌的第二部分是负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的说明。共有三种类型的声明:已注册声明、公共声明和私有声明。

  • Registered claims: 这些是一组预定义的声明,这些声明不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是:iss(发行者)、exp(到期时间)、sub(主题)、aud(受众)等。.

  • Public claims: 这些可以由使用 JWT 的人随意定义。但是为了避免冲突,它们应该在 IANA JSON Web Token Registry中定义,或者定义为包含抗冲突命名空间的 URI。

  • Private claims: These are the custom claims created to share information between parties that agree on using them and are neither registered or public claims.

An example payload could be:

1
2
3
4
5
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

payload 进行 Base64Url 编码以形成 JSON Web Token的第二部分

注意:

​ 对于已签名的令牌,此信息虽然受到防篡改保护,但任何人都可以读取。除非加密,否则不要将机密信息放入 JWT 的负载或标头元素中。

Signature

要创建签名部分,您必须获取--------被编码过的标头、被编码过的有效载荷、secret、标头中指定的算法,并对其进行签名。

例如,如果要使用 HMAC SHA256 算法,则签名将通过以下方式创建:

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

签名用于验证消息在此过程中没有更改,并且在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是它所说的那个人。

Putting all together

输出是三个由点分隔的 Base64-URL 字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。

下面显示了一个 JWT

JWT如何工作

每当用户想要访问受保护的路由或资源时,用户代理应该发送 JWT,typically in the Authorization header using the Bearer schema

标题的内容应如下所示:

1
Authorization: Bearer <token>