Skip to main content
CheckTown
验证工具

JWT 验证器:检查 JSON Web Token 的结构与声明

发布于 阅读约 6 分钟
本文目录

什么是 JWT?

JWT(JSON Web Token)是一种紧凑且 URL 安全的令牌格式,用于以 JSON 对象的形式在各方之间安全地传输信息。JWT 由 RFC 7519 定义,是现代 Web 应用和 API 中身份认证与授权的事实标准。

JWT 是自包含的 —— 它携带了验证令牌真实性和提取用户声明所需的全部信息,无需查询数据库。这使其非常适合分布式系统和微服务架构中的无状态身份认证。

JWT 结构

JWT 由三个以点分隔、经 Base64URL 编码的部分组成:header.payload.signature。

  • 头部(Header)—— 一个 JSON 对象,用于指定令牌类型(JWT)和签名算法(例如 HS256、RS256、ES256)
  • 载荷(Payload)—— 一个包含声明的 JSON 对象:注册声明(iss、sub、exp、iat)、公开声明和私有声明
  • 签名(Signature)—— 通过使用密钥(HMAC)或私钥(RSA/ECDSA)对编码后的头部和载荷进行签名而生成

免费试用 —— 无需注册

校验 JWT →

JWT 校验的工作原理

JWT 校验涉及结构检查、签名验证和声明校验。

  • 结构检查 —— 令牌必须正好包含三个经 Base64URL 编码的段,各段之间以两个点分隔
  • 头部校验 —— 头部必须包含有效的 typ 和 alg 字段。所用算法必须与服务器所期望的一致
  • 签名验证 —— 使用头部、载荷和签名密钥重新计算签名。如果重新计算出的签名一致,则说明令牌未被篡改
  • 声明校验 —— 将 exp(过期时间)、nbf(生效时间)和 iss(签发者)等声明与当前时间及预期值进行比对检查

常见应用场景

JWT 为现代 Web 技术栈中的身份认证与授权提供支撑。

  • API 身份认证 —— 客户端在 Authorization 头(Bearer 方案)中携带 JWT,从而在无会话的情况下对 API 请求进行认证
  • 单点登录(SSO)—— 身份提供方签发的 JWT 可被多个应用接受,实现应用间的无缝认证
  • OAuth 2.0 访问令牌 —— 许多 OAuth 实现将 JWT 用作访问令牌,直接在令牌中编码作用域和权限
  • 微服务通信 —— 服务之间传递 JWT,以在服务边界之间传播用户上下文和授权决策

JWT 安全最佳实践

JWT 功能强大,但需要谨慎处理,以避免常见的安全隐患。

  • 务必校验算法 —— 切勿让令牌中的 alg 字段来决定服务器使用哪种算法。这样可防范 none 算法攻击
  • 设置较短的过期时间 —— JWT 一旦签发便无法撤销。请将 exp 时间设置得较短(访问令牌为 15 分钟),并使用刷新令牌来维持长期会话
  • 在分布式系统中使用非对称算法 —— RS256 或 ES256 允许服务在无需共享签名密钥的情况下验证令牌
  • 切勿在载荷中存储敏感数据 —— JWT 只是编码,并非加密。任何人都能解码载荷。请将机密信息保存在数据库中,而不是令牌里

常见问题解答

没有密钥能解码 JWT 吗?

能。JWT 载荷是经 Base64URL 编码的,并非加密。任何人都能解码并读取头部和载荷。密钥仅用于验证签名 —— 也就是确认令牌未被篡改。

JWS 和 JWE 有什么区别?

大多数人所说的 JWT 其实指的是 JWS(JSON Web Signature)—— 一种签名令牌。JWE(JSON Web Encryption)则是一种加密令牌,没有解密密钥就无法读取其载荷。大多数 JWT 都是 JWS 令牌。

我应该把 JWT 存储在 localStorage 还是 cookie 中?

HttpOnly cookie 更安全,因为它无法通过 JavaScript 访问(可防止 XSS 窃取)。localStorage 则容易受到 XSS 攻击。对于敏感应用,请使用 HttpOnly、Secure、SameSite 的 cookie。

相关工具