引入

HTTP 请求本身是无状态的:服务器处理完一次请求后,不会天然记住下一次请求和上一次请求属于同一个用户。登录、购物车和权限信息却要求跨请求保持状态,因此需要 Session 这样的会话机制。

正文

定义

Session 是服务器为一组相关请求保存的会话状态。客户端通常只保存一个 Session ID,服务器根据这个 ID 查找对应的会话数据。

基本流程

  1. 用户登录并提交凭证。
  2. 服务器验证成功后创建会话。
  3. 服务器把 Session ID 返回给客户端,通常放在 Cookie 中。
  4. 后续请求携带 Session ID,服务器据此恢复用户状态。
  5. 用户注销或会话过期后,服务器删除或拒绝该会话。
对比项SessionCookie
主要存储位置服务器端客户端
客户端通常保存会话标识键值数据本身
适合保存登录状态、临时业务状态标识、偏好、会话 ID
主要风险服务端存储与扩展成本泄露、伪造、跨站请求携带

Session 不是天然安全的。Session ID 被窃取后,攻击者可能冒充用户,因此应配合 HTTPSHttpOnlySecure、合理的 SameSite 和会话过期策略。

常见问题

  • Session 固定攻击:登录前后的 Session ID 未更新,攻击者可能提前植入并复用该 ID。登录成功后应重新生成会话标识。
  • 多实例部署失效:会话只存在单台服务器内时,请求切换实例可能找不到状态。可以使用共享存储,或采用经过设计的无状态认证方案。
  • 注销不彻底:只清除浏览器 Cookie 不足以保证会话失效,服务端也应使对应 Session ID 失效。

引出

Session 适合服务端需要主动控制会话生命周期的场景。若系统更重视跨服务传递身份信息,可能会使用 Token,但这并不意味着可以忽略过期、撤销和存储安全问题。