概述
只解码 JWT 载荷而不验签名,等于相信攻击者自填的声明。正确做法是取签发方的公钥验签,并逐项校验签发者、受众与时效,再按 kid 缓存公钥以处理轮换。
关键步骤
- 从签发方 JWKS 获取公钥并按 kid 缓存。
- 校验签名,任何失败即拒绝。
- 校验 iss、aud、exp 与 nbf 是否符合预期。
- 遇到未知 kid 时刷新 JWKS,并限制刷新频率。
验证
- 伪造签名的令牌被拒绝。
- 过期或受众不符的令牌被拒绝。
- 密钥轮换后无需每请求抓取即可通过。
- 不接受 alg 为 none。
注意事项
- JWKS 校验证明令牌真实,但不等同于授权,仍需检查 scope。
- 签发方与校验方时钟偏差可能让有效令牌失败,需允许小量容差。
适用范围
本条目围绕「用 JWKS 校验 OIDC 令牌」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const { payload } = await jwtVerify(token, getKey, {
issuer: 'https://issuer.example.com',
audience: 'my-api',
algorithms: ['RS256'],
});