Spring与JJWT环境中JWT末尾添加特殊字符未被拦截的问题咨询
问题解答
这是JJWT的已知行为
JJWT在解析JWT时,默认逻辑是按.分割出header、payload、signature三个核心段。对于signature段之后追加的?@!#这类非Base64URL字符,框架会自动忽略——因为签名验证仅处理signature段中的有效Base64URL字符,截断后续非法内容,所以不会触发错误,导致带末尾特殊字符的token仍能通过认证。
其他解决方案
除了你已经实现的自定义Base64URL字符校验,还有两种更简洁的处理方式:
1. 正则表达式预校验
在解析token前,用正则强制校验完整格式,确保token仅包含合法Base64URL字符(A-Za-z0-9-_)和分隔符.,且严格为三段结构:
private boolean isValidJwtFormat(String token) { String jwtPattern = "^[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+$"; return token.matches(jwtPattern); }
在JwtAuthenticationFilter中先执行该校验,格式不合法直接拒绝认证请求。
2. 启用JJWT内置的严格签名校验
JJWT 0.12.x版本支持通过ParserBuilder配置严格解析规则,强制要求signature段仅包含合法Base64URL字符:
JwtParser jwtParser = Jwts.parser() .setSigningKey(yourSigningKey) // 替换为你的签名密钥 .requireStrictSignature() // 启用后会拒绝含非法字符的signature段 .build();
启用该配置后,解析带末尾特殊字符的token时,框架会直接抛出JwtParseException,终止认证流程。
补充说明
你实现的isBase64URL校验方法是有效的,但正则校验或框架内置的严格规则可以减少自定义代码量,更贴合JJWT的原生处理逻辑。
内容的提问来源于stack exchange,提问作者박대영
相关产品推荐
相关产品推荐

