登录态到底存在哪里?session id 登录后为什么会变?STATELESS 是什么效果?自己写的登录接口为什么下次请求又要登录?这篇在 Spring Boot 4.0.8、Spring Security 7 上手动带 cookie 逐步验证。
未登录 GET /who → HTTP 302,Location http://127.0.0.1:9601/login 访问 /login 页面时拿到的 JSESSIONID 前 8 位 = 6122A52D(没有登录的会话);POST /login → HTTP 302,Location http://127.0.0.1:9601/who?continue;登录之后的 JSESSIONID 前 8 位 = A5EAB0DE(与登录前不同) 登录响应的 Set-Cookie:JSESSIONID=A5EAB0DEAE7119559F5937ABD8809275; Path=/; HttpOnly GET /who → 用户=alice,session=A5EAB0DE GET /sess → session 属性 [SPRING_SECURITY_CONTEXT, SPRING_SECURITY_SAVED_REQUEST],SPRING_SECURITY_CONTEXT 的类型=SecurityContextImpl,maxInactiveInterval=1800 秒
服务端 HttpSession;cookie 只有 JSESSIONID(HttpOnly,没有 Secure 与 SameSite)。
sessionFixation().none():登录前 33D57952,登录后 33D57952,没有变
默认登录后换 session id;none() 会让 id 不变。
带 Basic 的 GET /who → HTTP 200 用户=alice,session=没有;响应有 Set-Cookie:False 不带凭据再请求一次 → HTTP 401(服务端什么都没记住)
STATELESS 不创建会话,每个请求都要带凭据。
GET /api/login-nosave → HTTP 200 已认证 alice,没有保存;本请求内 SecurityContextHolder 里是 alice;Set-Cookie 条数 0
随后带着 Cookie GET /who → HTTP 302,Location http://127.0.0.1:9604/login
GET /api/login-save → HTTP 200 已认证 alice,并保存到 SecurityContextRepository;本请求内 SecurityContextHolder 里是 alice;Set-Cookie 条数 1
随后带着 Cookie GET /who → HTTP 200,用户=alice,session=A7AEFDBE要显式 saveContext 到 SecurityContextRepository,否则下个请求就没登录。
POST /logout → HTTP 302,Location http://127.0.0.1:9604/login?logout;响应 Set-Cookie:[] 拿着退出前的旧 Cookie 再 GET /who → HTTP 302,Location http://127.0.0.1:9604/login
POST /logout 让 session 作废,旧 cookie 再访问被跳回登录页。