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. 通过 CookieSessionID 发给浏览器
  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 跨站请求伪造
相关推荐
Csvn5 小时前
TypeScript:你以为安全的 `JSON.parse` 其实是颗雷 — 运行时类型安全实战
前端·javascript
橘子星5 小时前
深入理解线性数据结构:栈、队列与链表
前端·javascript
dadaobusi5 小时前
Linux内核完成大量内存/调度/时间子系统初始化的关键阶段
java·linux·前端
用户059540174465 小时前
Redis 缓存过期不一致踩坑实录:一个 bug 让我排查了 3 小时,最终用 Pytest 自动化堵上漏洞
前端·css
唐墨1235 小时前
关于linux kernel错误码为负数编码这件事情,我个人的一些看法
linux·运维·服务器
东风破_5 小时前
AJAX 异步请求:从回调地狱到 async/await,到底解决了什么?
前端
Larcher5 小时前
JS 数据类型的八重人格与内存真相
前端·javascript
星辰徐哥5 小时前
工具推荐:HTML5+AI开发必备的前端调试工具
前端·人工智能·html5
Full Stack Developme5 小时前
Linux Shell 教程概览
linux·前端·chrome
Maimai108085 小时前
Web3 前端实时通信如何落地:从 SSE 订阅到行情、订单与账户状态更新
前端·javascript·react.js·前端框架·web3·状态模式