详细讲解session和cookie

77 阅读3分钟

Session 和 Cookie 是 Web 开发中用于保持用户状态(状态管理) 的两种常见机制。它们虽然都可以实现“记住用户”的功能,但本质、存储方式、生命周期等都不一样。

一、背景:HTTP 是无状态协议

HTTP 本身是无状态的 —— 每次请求服务器都像是第一次,不会记住用户身份。因此,为了“记住用户”,Web 就引入了 CookieSession 机制。


二、Cookie 是什么?

Cookie 是保存在客户端浏览器中的一小段文本信息。

1. 工作原理:

  • 第一次用户访问服务器,服务器可以通过响应头设置 Cookie:

    Set-Cookie: username=Jack; Expires=Wed, 31 Dec 2025 23:59:59 GMT;
    
  • 浏览器保存 Cookie。

  • 后续请求时,浏览器自动把 Cookie 附加到请求头中发回服务器:

    Cookie: username=Jack
    

2. 特点:

  • 保存在客户端浏览器。
  • 一般大小限制为 4KB。
  • 可以设置有效期(Expires / Max-Age),超时后浏览器自动删除。
  • 可以设置作用域(域名/路径)。

三、Session 是什么?

Session 是保存在服务器端的会话信息,用于跟踪用户状态。

1. 工作原理:

  • 第一次用户访问时,服务器生成一个唯一的 SessionID,并将该 ID 通过 Cookie 发送给客户端:

    Set-Cookie: JSESSIONID=ABC123456;
    
  • 服务器端创建一个内存/缓存结构存储该 ID 对应的数据(如用户信息)。

  • 客户端后续访问时自动携带这个 Cookie,服务器通过 SessionID 找到对应的数据。

2. 特点:

  • 保存在服务器端(例如:内存、数据库、Redis)。
  • 默认不会永久保存,生命周期通常是“用户关闭浏览器”或“Session过期”(默认 30 分钟)。
  • 安全性比 Cookie 高,不容易被伪造。

四、Session 与 Cookie 的对比

项目CookieSession
存储位置客户端浏览器服务器
安全性相对较低,容易被篡改/盗取高,数据在服务器,不暴露给用户
生命周期可设置时间,默认浏览器关闭即失效通常服务器设置过期时间(如 30分钟)
数据大小限制每个域名最多 4KB没有限制(取决于服务器内存)
占用资源占用客户端资源占用服务器资源
应用场景记住登录状态,保存偏好设置登录验证、保存用户信息

五、举个例子:登录验证流程

  1. 用户在登录页面输入账号密码。

  2. 服务器验证通过,创建 Session:

    session.setAttribute("user", userObject);
    
  3. 服务器返回给浏览器一个 Cookie:

    Set-Cookie: JSESSIONID=xyz123;
    
  4. 浏览器保存该 Cookie。

  5. 用户访问其他页面时,浏览器自动附带 Cookie。

  6. 服务器读取 Cookie 中的 SessionID,从服务器中取出用户信息。


六、常见面试问题整理

  1. 为什么使用 Session 而不是直接把所有数据放在 Cookie 里?
    → Cookie 数据存在客户端,容易被篡改且暴露隐私;Session 更安全、容量更大。

  2. Session 是怎么实现的?
    → 本质是服务端用一个 Map 结构:sessionID -> userData,通过 Cookie 传递 sessionID。

  3. Cookie 和 LocalStorage 有什么区别?

    • Cookie 会自动随每个 HTTP 请求发送给服务器;
    • LocalStorage 仅存于浏览器本地,不随请求发送;
    • Cookie 可用于身份验证,LocalStorage 适合做缓存。

七、Session/Cookie 安全建议

风险建议
会话劫持(Session Hijacking)使用 HTTPS、设置 HttpOnlySecure
XSS 攻击对输出内容进行转义,防止注入脚本
CSRF 攻击加 CSRF Token 校验请求来源
Cookie 被篡改设置签名/加密