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 跨站请求伪造
相关推荐
SoaringHeart10 小时前
Flutter最佳实践:键盘辅助视图输入框天添加图片附件
前端·flutter
专注_每天进步一点点10 小时前
SLB(绑定弹性公网ip)-gateway-业务pod,gateway上出现reset by peer,业务pod上没有reset by peer
服务器·tcp/ip·gateway
kyriewen10 小时前
我看完这篇安全论文——AI推荐的npm包,92%是编出来的
前端·javascript·ai编程
csdn_aspnet11 小时前
GitHub Actions自动化运维实战,用CI/CD流水线实现测试、部署、安全扫描一体化
运维·安全·ci/cd·自动化·github
ACP广源盛1392462567311 小时前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件
小心我捶你啊11 小时前
数据采集和Web解锁不是一回事,从用途到规则区分
前端·爬虫·网络协议
hunterandroid12 小时前
[鸿蒙从零到一] ArkUI 基础组件实战:Text、Image、Button 与 TextInput
前端
fsssb12 小时前
Chromium 源码学习笔记(五):一次点击,在进入 JS 之前先经历了什么?
前端
hunterandroid12 小时前
WorkManager 可靠性实战:唯一任务、重试与幂等设计
android·前端