yl-backend/docs/springSecurity.md

46 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

是的Spring Security 在每次带有 token 的请求中,确实都会走一遍认证流程,但并不一定每次都“存储”认证信息,具体行为取决于你使用的 token 类型(如 JWT、Session、OAuth2 等)和安全配置。
一、JWT常见于无状态登录
如果你使用的是 JWTJSON Web Token这种无状态认证机制
每次请求都要带上 token通常放在 Authorization Header 中)
Spring Security 会通过一个过滤器(如 OncePerRequestFilter解析这个 token
验证 token 的有效性(比如签名、过期时间)
从 token 中解析用户信息(如用户名、角色),然后在当前请求的 SecurityContext 中构建认证对象
请求处理完后SecurityContext 是线程局部的,不会跨请求存储,下次请求又要重新走这个流程
✅ 好处是服务无状态、扩展性强
❌ 每次请求都要解析和验证 token有一定性能开销
二、Session默认方式
如果你使用的是 Spring Security 默认的基于 Session 的认证机制:
登录成功后服务端会生成一个 SessionId并将其通过 Cookie 返回给客户端
客户端下次请求自动带上 Cookie
Spring Security 会通过这个 SessionId 直接从服务端 Session 中获取用户的认证信息
如果存在有效 Session就不需要重新认证不走身份验证流程
✅ 好处是性能较高
❌ 缺点是服务有状态,不利于分布式部署(需共享 Session
三、OAuth2 TokenResource Server 模式)
如果你用的是 OAuth2比如使用 spring-security-oauth2-resource-server
每次请求带上 Bearer Token
Spring Security 会通过配置好的 JwtDecoder 验证 token或远程调用 introspection endpoint
同样会在请求级别构建一次 Authentication 对象,不会存储
总结
场景 每次验证 Token 认证信息是否持久化
JWT ✅ 是 ❌ 否,线程局部
Session ❌ 否,登录一次 ✅ 是,存储在 Session
OAuth2 Resource Server ✅ 是 ❌ 否,线程局部