Cookie 与 Session 超详细讲解

HTTP 协议是无状态的 每次请求都是独立的,服务器根本记不住 "你是谁",刚登录完再发请求,服务器就不认识你了。为了跟踪用户会话 ,才出现了 Cookie + Session 这套标准方案。


一、Cookie

1. 是什么

Cookie 是服务器通过响应头 Set-Cookie 写给浏览器、保存在客户端的小型文本数据 。浏览器会自动保存,之后每次向同域名 发请求时,都会自动通过请求头 Cookie 带给服务器。

2. 核心特性

  • 存储位置:浏览器(客户端)
  • 大小限制:单条约 4KB,单域名 Cookie 数量有限
  • 生命周期:
    • 会话 Cookie:不设置过期时间,关闭浏览器就失效
    • 持久 Cookie:设置 Max-Age/Expires,到期前一直存在
  • 同源限制:只能同域名、同路径访问,不能跨域
  • 传输方式:每次请求自动携带,无需手动写代码

3. 完整流程

  1. 用户第一次请求服务器,无 Cookie
  2. 服务器生成身份标识(如 userId=123),通过响应头 Set-Cookie: userId=123 返回
  3. 浏览器自动保存该 Cookie
  4. 后续请求该域名,浏览器自动在请求头带上 Cookie: userId=123
  5. 服务器解析 Cookie,识别出用户

4. 优缺点

✅ 优点:简单、通用、无需服务器存数据、跨请求保持状态❌ 缺点:

  • 不安全:明文存在客户端,可被篡改 / 查看 / 窃取
  • 容量极小:只能存少量键值对
  • 每次请求都携带,浪费带宽

二、Session(服务器存储)

1. 是什么

Session 是保存在服务器端的用户会话数据 ,每个用户对应一个唯一的 SessionID。Session 默认依赖 Cookie 传递 SessionID,是服务器端的 "用户档案"。

2. 核心原理

  1. 服务器为每个用户创建独立的 Session,存储用户信息(登录状态、购物车等)
  2. 生成唯一标识 SessionID(如 JSESSIONID)
  3. 通过 Cookie 把 SessionID 发给浏览器
  4. 后续请求浏览器自动带 SessionID,服务器根据 ID 找到对应的 Session 数据

3. 关键特点

  • 存储位置:服务器内存 / Redis / 数据库
  • 大小:几乎无限制,可存大量用户数据
  • 生命周期:服务器设置超时时间(默认 30 分钟),超时销毁
  • 安全性:数据存在服务器,客户端只有一个无意义 ID,极难伪造

4. 完整登录流程(标准实战)

  1. 用户输入账号密码登录
  2. 服务器验证成功,创建 Session ,存入 userId=123, username=zhangsan
  3. 生成唯一 SessionID = abc123def
  4. 服务器通过 Set-Cookie: JSESSIONID=abc123def 发给浏览器
  5. 浏览器保存 Cookie,后续请求自动带上该 ID
  6. 服务器拿到 SessionID,找到对应 Session,识别用户已登录

5. 优缺点

✅ 优点:

  • 安全:敏感数据存在服务器,客户端只有 ID
  • 容量大:可存任意业务数据
  • 易管理:服务器可主动销毁 / 修改会话❌ 缺点:
  • 占用服务器内存 / 资源
  • 分布式环境下(多台服务器)Session 不共享,需要额外处理

三、Cookie 与 Session 核心区别(面试必背)

对比维度 Cookie Session
存储位置 客户端(浏览器) 服务器端
安全性 低(明文、可篡改) 高(仅传 ID,数据存服务器)
存储大小 约 4KB 几乎无限制
生命周期 浏览器控制(会话 / 持久) 服务器控制(超时销毁)
服务器压力 无 占用服务器资源
跨域支持 受同源策略限制 同 Cookie 限制
依赖关系 可独立使用 默认依赖 Cookie 传递 SessionID

四、灵魂问题:两者到底是什么关系?

不是对立,是配合使用!

  • Cookie 负责「传号」:把 SessionID 带给服务器
  • Session 负责「存档案」:在服务器存用户真实信息

一句话:Cookie 是通行证,Session 是服务器里的档案本。


五、高频八股考点

能用!用 URL 重写 :把 SessionID 拼在 URL 后面,比如:http://xxx.com/list;JSESSIONID=abc123服务器依然能解析到 SessionID。

2. 关闭浏览器 Session 就没了吗?

  • Session 存在服务器,默认 30 分钟超时才销毁
  • 关闭浏览器只是会话 Cookie 失效,下次请求没有 SessionID,服务器找不到对应 Session,看起来像 "没了",实际服务器里还在。

3. 分布式系统(多台服务器)Session 怎么共享?

三大方案:

  1. Session 粘滞:Nginx 负载均衡把同一用户固定到一台服务器
  2. Session 复制:服务器之间同步 Session(不推荐,浪费带宽)
  3. 第三方存储:Redis 统一存 Session(生产首选)
  • HttpOnly:禁止 JS 读取 Cookie,防 XSS
  • Secure:只在 HTTPS 下传输
  • SameSite:防 CSRF 跨站请求伪造
相关推荐
To_OC1 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
正在走向自律2 小时前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas
OnlineProxy3 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
excel3 小时前
研究 Vue 3 源码的收获
前端·vue.js
91刘仁德4 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
辻弋2014 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_5 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
lerhxx5 小时前
AI 应用如何高效优雅地恢复中断?—— "连接解耦 + 状态持久化"
前端·javascript
计算机魔术师5 小时前
METR 演示 AI 智能体如何篡改 Inspect 评估记录以掩盖不当行为
前端
前端snow6 小时前
ai agent --- 异步处理之 Rabbit MQ
前端