HTTP 协议是无状态的 每次请求都是独立的,服务器根本记不住 "你是谁",刚登录完再发请求,服务器就不认识你了。为了跟踪用户会话 ,才出现了 Cookie + Session 这套标准方案。
一、Cookie
1. 是什么
Cookie 是服务器通过响应头 Set-Cookie 写给浏览器、保存在客户端的小型文本数据 。浏览器会自动保存,之后每次向同域名 发请求时,都会自动通过请求头 Cookie 带给服务器。
2. 核心特性
- 存储位置:浏览器(客户端)
- 大小限制:单条约 4KB,单域名 Cookie 数量有限
- 生命周期:
- 会话 Cookie:不设置过期时间,关闭浏览器就失效
- 持久 Cookie:设置
Max-Age/Expires,到期前一直存在
- 同源限制:只能同域名、同路径访问,不能跨域
- 传输方式:每次请求自动携带,无需手动写代码
3. 完整流程
- 用户第一次请求服务器,无 Cookie
- 服务器生成身份标识(如
userId=123),通过响应头Set-Cookie: userId=123返回 - 浏览器自动保存该 Cookie
- 后续请求该域名,浏览器自动在请求头带上
Cookie: userId=123 - 服务器解析 Cookie,识别出用户
4. 优缺点
✅ 优点:简单、通用、无需服务器存数据、跨请求保持状态❌ 缺点:
- 不安全:明文存在客户端,可被篡改 / 查看 / 窃取
- 容量极小:只能存少量键值对
- 每次请求都携带,浪费带宽
二、Session(服务器存储)
1. 是什么
Session 是保存在服务器端的用户会话数据 ,每个用户对应一个唯一的 SessionID。Session 默认依赖 Cookie 传递 SessionID,是服务器端的 "用户档案"。
2. 核心原理
- 服务器为每个用户创建独立的 Session,存储用户信息(登录状态、购物车等)
- 生成唯一标识
SessionID(如 JSESSIONID) - 通过 Cookie 把
SessionID发给浏览器 - 后续请求浏览器自动带
SessionID,服务器根据 ID 找到对应的 Session 数据
3. 关键特点
- 存储位置:服务器内存 / Redis / 数据库
- 大小:几乎无限制,可存大量用户数据
- 生命周期:服务器设置超时时间(默认 30 分钟),超时销毁
- 安全性:数据存在服务器,客户端只有一个无意义 ID,极难伪造
4. 完整登录流程(标准实战)
- 用户输入账号密码登录
- 服务器验证成功,创建 Session ,存入
userId=123, username=zhangsan - 生成唯一
SessionID = abc123def - 服务器通过
Set-Cookie: JSESSIONID=abc123def发给浏览器 - 浏览器保存 Cookie,后续请求自动带上该 ID
- 服务器拿到
SessionID,找到对应 Session,识别用户已登录
5. 优缺点
✅ 优点:
- 安全:敏感数据存在服务器,客户端只有 ID
- 容量大:可存任意业务数据
- 易管理:服务器可主动销毁 / 修改会话❌ 缺点:
- 占用服务器内存 / 资源
- 分布式环境下(多台服务器)Session 不共享,需要额外处理
三、Cookie 与 Session 核心区别(面试必背)
| 对比维度 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务器端 |
| 安全性 | 低(明文、可篡改) | 高(仅传 ID,数据存服务器) |
| 存储大小 | 约 4KB | 几乎无限制 |
| 生命周期 | 浏览器控制(会话 / 持久) | 服务器控制(超时销毁) |
| 服务器压力 | 无 | 占用服务器资源 |
| 跨域支持 | 受同源策略限制 | 同 Cookie 限制 |
| 依赖关系 | 可独立使用 | 默认依赖 Cookie 传递 SessionID |
四、灵魂问题:两者到底是什么关系?
不是对立,是配合使用!
- Cookie 负责「传号」:把 SessionID 带给服务器
- Session 负责「存档案」:在服务器存用户真实信息
一句话:Cookie 是通行证,Session 是服务器里的档案本。
五、高频八股考点
1. 浏览器禁用 Cookie 了,Session 还能用吗?
能用!用 URL 重写 :把 SessionID 拼在 URL 后面,比如:http://xxx.com/list;JSESSIONID=abc123服务器依然能解析到 SessionID。
2. 关闭浏览器 Session 就没了吗?
- Session 存在服务器,默认 30 分钟超时才销毁
- 关闭浏览器只是会话 Cookie 失效,下次请求没有 SessionID,服务器找不到对应 Session,看起来像 "没了",实际服务器里还在。
3. 分布式系统(多台服务器)Session 怎么共享?
三大方案:
- Session 粘滞:Nginx 负载均衡把同一用户固定到一台服务器
- Session 复制:服务器之间同步 Session(不推荐,浪费带宽)
- 第三方存储:Redis 统一存 Session(生产首选)
4. Cookie 有哪些安全属性?
HttpOnly:禁止 JS 读取 Cookie,防 XSSSecure:只在 HTTPS 下传输SameSite:防 CSRF 跨站请求伪造