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 跨站请求伪造
相关推荐
tedcloud12341 分钟前
Kimi-K3 部署指南:大模型应用开发环境搭建实践
linux·运维·服务器·开源·音视频
保加利亚的风44 分钟前
Docker 学习文档(Mac + Docker Desktop 版)
前端·后端
java1234_小锋1 小时前
Vue3专题 - 条件渲染
前端·javascript·vue.js
明月_清风1 小时前
🚀 AI Agent 完全入门指南:从 LLM 到生产落地,新手必懂的 34 个核心概念
前端·后端·ai编程
鸽鸽1 小时前
Vue 3 API 完全指南:从 Options 到 Composition 的进阶之路
前端·vue.js
名字还没想好☜1 小时前
React 用 Portal + Context 实现全局 Toast:一次调用、自动消失与队列管理
前端·javascript·react.js·react·next.js
深念Y1 小时前
ZTE_UZ901_NVRAM经验总结
linux·服务器·网络·嵌入式硬件·嵌入式·随身wifi
小小龙学IT1 小时前
Taskflow:用一张“任务图“玩转现代 C++ 并行编程开源项
c++·开源·github
HjhIron1 小时前
React Router 通关指南:从入门到鉴权,一个项目全搞定
前端