spring boot基于jwt实现无状态分布式认证的核心是服务端不存状态、token自包含信息、验签即授权,需覆盖密钥管理、token生成与解析、请求拦截、权限集成及安全加固全流程;认证流程为:用户登录校验→生成jwt返回→前端携带authorization头→后端过滤器验签并设securitycontext→权限注解生效。

Spring Boot 实现基于 JWT 的无状态分布式认证体系,核心在于“服务端不存状态、Token 自包含信息、验签即授权”。它不是简单加个依赖就完事,而是需要从密钥管理、Token 生成与解析、请求拦截、权限集成到安全加固形成闭环。下面分几个关键环节讲清楚怎么做、为什么这么设计。
JWT 认证的核心流程要理清
整个链路只有四步,但每步都决定安全性:
- 用户提交账号密码,后端校验通过后,用密钥对用户 ID、角色、过期时间等信息签名,生成 JWT 字符串返回
- 前端(Vue/APP/小程序)把 Token 存在 localStorage 或内存中,后续所有请求在 Authorization: Bearer xxx 请求头里带上
- 后端通过自定义过滤器(如 JwtAuthenticationFilter)拦截请求,提取并解析 Token,验证签名、有效期、签发者等
- 验证通过后,把用户身份构造成 UsernamePasswordAuthenticationToken 放入 Spring Security 上下文,后续权限注解(如 @PreAuthorize)就能生效
关键组件配置不能漏
依赖和配置是基础,版本不匹配会导致运行时异常:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用 JJWT 0.12.x(非旧版 0.9.x),因为 Spring Security 6+ 要求 API 兼容;pom 中需引入
jjwt-api、jjwt-impl、jjwt-jackson三个模块 -
密钥必须足够强:建议用
Keys.secretKeyFor(SignatureAlgorithm.HS256)生成 256 位随机密钥,而非硬编码字符串(如 "123456") - Token 过期时间设为合理值(如 24 小时),并配合刷新机制(如双 Token:Access + Refresh)解决长期有效与安全之间的矛盾
- SecurityConfig 中禁用 session:
http.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
无状态的关键在于拦截与放行逻辑
Spring Security 默认依赖 Session,必须显式切换为无状态模式,并接管认证入口:
- 写一个 JwtAuthenticationFilter 继承
OncePerRequestFilter,覆盖doFilterInternal方法,在其中提取 Authorization 头、解析 Token、设置 SecurityContext - 该 Filter 需在
UsernamePasswordAuthenticationFilter之前注册,确保登录成功后 Token 已就位,且后续请求能被识别 - 登录接口本身要放开(
.requestMatchers("/login").permitAll()),其他路径默认受保护 - 注销操作不删 Token(JWT 无法主动作废),而是前端清空本地存储 + 后端可选维护黑名单(Redis 存失效 Token 的 jti)或缩短有效期
安全细节决定落地成败
很多项目跑通了流程却在线上出问题,往往卡在这些地方:
- Token 必须通过 HTTPS 传输,禁止 HTTP 下传;前端避免将 Token 存入 Cookie(除非设
HttpOnly + Secure,但会失去跨域灵活性) - Payload 中避免放敏感字段(如手机号、身份证号),只放必要标识(user_id、role、scope)
- 启用
clockSkewSeconds(如 30 秒)容忍服务端与客户端时间偏差,防止因系统时间不准导致频繁 exp 失效 - 结合
@EnableMethodSecurity使用@PreAuthorize("hasRole('ADMIN')")做细粒度方法级鉴权,比 URL 级更灵活










