记住我到底把什么放进了 cookie?登出以后这个 cookie 还能用吗?重启服务器用户会不会被踢下线?连续输错密码有没有内置的锁定?这篇在 Spring Boot 4.0.8、Spring Security 7 上手工带 Cookie 逐个验证。
不开 rememberMe,登录时勾了「记住我」→ HTTP 302,Set-Cookie 的名字 ['JSESSIONID'] 开了 rememberMe,登录时没勾 → Set-Cookie 的名字 ['JSESSIONID'] 登录时勾了「记住我」→ HTTP 302,remember-me 这条 Set-Cookie 的属性:Expires=Thu, 05 Nov 2026 00:43:00 GMT; Max-Age=1209600; Path=/; HttpOnly cookie 值 base64 解码后有 4 段:用户名=alice,过期时间距现在 14.0 天,第 3 段是 SHA256,最后一段是签名(长度 64) 只带 remember-me cookie(没有 JSESSIONID)GET /me → HTTP 200 RememberMeAuthenticationToken,name=alice,服务端给了新的 ['JSESSIONID'] 同一个浏览器 GET /sensitive(要求 fullyAuthenticated;现在的会话是 remember-me 恢复的)→ HTTP 302,Location http://127.0.0.1:9602/login 用密码登录的那个会话 GET /sensitive → HTTP 200 敏感页:UsernamePasswordAuthenticationToken 服务端改了 alice 的密码之后,拿旧的 remember-me cookie GET /me → HTTP 302,Location http://127.0.0.1:9602/login
配置加上勾选才会下发 cookie;恢复的身份是 RememberMeAuthenticationToken,过不了 fullyAuthenticated;改密码使旧 cookie 失效。
POST /logout → HTTP 302,清除的 cookie ['remember-me=']
登出之后,把登出前保存的 remember-me cookie 原样发回去 GET /me → HTTP 200 RememberMeAuthenticationToken,name=alice
应用重启(没配 key)后,再用这个 cookie GET /me → HTTP 302,Location http://127.0.0.1:9603/login
rememberMe 配了固定 key(用户的密码是固定的 bcrypt 哈希),应用重启后用重启前的 cookie GET /me → HTTP 200 RememberMeAuthenticationToken,name=alice
用户密码在内存里写成 {noop}pw:登录前存的密码前缀 {noop},登录一次之后变成 {bcrypt}
固定 key,但密码是 {noop}pw 的用户:重启后用重启前的 cookie GET /me → HTTP 302,Location http://127.0.0.1:9605/login登出不会作废已保存的 cookie;默认 key 随机,重启后失效;固定 key 要求用户密码哈希不变。
连续 30 次错误密码 → 全部是 ['302login?error'] 第 31 次用正确密码 → HTTP 302,Location http://127.0.0.1:9606/ 不存在的用户 nobody 登录失败后,登录页上的提示:「Invalid credentials」 alice 密码错误,登录页上的提示:「Invalid credentials」
30 次错误密码后正确密码照样成功;登录页不区分用户是否存在。
第 1 次错误密码 → HTTP 302,Location http://127.0.0.1:9607/login?error,提示「Invalid credentials」 第 2 次错误密码 → HTTP 302,Location http://127.0.0.1:9607/login?error,提示「Invalid credentials」 第 3 次错误密码 → HTTP 302,Location http://127.0.0.1:9607/login?error,提示「Invalid credentials」 第 4 次用正确密码 → HTTP 302,Location http://127.0.0.1:9607/login?error,提示「Invalid credentials」 对照:不存在的用户 nobody → 提示「Invalid credentials」 服务端收到的失败事件:AuthenticationFailureBadCredentialsEvent:Bad credentials | AuthenticationFailureBadCredentialsEvent:Bad credentials | AuthenticationFailureBadCredentialsEvent:Bad credentials | AuthenticationFailureLockedEvent:User account is locked | AuthenticationFailureBadCredentialsEvent:Bad credentials 清掉失败计数之后用正确密码 → HTTP 302,Location http://127.0.0.1:9607/
监听失败事件计数、返回 accountLocked;页面提示不泄露锁定状态。