什么是 JWT?

文章

JWT 是 JSON Web Token 的缩写。它是一种紧凑、URL 安全的令牌格式,用于以 JSON 对象的形式在各方之间安全地传输信息。这些信息经过数字签名,因此可以被验证和信任。JWT 最常用于 Web 和移动应用程序中的身份验证和授权。

需要检查或解码 JWT 令牌?

打开 JWT 解码器 →

历史背景

JWT 由 IETF(互联网工程任务组)提出,并于 2015 年 5 月作为 RFC 7519 正式标准化。它是作为更广泛的 JSON 对象签名与加密(JOSE)框架的一部分而开发的。JWT 迅速成为 REST API 和单页应用程序的主流令牌格式,在许多 Web 场景中取代了基于 XML 的较重替代方案(如 SAML 令牌)。

结构

JWT 由三个以点号分隔的 Base64URL 编码部分组成:header.payload.signature(头部.载荷.签名)。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNTE2MjM5MDIyfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. 头部(Header)

头部指定令牌类型和所使用的签名算法:

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

2. 载荷(Payload)

载荷包含声明(Claims)——关于用户的陈述和附加元数据。标准声明包括:

{
  "sub": "1234567890",
  "name": "Alice",
  "role": "admin",
  "iat": 1516239022,
  "exp": 1516242622
}

3. 签名(Signature)

签名通过使用密钥(或非对称算法的私钥)对编码后的头部和载荷进行签名来创建。它确保令牌未被篡改:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

JWT 身份验证工作流程

  1. 用户使用凭据(用户名 + 密码)登录
  2. 服务器验证凭据并创建签名的 JWT
  3. 服务器将 JWT 返回给客户端
  4. 客户端存储 JWT(通常存于内存或 localStorage 中)
  5. 客户端在每次请求中通过 Authorization: Bearer <token> 请求头发送 JWT
  6. 服务器验证签名并读取声明,无需查询数据库

签名算法

常见使用场景

安全规则

常见问题

什么是 JWT?

JWT(JSON Web Token)是一种紧凑、URL 安全的令牌格式,用于以 JSON 对象的形式在各方之间安全地传输信息。这些信息经过数字签名,因此可以被验证和信任。JWT 最常用于 Web 应用程序中的身份验证和授权。

JWT 代表什么?

JWT 代表 JSON Web Token。它是一个开放标准(RFC 7519),定义了一种紧凑且自包含的方式,以 JSON 对象的形式在各方之间传输信息。

JWT 有什么用途?

JWT 最常用于身份验证(保持用户登录状态)和授权(控制资源访问)。它也用于微服务之间的信息交换。

JWT 安全吗?

载荷只是经过 Base64 编码,并未加密——任何持有令牌的人都可以读取其内容。签名可防止篡改,但不提供保密性。切勿在 JWT 载荷中存储敏感数据,并始终使用 HTTPS。

JWT 与 Session Cookie 有什么区别?

Session Cookie 只存储一个 Session ID,服务器通过查询数据库来查找 Session。JWT 是自包含的——所有用户数据都在令牌中,无需数据库查询。JWT 在分布式系统中扩展性更好,但在没有额外基础设施的情况下无法在过期前使其失效。

HS256 和 RS256 有什么区别?

HS256 使用单个共享密钥进行签名和验证。RS256 使用私钥签名、公钥验证——对于验证方不应能签发新令牌的分布式系统更为安全。

相关文章

参考资料