后台改完密码,用户还能继续用好几天,安全审计提了问题。查下来是只清了前端 cookie,服务端的 session 还躺在内存里,过期时间没到。

简单说:cookie 存在浏览器,session 存在服务端;sessionid 通过 cookie 带过去,服务端拿它找到会话数据。两者不是替代关系,cookie 是载体,session 是状态。

各自的边界

  • cookie:单域名 4KB 上限、数量有限制、每次请求自动带上,可以设 HttpOnly、Secure、SameSite
  • session:存服务端内存或 Redis,不受大小限制,进程重启会丢,多机部署要共享

分布式下 session 怎么办

两台机器各存一份 session,用户第一次落在 A,第二次落到 B,就掉登录。三种解法:粘性会话,配置简单但扩容和故障转移都难看;session 集中存 Redis,最常见;改成 JWT,服务端不存状态。

JWT 不是银弹。它没法立即吊销,改密码要加版本号或者维护黑名单;放 localStorage 怕 XSS,放 cookie 要 HttpOnly 加 SameSite,还得处理 CSRF。

安全上的几个必做

登录成功后重新生成 sessionid,防会话固定攻击;退出要服务端删数据并让 cookie 过期,只清 cookie 是假退出;SameSite 设 Lax 能挡掉大部分跨站请求伪造,Strict 更严,但外链进来的登录态会丢。

小站用框架默认的 session 就够,别一上来上 JWT。什么时候换:多端同时登录、要多机扩容、要开放 API 给第三方,这三件事出现任意一件再考虑。