JJWT 0.12 及更高版本提供流式的构建器和解析器——Jwts.builder()…signWith(key, alg) 和 Jwts.parser().verifyWith(key)…parseSignedClaims(token)——算法集中在 Jwts.SIG 中。它分为三个制品发布:编译时需要 jjwt-api,运行时需要 jjwt-impl 和 jjwt-jackson 之类的 JSON 绑定。0.13.0 对 256/384/512 的 HS、RS、PS、ES 以及 EdDSA 完成了往返测试;ES256K 以及 Ed25519 和 Ed448 这两个名称不在 Jwts.SIG 中。
解析器根据验证密钥推导出允许的算法,错误信息也会直接说明这一点。用 EC 公钥验证 RS256 令牌,以及以 EC 密钥的 PEM 文本为密钥的 HS256 令牌,都报错 UnsupportedJwtException,并说明该密钥不能用于这个算法。起防护作用的是密钥类型,而不是列表:传入 Keys.hmacShaKeyFor(pemBytes) 的解析器让那个伪造的令牌验证通过了,因此切勿用可能公开的材料构造 HMAC 密钥。
parseSignedClaims 会拒绝未签名的令牌,错误信息引用 RFC 7518 §3.6;这类令牌只能通过 Jwts.parser().unsecured()…parseUnsecuredClaims 读取。弱 HMAC 密钥根本走不到这一步:Keys.hmacShaKeyFor 以 WeakKeyException 拒绝了 16 字节的密钥,因为 RFC 7518 要求密钥长度至少与哈希长度相同。ES256 在签名时会拒绝 P-384 密钥。
有两个默认行为需要注意。没有时钟偏差容差——三秒前过期的令牌验证失败——而且 exp 是可选的,因此要像示例那样设置 clockSkewSeconds,并检查过期时间和颁发者。ES256 签名是 64 字节的原始 r‖s;DER 签名会得到准确的报错(Provided signature is 576 bits (72 bytes) but ES256 signatures must be exactly 512 bits (64 bytes)),它是少数能指出编码问题的库之一。可以在 JWT 调试器中检查令牌,用 JWT 密钥检测工具检查 HMAC 密钥。
如需大规模处理 JWE 和 JWK 集,可以与 Nimbus JOSE + JWT 比较。