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 跨站请求伪造
相关推荐
广州灵眸科技有限公司1 小时前
4G 模组开机自连 systemd 服务方案:基于灵眸科技EAI1106--Core-T
运维·服务器·科技
wflynn2 小时前
GitHub 日榜趋势速报 | 2026-10-28
开源·github
@大迁世界2 小时前
Firefox 本地模式:localhost 再见了 ?
前端·架构
qq_401700413 小时前
Linux设备树详解
linux·运维·服务器
刚入门的大一新生4 小时前
Linux-信号
linux·运维·服务器
米米商聊4 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome8885 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌6 小时前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易6 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常6 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端