image

JWT技术解析

JSON Web Token(JWT)是一个遵循RFC
7519标准的开放协议,它确立了一种简洁自包含的JSON数据格式,用于在通信各方间安全地进行数据传递。这些数据具备可验证性和可信度,因为它们都经过数字签名处理。JWT支持使用密钥(HMAC算法)或RSA非对称加密密钥对进行签名验证。

下面详细解析定义中的关键特性:

  • 简洁性

JWT体积小巧,可通过URL参数、POST数据或HTTP头部字段进行传输,这种紧凑特性也使其传输效率较高。

  • 自包含性

有效载荷部分包含了所有必要的用户身份信息,无需频繁查询数据库获取用户资料。

JWT的典型应用

  • 身份验证

这是JWT最广泛的应用场景。用户登录成功后,系统返回JWT令牌,后续请求需携带此令牌以访问授权范围内的路由、服务与资源。单点登录(
SSO)是JWT的典型应用案例,因其低开销和跨域使用的便捷性而广受欢迎。

  • 数据安全交换

JWT适合在多系统间安全传递数据,其签名机制既能确认发送方身份,也能验证传输数据是否遭受篡改。

JWT的组成结构

JWT由三个基本部分构成:

  1. 头部(Header)
  2. 有效载荷(Payload)
  3. 签名(Signature)

因此,完整的JWT通常呈现为以下格式:
xxxxx.yyyyy.zzzzz

text

头部(Header)

头部通常包含两个要素:令牌类型(固定为JWT)和采用的哈希算法(如HMAC SHA256或RSA)。

示例:
{
“alg”: “HS256”,
“typ”: “JWT”
}

text

该JSON对象经过Base64编码后形成JWT的第一部分。

有效载荷(Payload)

载荷部分包含实体声明、用户信息及其他元数据。声明主要分为三类:

  1. 注册声明
  2. 公开声明
  3. 私有声明

示例:
{
“sub”: “1234567890”,
“name”: “John Doe”,
“admin”: true
}

text

该JSON对象经过Base64编码后形成JWT的第二部分。

签名(Signature)

签名部分用于验证令牌发送方身份,并确保传输内容未被修改。

生成签名需要以下要素:编码后的头部、编码后的载荷、密钥以及头部指定的算法。

使用HMAC SHA256算法生成签名的示例:
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)

text

上述三部分经过Base64编码后以点号连接,构成完整的JWT。这种结构使其适合在HTML和HTTP环境中传输,且比XML等传统格式更加紧凑。

image

如需实际操作JWT并进行编码解码验证,可使用官网提供的在线调试工具。

image

JWT运行机制

在身份验证流程中,用户凭据验证通过后,系统返回JWT令牌(通常保存在本地存储中,也可使用Cookie),而非传统的服务器端会话创建与Cookie返回方式。

当用户请求受保护的路由或资源时,客户端应在Authorization头中以Bearer模式发送令牌。标准格式如下:
Authorization: Bearer

text

这是一种无状态认证方案,因为用户状态信息不存储在服务器内存中。服务器端受保护路由会检查Authorization头中的JWT有效性,存在有效令牌即允许访问受限资源。由于JWT自包含所有必要信息,减少了多次查询数据库的需求。

这种特性使得完全依赖无状态数据API成为可能,甚至可向下游服务发起请求。跨域资源共享(CORS)不会构成安全问题,因为其不依赖Cookie机制。

完整工作流程如下:

image

JWT技术优势

  • JSON数据格式通用性强,支持多种编程语言
  • 载荷部分可存储业务逻辑所需的非敏感附加信息
  • 结构简单,字节占用少,便于网络传输
  • 服务端无需保存会话状态,易于系统扩展与安全维护

JWT使用注意事项

  1. 避免在载荷中存放敏感数据,因为该部分可被解码
  2. 妥善保管签名使用的私钥
  3. 建议使用HTTPS协议进行传输

相关技术资源

官方网站:https://jwt.io/

技术介绍:https://jwt.io/introduction/

开发库支持:https://jwt.io/#libraries-io

RFC 7519规范文档:https://tools.ietf.org/html/rfc7519

后续将分享JWT在Java环境中的实际应用案例。