如果服务用 verify(token, publicKeyPem) 验证 RS256 令牌,而库同时也接受 HS256、并直接使用传入的任何密钥,攻击者就可以拿到公钥(已在 JWKS 中公开),以这些字节作为密钥,对伪造的头部和载荷计算 HMAC,并设置 "alg": "HS256";于是服务器校验到的是一个有效的 HMAC。2015年,Tim McLean 连同 none 问题一起描述了这种攻击,此后新的库和框架中仍不断出现它的变体,包括借助嵌入在令牌 jwk 头部中的 JWK 发起的攻击。
修复方法(RFC 8725 §3.1)是在验证方把每个密钥绑定到唯一一种算法:使用算法允许列表;使用带类型的密钥对象,使其无法兼作 HMAC 密钥;用每个 JWK 中的 alg 与令牌核对;在没有做出信任判断之前,绝不从令牌提供的 jwk、jku 或 x5u 中选取密钥。RFC 9864 的完全指定算法名称消除了 EdDSA 等多态标识符带来的相关歧义。