JWT 解码器
JSON Web Token(JWT)是一种紧凑的、URL 安全的方式,用于在两方之间表示声明。大多数 JWT 使用 JWS(JSON Web 签名)进行签名,确保完整性但不加密内容。此工具解码头部和载荷以显示声明,以人类可读的格式显示时间戳,并显示令牌的过期状态。
规范
常见用例
- 调试 OAuth 2.0 和 OpenID Connect 认证流程
- 检查来自身份提供商(Auth0、Okta、Keycloak)的访问令牌和 ID 令牌
- 在 API 开发中验证令牌声明是否匹配预期值
- 在排查 "401 Unauthorized" 错误时检查令牌过期
- 在集成第三方服务时理解令牌结构
- 审计令牌进行安全审查(算法、声明、过期)
功能
- 解码 JWT 头部和载荷(JWS 格式)
- 显示算法(HS256、RS256、ES256、PS256、EdDSA)和令牌类型
- 解析注册声明:iss(签发者)、sub(主题)、aud(受众)、exp(过期时间)、nbf(生效时间)、iat(签发时间)、jti(JWT ID)
- 显示过期状态和人类可读的倒计时
- 将解码后的部分复制为格式化的 JSON
示例
OAuth 2.0 访问令牌
试试看 →一个带有标准声明的典型访问令牌,包括主题、签发者和过期时间。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE5MTYyMzkwMjJ9.4S5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5J5提示
- JWS 令牌(最常见的类型)是签名的但未加密的。任何拥有令牌的人都可以通过 Base64 解码读取载荷。
- JWE 令牌加密载荷,但不太常见。此工具解码 JWS 令牌。
- 在信任声明之前始终在服务端验证签名。此工具显示解码内容但不验证签名。
- "alg": "none" 算法是安全风险,应被服务器拒绝。
- 对称算法(HS256)使用共享密钥;非对称算法(RS256、ES256)使用公钥/私钥对。
- "exp" 声明是以秒为单位的 Unix 时间戳。检查它以避免接受过期令牌。
理解 JWT 解码器
JSON Web Token(JWT)是现代 Web 认证和授权的主导令牌格式。JWT 是一个紧凑的、URL 安全的字符串,由三个 Base64url 编码的段组成,用点分隔:指定签名算法的头部、包含关于用户或会话的声明的载荷,以及确保令牌未被篡改的加密签名。这种结构允许任何一方通过简单的 Base64 解码读取令牌内容,而只有拥有签名密钥的方才能创建或验证有效的令牌。
大多数 JWT 使用 JWS(JSON Web 签名)格式,其中载荷被签名但未加密。头部的 "alg" 字段指定算法:对称算法如 HS256 使用签发者和验证者都知道的共享密钥,而非对称算法如 RS256 和 ES256 使用私钥签名和公钥验证。在分布式系统中优先使用非对称算法,因为验证密钥可以公开共享而不会泄露签名密钥。
载荷包含 RFC 7519 定义的注册声明:"iss"(签发者)、"sub"(主题)、"aud"(受众)、"exp"(过期时间)、"nbf"(生效时间)、"iat"(签发时间)和 "jti"(JWT ID)。OAuth 2.0 和 OpenID Connect 层额外添加了作用域、角色和用户档案信息的声明。"exp" 声明对安全至关重要——没有过期时间或过期时间过长的令牌是常见的漏洞。
JWT 用于 OAuth 2.0 访问令牌、OpenID Connect ID 令牌、API 认证和会话管理。Auth0、Okta 和 Keycloak 等身份提供商签发 JWT,应用程序无需联系提供商即可验证它们,实现无状态认证。然而,这也意味着撤销困难——被泄露的令牌在过期前一直有效,这就是为什么短过期时间和令牌刷新流程是必要的安全实践。
由于 JWS 令牌是 Base64url 编码而不是加密的,任何拥有令牌的人都可以解码并读取头部和载荷。密码、信用卡号和密钥等敏感信息绝不应该放在 JWT 载荷中。JWE(JSON Web 加密)令牌确实加密了载荷,但在实践中不太常见。编码和加密之间的区别是使用 JWT 时需要理解的最重要的事情之一。
签名算法的选择具有重要的安全影响。HS256 是对称算法,使用单个共享密钥进行签名和验证,实现简单但要求双方安全存储相同的密钥。RS256 和 ES256 是非对称算法,使用私钥签名和公钥验证。在分布式系统中优先使用非对称算法,因为公钥可以公开共享——通常通过 JWKS(JSON Web Key Set)端点——而不会泄露签名密钥。"alg": "none" 选项表示一个没有签名的未签名令牌,意味着任何人都可以伪造具有任意声明的令牌。一种已知的攻击是将算法头部更改为 "none" 并剥离签名。服务器应始终验证算法是否在允许列表中,并拒绝未签名的令牌。
正确的过期处理对 JWT 安全至关重要。应用程序应在每次请求中在信任令牌之前检查 "exp" 声明。当令牌过期时,刷新令牌(安全存储,通常在 httpOnly Cookie 中)可以用来获取新的访问令牌,而无需用户重新登录。保持访问令牌的生命周期短——通常 5 到 15 分钟——限制了令牌被泄露时的暴露窗口。在访问令牌实际过期之前主动实施令牌刷新,可以避免应用程序中面向用户的中断。