jwtsignatureexception是spring security在jwt签名验证失败时抛出的标准异常,由jwtdecoder自动触发或手动封装,需确保密钥一致、算法匹配,并避免日志泄露token明文。

<p>JWT 签名验签失败时抛出 <code>JwtSignatureException</code>,核心在于捕获底层签名验证异常并主动封装为 Spring Security 提供的标准异常类型。</p> <h3>使用 JwtDecoder 时自动抛出 JwtSignatureException</h3> <p>Spring Security 5.7+ 的 <code>JwtDecoder</code>(如 <code>NimbusJwtDecoder</code>)在签名验证失败时,默认就会抛出 <code>JwtSignatureException</code>,无需手动 throw。只要配置正确,框架会自动处理:</p>
- 确保使用的是
NimbusJwtDecoder或支持签名验证的实现 - 密钥(
SecretKey或RSAKey)必须与签发时一致,且未被篡改 - JWT header 中的
alg值(如 HS256、RS256)需与解码器预期匹配
手动验证 JWT 并显式抛出 JwtSignatureException
若需自定义校验逻辑(例如预处理 token、多密钥路由),可调用 JwtDecoder#decode 并捕获异常后重新抛出:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
<code>try {
Jwt jwt = jwtDecoder.decode(token);
} catch (JwtValidationException ex) {
// Nimbus 抛 JwtValidationException,含签名失败原因
throw new JwtSignatureException("Invalid signature", token, ex);
} catch (RuntimeException ex) {
// 其他运行时异常(如解析失败、过期等)不一定是签名问题
if (ex instanceof JwtSignatureException) {
throw ex;
}
throw new JwtSignatureException("Signature verification failed", token, ex);
}</code>
自定义 JwtDecoder 包装异常
若想统一拦截所有签名失败场景,可包装原始 decoder:
- 继承
AbstractJwtDecoder或装饰JwtDecoder - 重写
decode方法,在 catchJwtValidationException时判断是否由签名引起(检查 cause 是否为SignatureException或消息含 "signature") - 仅对签名类错误构造
JwtSignatureException,其他保留原异常
注意异常链和日志敏感信息
JwtSignatureException 构造时传入的 token 字符串不应直接打到日志(避免泄露敏感凭证):
- 建议只记录 token 头部(前 20 字符)或哈希摘要
- 异常 message 可写 "Invalid JWT signature",不暴露算法或密钥细节
- 确保全局异常处理器(如
@ControllerAdvice)对JwtSignatureException返回 401,并隐藏堆栈中密钥相关线索
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










