JSON Web 令牌(JWT)
JWT 作为无状态令牌格式:结构、签名验证、常见漏洞(算法混淆、时钟偏移、密钥泄露)与缓解。
快速解答
JWT 是一种签名令牌;如果签名无法用预期密钥验证通过、算法被污染/混淆(例如 'none' 或算法不匹配)、签发方/受众错误,或令牌已过期,则应拒绝该令牌。
定义
JWT 是一种紧凑的、已签名的声明令牌(header.payload.signature),主要用作无状态的不记名令牌;其安全性完全取决于严格的签名验证和短生命周期。
它是什么
JSON Web 令牌(RFC 7519)是一种紧凑、URL 安全的令牌,由三个 base64url 部分——头部、载荷、签名——组成,通常用作 API 和 SSO 中的无状态不记名令牌(参见 security:oauth-saml-sso)。
为什么重要
无状态性很方便,但 JWT 唯一真正的安全边界是它的签名。如果某个库或应用程序在未验证签名的情况下信任令牌、接受错误的算法,或使用已泄露或被攻击者控制的签名密钥,任何人都可以铸造携带任意声明的令牌。
它如何工作
- header(头部):令牌类型和签名算法(
alg)。 - payload(载荷):声明——签发方(
iss)、受众(aud)、主体(sub)、过期时间(exp)、签发时间(iat)。 - signature(签名):HMAC(对称共享密钥)或非对称(RSA/ECDSA 公钥)。
检测
alg: none或头部与预期密钥类型之间的算法不匹配(算法混淆)。- 接受
exp在过去或根本没有过期时间的令牌。 iss/aud与预期的身份提供商 / 依赖方不匹配。- 两个用户共享一个对称签名令牌(表明共享密钥已泄露)。
缓解
- 使用预期的算法和密钥验证签名;绝不接受
alg: none或回退到不受信任的算法。 - 验证
iss、aud、sub、exp和iat;拒绝已过期和过早签发(时钟偏移)的令牌。 - 使用非对称签名,使秘密材料仅保留在签名方;轮换密钥。
- 不要记录令牌;它们是凭据(bearer credentials)。
调查
解码 JWT(仅头部/载荷,绝不处理签名)以检查 alg/声明并确认验证缺口,然后审查签发方的密钥服务和令牌历史日志。使用 guides:tool-jwt-guide 安全解码,使用 guides:decode-jwt-safely 了解安全流程。