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

Session和Cookie的定义是什么?他们之间有什么区别?

一、什么是 Cookie?

Cookie 是一小段文本信息(最多约4KB),由服务器生成并发送给浏览器,浏览器会将其保存在用户本地。此后,浏览器每次向同一服务器发起请求时,都会自动携带这个 Cookie。

主要特点:

  • 存储位置:客户端(浏览器)。

  • 生命周期:可设置有效期。可以是会话级(浏览器关闭即失效),也可以设置一个未来的过期时间。

  • 参与方:服务器创建,浏览器保存和发送。

  • 安全性:相对较低,因为存储在客户端,可能被用户查看或篡改。不应存储敏感信息(如密码)。

常见用途:

  1. 记录用户偏好:如语言设置、主题样式(深色/浅色)。

  2. 记录非关键信息:如购物车商品ID(未登录时)。

  3. 用户追踪:广告商用来记录用户的浏览习惯。

Cookie 的工作流程:

deepseek_mermaid_20250923_e714e5

 

二、什么是 Session?

Session 是一种在服务器端保存用户状态信息的机制。因为 HTTP 协议是无状态的,Session 被用来跟踪用户在整个网站访问期间的行为。

核心思想:

服务器为每个用户创建一个唯一的标识(称为 Session ID),并通过 Cookie 将这个 ID 传递给浏览器。浏览器后续的请求都会带着这个 Session ID。服务器通过这个 ID 来找到对应的服务器端存储的数据(如用户ID、登录状态等)。

主要特点:

  • 存储位置:服务器端(内存、文件、数据库等)。

  • 生命周期:从用户会话开始到结束(通常有超时时间,如用户30分钟无活动则失效)。

  • 安全性:相对较高,因为敏感数据存储在服务器端,客户端只保存一个无意义的ID。

  • 存储量:理论上只受服务器资源限制。

常见用途:

  1. 用户登录状态:这是最经典的用法。登录成功后,服务器在 Session 中记录 user_id = 123

  2. 购物车信息(已登录用户)。

  3. 表单令牌(CSRF Token):用于防止跨站请求伪造。

Session 的工作流程(结合Cookie):

deepseek_mermaid_20250923_5317aa

 

三、核心区别总结(表格对比)

 
特性CookieSession
存储位置 客户端(浏览器) 服务器端
数据类型与大小 只能是字符串,大小有限制(约4KB) 可以是任意对象(如Java对象),大小理论上无限
安全性 较低,数据存储在客户端,可能被查看和篡改 较高,敏感数据存储在服务器,客户端只有ID
生命周期 可长期有效,由过期时间控制 通常较短,浏览器关闭或超时后失效
性能影响 不占用服务器资源,但每次请求都会携带,增加带宽 占用服务器内存/存储,用户量巨大时影响性能
依赖性 可以独立使用 通常依赖于 Cookie 来传递 Session ID

四、一个典型的登录场景(综合运用)

  1. 登录请求:用户在登录页面输入用户名和密码,点击提交。

  2. 验证身份:服务器验证凭证正确。

  3. 创建Session:服务器在内存(或数据库)中创建一个新的 Session,并存入 user_id 等关键信息。

  4. 设置Cookie:服务器生成一个唯一的 Session ID,并通过响应头的 Set-Cookie 字段发送给浏览器(例如:Set-Cookie: session_id=abc123; Path=/)。

  5. 保存Cookie:浏览器收到指令,将 session_id=abc123 这个 Cookie 保存起来。

  6. 访问其他页面:当用户访问网站的个人中心时,浏览器会自动在请求头中带上这个 Cookie:Cookie: session_id=abc123

  7. 识别用户:服务器收到请求,取出 session_id 的值 abc123,然后在自己的 Session 存储中查找 abc123 对应的数据,找到了 user_id

  8. 返回内容:服务器知道这是用户123,于是从数据库拉取用户123的个人信息,生成页面返回给浏览器。

  9. 登出:用户点击退出登录,服务器端销毁对应的 Session 数据。即使浏览器的 Cookie 还在,也无法再找到有效的 Session。

重要补充:如果用户禁用了Cookie怎么办?

Session 机制默认依赖 Cookie。如果用户禁用了 Cookie,就需要其他方式来传递 Session ID,最常见的方法是 URL 重写。即,服务器在生成每个链接时,自动将 Session ID 作为参数附加在 URL 后面。

例如:原本的链接是 https://example.com/profile,会变成 https://example.com/profile;jsessionid=abc123

这种方式不够安全(URL 可能被记录、分享)且不方便,但是一种备选方案。

结论

  • Cookie 是客户端的存储机制,用于保存一些不敏感的小数据,并实现状态的持久化。

  • Session 是服务器端的状态管理机制,用于保存敏感或重要的用户会话数据。

  • 它们不是对立的选择,而是协作的伙伴。在典型的 Web 应用中,Session 利用 Cookie 来传递识别用户身份的 ID,从而将无状态的 HTTP 协议变得有状态。

 

http://www.hskmm.com/?act=detail&tid=14338

相关文章:

  • 使用C++编写的一款射击五彩敌人的游戏 - 详解
  • CG-65 剖面细管式温度传感器 可实时监测不同土层温度动态
  • list集合根据某字段获取某个对象
  • .NET STS 版本支持 24 个月
  • 后缀数组基础 Suffix Array
  • @Param的作用
  • 后端应该对前端数据来源渠道进行验证
  • 思念比爱更深刻
  • 数据库操作的方法签名
  • 完整教程:第33章 AI在教育领域的应用
  • 易软通openWMS - 功能齐全的开源WMS
  • C# 中的 ReferenceEquals 方法 - 教程
  • 遇到一件循环导入事件
  • flask实现后端接口的封装和开发部分
  • 上海这样的地段简直是逆天
  • 【GitHub每日速递 250923】 Google 又放大招!TimesFM 2.5 参数减半,预测更准更快
  • 具身智能机器人架构:人形机器人系统架构深度拆解
  • 卓驭,欧洲无绝境
  • 下周审核4家IPO,2家再融资。其中两家IPO企业于在审期间调减募资规模
  • 280亿国产AI独角兽,惹怒“地表最强法务部”
  • 读人形机器人20财富再分配
  • Java 与人工智能的深度融合:从数据到推理服务
  • Java 与大数据实时处理:Kafka、Flink 与企业应用
  • Java 与企业级中间件:消息、缓存与数据库集成
  • 基于 Vite7 与 Vue3 的 WebOS 后台系统架构实践
  • 啊哈哈20250923_03:23
  • js获取浏览器指纹
  • gitIgnore 无法忽略dist目录的变更
  • 翻转二叉树
  • 我的第一篇博客