当前位置: 首页 > java >正文

cookie和session的区别

一、基本概念

1. Cookie

  • 定义​​:Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据(通常小于4KB),浏览器会在后续请求中自动携带该数据。
  • 作用​​:用于跟踪用户状态(如登录状态)、记录用户偏好(如语言设置)等。
  • 存储位置​​:​​客户端​​(浏览器存储)。
  • 传输方式​​:通过 HTTP 头部的 Set-Cookie(服务器下发)和 Cookie(客户端上传)字段交互。

2. Session

  • 定义​​:Session 是服务器端创建的、用于存储用户会话数据的机制。每个用户会话对应一个唯一的 Session ID,通常通过 Cookie 传递
  • ​作用​​:维护用户与服务器之间的状态(如购物车数据、敏感信息)。
  • ​存储位置​​:​​服务器端​​(内存、数据库、文件系统或 Redis 等缓存)。
  • ​​传输方式​​:Session ID 通过 Cookie 或 URL 传递,服务器通过此 ID 查找对应的用户数据。

二、底层工作原理

1.Cooke的工作流程

1. 用户首次访问网站 → 服务器生成数据并通过 `Set-Cookie` 响应头下发。
2. 浏览器保存 Cookie → 存储于本地(内存或硬盘)。
3. 后续请求自动携带 Cookie → 服务器读取并验证。

2.Session的工作流程

1. 用户首次访问 → 服务器创建 Session 并生成唯一 Session ID。
2. 通过 `Set-Cookie` 将 Session ID 发送给浏览器(如 `JSESSIONID=abc123`)。
3. 浏览器后续请求携带 Session ID → 服务器通过 ID 查找对应的 Session 数据。

三、核心区别

在这里插入图片描述

存储

在这里插入图片描述

  1. Cookie 的属性控制​​
    HttpOnly:禁止 JavaScript 通过document.cookie访问 Cookie,防止 XSS 攻击窃取敏感信息(如 Session ID)
    Secure:强制 Cookie 仅通过 HTTPS 协议传输,防止 HTTP 明文传输时被中间人窃听。生产环境必须启用(开发环境可关闭)
    SameSite:控制 Cookie 在跨站请求中是否发送,防御 CSRF 攻击。
    在这里插入图片描述

  2. Session 的存储后端​​
    ​​内存​​:快速但重启丢失,不适合分布式系统。
    ​​数据库​​:持久化但性能较低。
    ​Redis/Memcached​​:高性能,支持分布式共享。

  3. 无 Cookie 的 Session 实现​​
    ​​URL 重写​​:将 Session ID 嵌入 URL(如 https://example.com?sid=abc123),但暴露风险高。

// 生成带 Session ID 的 URL
String url = response.encodeURL("/page");
// 输出:<a href="/page;jsessionid=abc123">

​隐藏表单字段​​:通过 HTML 表单传递 Session ID,仅适用于 POST 请求。

<form action="/submit" method="post"><input type="hidden" name="sid" value="abc123"><input type="text" name="data"><button>Submit</button>
</form>

用户看不到它,但提交表单时,该字段的值会随其他表单数据一起发送到服务器。
在这里插入图片描述

四、安全性对比

在这里插入图片描述

安全增强措施

​​Cookie​​:使用 Secure(仅 HTTPS)、HttpOnly(防 JS 读取)、SameSite=Strict(防跨站请求)。
​​Session​​:绑定客户端指纹(IP + User-Agent)、设置短有效期、使用 HTTPS。

五、应用场景

​​Cookie 适用场景​​
用户偏好设置(如主题、语言)。
长期登录状态(“记住我”功能)。
跟踪用户行为(需符合隐私政策,如 GDPR)。
​​Session 适用场景​​
临时用户登录状态(如银行网站)。
存储敏感数据(如购物车中的商品、支付信息)。
需要服务端控制会话的场景(如强制超时退出)。

为什么不能只用Cookie

  1. ​​安全性​​:Cookie 存储敏感数据易被窃取(如用户 ID)。
  2. 容量限制​​:无法存储复杂数据(如用户购物车中的商品列表)。
  3. 性能​​:每次请求携带所有 Cookie 会增加带宽消耗。

为什么不能只用Session

  1. ​​依赖标识传递​​:Session ID 仍需通过 Cookie 或 URL 传递。
  2. 服务器压力​​:高并发场景下,Session 数据占用内存可能导致服务器崩溃。
  3. 分布式挑战​​:多服务器环境下需共享 Session 数据(需 Redis 等工具)。

现代替代方案

Token-Based 认证(如 JWT)​:

无状态令牌,用户数据加密存储在客户端。
适用于微服务、移动端 API。
示例:JWT(JSON Web Token)。

​​Signed Cookies​​:

对 Cookie 内容签名,防止篡改。
示例:cookie-signature 库加密数据。

总结

在这里插入图片描述

http://www.xdnf.cn/news/5362.html

相关文章:

  • Qt开发经验 --- 避坑指南(14)
  • 【Linux篇】高并发编程终极指南:线程池优化、单例模式陷阱与死锁避坑实战
  • SpringBoot主入口类分析
  • 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框
  • 【QT】UDP通讯本地调试
  • Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析
  • 趣味编程:四叶草
  • Python赋能自动驾驶:如何打造高效的环境感知系统
  • 嵌入式硬件篇---TOF|PID
  • 微软向现实低头:悄悄延长Windows 10的Microsoft 365支持
  • 每日c/c++题 备战蓝桥杯(P1002 [NOIP 2002 普及组] 过河卒)
  • 数据仓库Hive
  • 【即插即用涨点模块】RFAConv感受野注意力卷积:突破卷积参数共享瓶颈,感受野注意力重塑空间特征提取【附源码】
  • 深度剖析多模态大模型中的视频编码器算法
  • 高级数据结构:线段树
  • 《Redis应用实例》学习笔记,第一章:缓存文本数据
  • HVV蓝队初级面试总结
  • 【动态规划】斐波那契数列模型
  • Go语言从零构建SQL数据库(9)-数据库优化器的双剑客
  • Gin 框架入门
  • Java学习笔记(对象)
  • 游戏引擎学习第272天:显式移动转换
  • app加固
  • Vue.js 页面切换空白与刷新 404 问题深度解析
  • 《智能网联汽车 自动驾驶功能道路试验方法及要求》 GB/T 44719-2024——解读
  • 视频编解码学习三之显示器续
  • 鸿蒙跨平台开发教程之Uniapp布局基础
  • LWIP的ICMP协议
  • 小刚说C语言刷题—1058 - 求出100至999范围内的所有水仙花数
  • 每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)