JWT

Jwt简介

什么是JWT

JWTJSON Web Token 的缩写,它是一种用于在网络应用环境间安全地传输信息的一种基于 JSON 的开放标准RFC 7519。它可以在各方之间以 JSON 对象的形式安全地传输信息,这些信息可以通过数字签名进行验证和信任。JWT常用于身份认证和信息交换的场景。

JWT结构

JWT 由三部分组成,分别是 HeaderPayloadSignature 。这三部分分别过签名算法编码成字符串,然后通过 . 连接起来,就形成一个 JWT 字符串。

Header(头部)

通常包含两部分,一个是token的类型,即JWT,另一个是所使用的签名算法,例如HMAC SHA256或RSA。其 JSON 结构为:

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

Payload(负载)

包含一系列声明(Claims),通常是指实体(用户)和其他数据。声明有三种:

  1. Registered Claims(注册声明) :是一些预定义的,非强制但推荐使用的声明,可以帮助系统更加高效和便携地管理 JWT。这些声明有:

    • iss (Issuer) :签发者。标识或识别发行 JWT 的签发主体。

    • sub (Subject) :主题。表示该 JWT 的主题(描述)。

    • aud (Audience) :观众,受众。用于识别JWT意图发送的接收者。每个打算处理 JWT 的主体必须通过在受众声明中识别自己的值。

    • exp (Expiration Time) :过期时间。用于识别 JWT 不应被接受处理的时间点或之后的过期时间

    • nbf (Not Before) :不可早于。用于识别 JWT 不应被接受处理的时间点之前。

    • iat (Issued At) :发行于。用于识别 JWT 被发行的时间点。

    • jti (JWT ID) :JWT ID。为 JWT 提供了一个唯一的标识符。

一般应用中,isssubaudexp 注册声明使用较为频繁。

  1. Public Claims(公共声明) :公共声明由用户随意定义,但需要避免冲突

  2. Private Claims(私有声明) :用户可以在私有声明中定义或创建自己要通过 JWT 传输的信息。

Payload 部分的 JSON 结构如:

1
2
3
4
5
6
7
8
9
10
11
{
"iss": "a",
"sub": "example",
"aud": "b",
"exp": "2020-02-13 00:00:00",
"nbf": "2020-02-13 00:00:00",
"iat": "2020-02-13 00:00:00",
"jti": "1",
"userName": "admin",
"name": "管理员"
}

Signature(签名)

签名用于验证消息在传输过程中没有被更改,在用私钥签名的令牌的情况下,还可以验证 JWT 的发送者是否匹配。

创建签名的步骤:

  1. JWT 的头部进行 Base64Url 编码。

  2. JWT 的负载进行 Base64Url 编码。

  3. 将编码后的头部和负载用点(.)连接起来。

  4. 使用指定的HMAC SHA256算法和密钥对连接后的字符串进行处理后便得到 JWT 的签名部分。

进一步,将 JWT 的头部,负载分别进行使用算法处理后与签名一起,中间使用 . 连接起来,便得到完整的 JWT 字符串。其格式为:

1
xxxxxx.yyyyyy.zzzzzz

JWT应用

  1. 身份认证:用户登录后,服务器生成一个JWT token,返回给用户。之后用户的每次请求都会带上这个token,服务器验证token的有效性后,进行资源访问控制。这是目前 JWT 的主要使用场景。

  2. 信息交换:在多个服务之间安全地传输信息。由于 JWT 构造简单,且具有一定安全性,因此可以用来在一些系统或服务间便携安全地传输信息。

JWT的安全性

  1. 应该使用HTTPS协议来防止中间人攻击。

  2. 保护好签名密钥,避免泄露。

  3. 避免在 JWT 中嵌入敏感信息,因为base64编码并不是加密。

  4. 设置合适的过期时间,以减少token被滥用的风险。