JWT 由 header.payload.signature 三段组成,签名保证完整性,但 payload 只是 Base64Url 编码,不是加密,敏感信息绝不能放进去。常见陷阱:
1)alg=none 与算法混淆:服务端若按客户端 header 的 alg 选择验签算法,攻击者可声明 alg:none 或用公钥当 HMAC 密钥(RS256 转 HS256),必须服务端固定算法白名单;2)弱密钥:HS256 密钥过短会被离线爆破,需足够随机并定期轮换;3)不校验标准声明:必须校验 exp、iss、aud,否则跨服务 token 可被重放;4)无法主动失效:JWT 无状态,登出/封号后过期前仍有效,可用短有效期 + refresh token 轮换,或维护黑名单(牺牲部分无状态性);5)存储位置:localStorage 易被 XSS 偷,HttpOnly Cookie 需防 CSRF,两者权衡。
jwt.verify(token, key, { algorithms: ['RS256'], issuer: 'auth.svc' })
追问方向:JWT vs Session 选型、refresh token 重放检测。