ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

SpringBoot安全认证:JWT从入门到实战

2026/9/28 3:40:07 拓冰建站 浏览量
SpringBoot安全认证:JWT从入门到实战 前后端分离后Session认证越来越别扭。服务器存Session多节点要共享移动端还不好带Cookie。JWT无状态、自包含成了SpringBoot安全认证的主流方案。但很多人只会复制工具类不懂原理踩坑无数。这篇从入门到实战帮你一次讲透。一、JWT是什么JWT全称JSON Web Token是一串三段式字符串Header.Payload.Signature。Header声明算法Payload存数据用户ID、角色、过期时间Signature用密钥签名防篡改。它不加密只签名所以别放密码等敏感信息。服务端不存Token只验签名天然适合分布式。二、SpringBoot集成四步走第一步引依赖。jjwt-api、jjwt-impl、jjwt-jackson版本用0.11.5以上。第二步写工具类。生成Token设置subject、claims、issuedAt、expiration用HS256和密钥签名。解析Token用同一密钥验签捕获ExpiredJwtException和SignatureException。第三步写过滤器。继承OncePerRequestFilter从Authorization: Bearer xxx取Token解析后塞进SecurityContextHolder。注意过滤器只做认证授权交给Spring Security的PreAuthorize。第四步配置Security。关闭CSRF设置无状态Session放行登录和注册接口其余需认证。三、核心代码示例生成Tokenjava复制下载String token Jwts.builder() .setSubject(userId) .claim(role, role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() 86400000)) .signWith(key, SignatureAlgorithm.HS256) .compact();解析Tokenjava复制下载Claims claims Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(token) .getBody();过滤器里拿到claims.getSubject()构造UsernamePasswordAuthenticationToken放入上下文。四、刷新Token怎么设计Access Token有效期短比如30分钟Refresh Token有效期长比如7天存Redis。Access过期后前端拿Refresh换新Access。Refresh Token只能使用一次换发后旧的立即失效防止重放。如果Refresh也过期强制重新登录。五、五个必踩的坑第一密钥硬编码。别写死在代码里放配置中心或环境变量定期轮换。第二Payload放敏感信息。JWT是Base64编码不是加密任何人都能解码。手机号、身份证别放。第三不设过期时间。Token永久有效等于没有安全。必须设expiration。第四忽略签名验证。有人图省事只解码不验签攻击者改个roleadmin就提权了。第五跨域和Token存储。前端别存localStorageXSS一偷一个准。推荐HttpOnly Cookie或内存Refresh Token组合。六、进阶无状态与黑名单JWT最大优势是无状态但注销怎么办方案Redis存黑名单Key是Token的jtiTTL设成Token剩余有效期。每次请求查黑名单有就拒绝。这样既保留无状态又能主动失效。七、实战建议登录接口返回Access和Refresh两个Token网关统一验签业务服务只取用户信息用PreAuthorize(hasRole(ADMIN))做细粒度授权日志里别打印完整Token生产环境必须HTTPS。JWT不难难的是安全设计。记住三句话签名防篡改过期防重放黑名单防注销。把这套跑通你的SpringBoot认证就稳了。