Session 和 Cookie 是 Web 开发中用于保持用户状态(状态管理) 的两种常见机制。它们虽然都可以实现“记住用户”的功能,但本质、存储方式、生命周期等都不一样。
一、背景:HTTP 是无状态协议
HTTP 本身是无状态的 —— 每次请求服务器都像是第一次,不会记住用户身份。因此,为了“记住用户”,Web 就引入了 Cookie 和 Session 机制。
二、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 的对比
| 项目 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端浏览器 | 服务器 |
| 安全性 | 相对较低,容易被篡改/盗取 | 高,数据在服务器,不暴露给用户 |
| 生命周期 | 可设置时间,默认浏览器关闭即失效 | 通常服务器设置过期时间(如 30分钟) |
| 数据大小限制 | 每个域名最多 4KB | 没有限制(取决于服务器内存) |
| 占用资源 | 占用客户端资源 | 占用服务器资源 |
| 应用场景 | 记住登录状态,保存偏好设置 | 登录验证、保存用户信息 |
五、举个例子:登录验证流程
-
用户在登录页面输入账号密码。
-
服务器验证通过,创建 Session:
session.setAttribute("user", userObject); -
服务器返回给浏览器一个 Cookie:
Set-Cookie: JSESSIONID=xyz123; -
浏览器保存该 Cookie。
-
用户访问其他页面时,浏览器自动附带 Cookie。
-
服务器读取 Cookie 中的 SessionID,从服务器中取出用户信息。
六、常见面试问题整理
-
为什么使用 Session 而不是直接把所有数据放在 Cookie 里?
→ Cookie 数据存在客户端,容易被篡改且暴露隐私;Session 更安全、容量更大。 -
Session 是怎么实现的?
→ 本质是服务端用一个 Map 结构:sessionID -> userData,通过 Cookie 传递 sessionID。 -
Cookie 和 LocalStorage 有什么区别?
- Cookie 会自动随每个 HTTP 请求发送给服务器;
- LocalStorage 仅存于浏览器本地,不随请求发送;
- Cookie 可用于身份验证,LocalStorage 适合做缓存。
七、Session/Cookie 安全建议
| 风险 | 建议 |
|---|---|
| 会话劫持(Session Hijacking) | 使用 HTTPS、设置 HttpOnly、Secure |
| XSS 攻击 | 对输出内容进行转义,防止注入脚本 |
| CSRF 攻击 | 加 CSRF Token 校验请求来源 |
| Cookie 被篡改 | 设置签名/加密 |