Session、Cookie 的工作原理以及优缺点

Session 和 Cookie 的工作原理核心是**"服务端存储+客户端标识"** 与 "客户端存储" 的差异,具体流程如下:

一、Session 的工作原理

Session 依赖"服务端存储会话数据+客户端携带会话标识"实现,流程分 4 步:

1.用户登录验证

  • 用户输入账号密码发起登录请求,服务端验证身份通过后,创建一个专属的 Session 对象(存储用户信息、权限、登录时间等数据),并生成唯一的 Session ID(如一串随机字符串)。

2.传递 Session ID

  • 服务端将 Session ID 写入一个 Cookie(通常名为 JSESSIONID 或 PHPSESSID),通过 HTTP 响应头发送给客户端浏览器。

3.客户端存储与携带

  • 浏览器接收 Cookie 后,将其保存在本地(内存或硬盘);后续用户访问该网站时,浏览器会自动在 HTTP 请求头中携带此 Cookie(含 Session ID)。

4.服务端确认身份

  • 服务端接收请求后,从 Cookie 中提取 Session ID,通过该 ID 在服务端(内存、数据库、Redis 等)查询对应的 Session 对象,确认用户身份后返回对应内容。若查询不到 Session(如 Session 过期、ID 无效),则要求用户重新登录。

二、Cookie 的工作原理

Cookie 是服务端发送给客户端的"小型文本文件",全程在客户端存储,流程分 3 步:

  • 服务端处理请求时(如用户登录、设置偏好),通过 HTTP 响应头的 Set-Cookie 字段,将需要存储的信息(如用户 ID、主题偏好)封装成 Cookie(可设置过期时间、域名、路径等属性),发送给客户端。
  • 浏览器接收后,按 Cookie 的属性(如过期时间)将其存储在本地(临时 Cookie 存内存,关闭浏览器失效;持久 Cookie 存硬盘,直到过期)。
  • 后续用户访问该 Cookie 对应的域名/路径时,浏览器会自动在 HTTP 请求头的 Cookie 字段中携带所有符合条件的 Cookie,服务端读取后即可获取客户端存储的信息(如确认用户身份、加载用户偏好)。

三、Session 的优缺点

优点

  • 安全性较高:核心数据(如用户信息、权限)存储在服务端,客户端仅携带 Session ID,有效避免数据被篡改。

  • 数据类型灵活:服务端存储 Session 时,可支持复杂数据类型(如对象、数组),不限于文本格式。

缺点

  • 服务端压力大:每个用户会话都需占用服务端资源(如内存、数据库),高并发场景下易导致性能瓶颈。

  • 扩展性差:分布式系统中,Session 需通过共享存储(如 Redis)同步,增加部署复杂度,否则用户跨节点访问会丢失会话。

  • 依赖 Cookie:默认通过 Cookie 传递 Session ID,若用户禁用 Cookie,需通过 URL 重写等方式兼容,体验和安全性下降。

四、Cookie 的优缺点

优点

  • 服务端无压力:数据存储在客户端,服务端无需额外存储资源,适合保存轻量信息(如用户偏好、登录状态标记)。

  • 使用便捷:浏览器会自动在请求中携带 Cookie,无需开发者手动处理数据传递逻辑。

缺点

  • 安全性低:数据明文或简单加密后存储在客户端,易被窃取(如 XSS 攻击)或篡改(如 CSRF 攻击),不适合存储敏感信息。

  • 容量与格式限制:单条 Cookie 容量通常不超过 4KB,且仅支持文本格式,无法存储复杂数据。

  • 跨域受限:默认遵循同源策略,无法在不同域名间共享,跨域场景下需额外配置(如 CORS),兼容性较差。

  • 易被禁用:用户可在浏览器中手动禁用 Cookie,导致依赖 Cookie 的功能(如自动登录)失效。

相关推荐
苏渡苇5 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long31616 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
Serene_Dream39 分钟前
JVM 并发 GC - 三色标记
jvm·面试
rannn_11143 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人2 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法2 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化3 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
我爱加班、、3 小时前
Websocket能携带token过去后端吗
前端·后端·websocket