Spring Boot集成JWT时Token存储与Tomcat会话疑问
关于Spring Security + JWT中Token存储与会话的疑问解答
嗨,这个问题我碰到好多次了,咱们一步步理清楚:
1. Spring根本不会存储生成的JWT Token
JWT的核心就是无状态认证——生成的Token本身就包含了所有必要的用户身份信息(比如用户名、权限、有效期),服务端只需要验证Token的签名和有效期就能完成身份校验。所以:
- 生成的Token会直接返回给客户端,由客户端自己保存(比如存在localStorage、Cookie或者请求头里)
- 服务端完全不会存储JWT Token,每次请求时客户端带上Token,服务端实时解析验证即可
2. Tomcat里的活跃会话是怎么来的?
这是因为Spring Security默认会创建HTTP会话,哪怕你用了JWT,原因主要有两个:
- Spring Security的默认会话创建策略是
SessionCreationPolicy.IF_REQUIRED:当框架认为需要会话时(比如要存储SecurityContext、启用CSRF防护等),就会自动创建会话 - 会话里存储的不是JWT Token,而是
SecurityContext对象——这个对象包含了当前用户的认证信息(比如解析JWT后得到的UserDetails),方便同一会话内的后续请求复用认证状态
3. 如何禁用不必要的会话?
如果你想实现纯无状态的JWT认证,完全禁用会话,可以在SecurityFilterChain配置里修改会话创建策略:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 其他配置(比如JWT认证过滤器、权限规则等) .sessionManagement(sessionConfig -> sessionConfig.sessionCreationPolicy(SessionCreationPolicy.STATELESS) ); return http.build(); }
设置成STATELESS后,Spring Security就不会再创建HTTP会话,Tomcat里的活跃会话也会消失,所有请求都需要携带JWT Token进行实时认证。
内容的提问来源于stack exchange,提问作者Igor Moisés
相关产品推荐
相关产品推荐

