彻底弄懂Web Storage与Cookie:从机制到应用的全方位对比

彻底弄懂Web Storage与Cookie:从机制到应用的全方位对比

彻底弄懂Web Storage与Cookie:从机制到应用的全方位对比

🌺The Begin🌺点点关注,收藏不迷路🌺

引言

在前端开发中,数据存储是一个绕不开的话题。从古老的Cookie到现代强大的Web Storage(localStorage与sessionStorage),选择哪种存储方式直接影响到应用的性能、安全性和用户体验。

很多初学者甚至有一定经验的开发者,对于“有了Cookie为什么还要Web Storage?”以及“它们到底有什么区别?”感到困惑。今天,我们就通过这篇文章,结合流程图和代码,一次性把这个问题讲透。

1. 什么是Cookie?

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器再次发起请求时被携带发送到服务器。

  • 尺寸限制: 大约 4KB。
  • 生命周期:ExpiresMax-Age 属性决定。
  • 作用域:DomainPath 属性控制。
  • 通信机制: 每次请求都会自动携带(包括图片、CSS等静态资源请求)。

下图展示了Cookie在浏览器与服务器之间的典型交互流程:

GET /index.html

响应 + Set-Cookie头

请求头自动携带Cookie

服务器识别用户状态

浏览器首次请求页面

服务器

浏览器存储Cookie

浏览器再次请求

服务器

返回个性化内容

2. 什么是Web Storage?

Web Storage 是HTML5引入的本地存储解决方案,旨在解决Cookie在存储容量和性能上的不足。它分为两种:

  • localStorage: 持久化存储,数据不会过期,除非手动清除。
  • sessionStorage: 会话级存储,数据在页面会话结束时(关闭浏览器标签页)清除。

Web Storage 流程图

下图展示了Web Storage在客户端的操作流程,它全程不涉及服务器:

客户端浏览器

点击/脚本

localStorage.setItem

sessionStorage.setItem

不参与存储过程

用户操作页面

调用Web Storage API

硬盘存储

内存/会话存储

页面读取数据

渲染/交互

服务器

3. 核心区别深度解析(对标选项逐一解读)

结合您提供的要点,我们来逐一剖析它们的区别:

a. 存储容量

  • Cookie: 大小受限,通常在 4KB 左右。对于需要存储Token、用户偏好设置的现代应用来说,这简直是杯水车薪。
  • Web Storage: 通常为 5MB 或更大(不同浏览器略有差异),足以存储大部分的客户端状态数据。

b. 网络流量(带宽浪费)

  • Cookie:每次你请求一个新的页面(或任何资源)的时候,Cookie都会被自动附加在HTTP请求头中发送过去。如果Cookie有2KB,页面有100个请求,就会产生200KB的额外流量,无形中浪费了带宽,增加了请求耗时。
  • Web Storage: 数据仅保存在本地,绝不参与网络通信,不会增加任何HTTP请求的负担。

c. 作用域与跨域

  • Cookie: 需要指定作用域(DomainPath)。虽然可以设置主域名让子域共享,但出于安全考虑,不可以跨域调用(例如 a.com 无法读取 b.com 的Cookie)。
  • Web Storage: 遵循同源策略。协议、域名、端口必须完全一致才能访问,比Cookie的作用域限制更为严格和安全。

d. API 易用性

Web Storage: 拥有简单明了的API,如 setItemgetItemremoveItem

// Web Storage 操作(优雅) localStorage.setItem('name','zhangsan');const name = localStorage.getItem('name'); sessionStorage.setItem('key','value');

Cookie: 原生操作非常原始,开发者需要自己封装 setCookiegetCookie 方法去解析 document.cookie 字符串。

// 原生Cookie操作(繁琐) document.cookie ="name=zhangsan; path=/";functiongetCookie(name){/* 需要自己写正则解析字符串 */}

e. 设计初衷

  • Cookie: 早期设计用于维持HTTP状态(因为HTTP是无状态的)。Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在。服务端可以写Cookie,客户端也可以读。
  • Web Storage: 纯粹为了解决客户端本地存储而生。它仅仅是为了在本地“存储”数据而生,没有任何与服务器自动通信的机制。

f. 历史兼容与封装

  • 在IE7、IE6时代,浏览器有私有的 UserData 行为。通过简单的代码封装,可以将UserData的API模拟成Web Storage的接口,从而实现所有浏览器都支持web storage的假象。这体现了Web Storage在设计上对API规范化的追求。

4. 总结对比表

特性CookieWeb Storage (local/session)
容量~4KB~5MB+
通信随HTTP请求发送给服务器仅在客户端保存,不发送
API手动操作字符串 document.cookie标准的 setItem/getItem
生命周期自定义过期时间永久/会话关闭
作用域可配置Domain/Path,子域可共享严格遵循同源策略
主要用途会话管理、用户追踪(由服务器读写)缓存数据、用户偏好设置、页面状态

5. 应用场景建议

什么时候选 Cookie?

  • 需要服务器识别用户状态(如 Session ID)。
  • 需要实现子域名的单点登录(如 passport.baidu.comtieba.baidu.com 共享登录态)。
  • 数据量很小,且必须自动携带给后端。

什么时候选 Web Storage?

  • localStorage: 适合存储长期不变的、与后端无关的数据。例如:网站主题、用户自定义的布局、大文本内容草稿。
  • sessionStorage: 适合存储表单填写过程中的临时数据,防止刷新页面丢失;或者记录当前页面的浏览位置。

6. 结语

理解Cookie和Web Storage的区别,不仅仅是应对面试,更是写出高性能、低Bug应用的基础。

  • 不要把大数据(如Base64图片、大JSON)塞进Cookie。
  • 不要用localStorage存储敏感信息(如明文密码),因为它没有任何加密措施,且易受XSS攻击。
  • 记得在需要服务器交互时,Cookie依然是你最好的朋友;而在单纯客户端存储的场景下,拥抱Web Storage吧!

希望这篇文章能帮助到你!如果你有更多前端存储的疑问,欢迎在评论区留言讨论。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

Read more

大模型+智能家居解决方案--小米MiLoco部署

大模型+智能家居解决方案--小米MiLoco部署

一、Miloco简介 小米推出了首个“大模型+智能家居”解决方案Xiaomi Miloco,全称为 Xiaomi Local Copilot(小米本地协同智能助手)。 https://gitee.com/xiaomi-miloco/xiaomi-miloco 1、GitHub地址 https://github.com/XiaoMi/xiaomi-miloco Miloco以米家摄像头为视觉信息源,以自研大语言模型MiMo-VL-Miloco-7B为核心,连接家中所有物联网(IoT)设备,框架面向所有人开源。MiMo-VL-Miloco-7B模型基于小米4月发布的MiMo模型调优而来,“天才少女”罗福莉最近加入的正是MiMo模型团队。 这很可能是智能家居的“ChatGPT时刻”,小米AIoT平台截至今年6月已连接的IoT设备数(不含智能手机、平板及笔记本计算机)达9.89亿台,数以亿计的米家摄像头、小爱音箱、台灯等设备都有望用上大模型。 从小米公布的Miloco页面来看,页面主视觉是一个类似于ChatGPT的聊天框,聊天框的左侧具有智能家居设备的导航栏,包括AI中心、模型管

地瓜机器人智慧医疗——贰贰玖想要分享的关于使用惯导的一些思路

地瓜机器人智慧医疗——贰贰玖想要分享的关于使用惯导的一些思路

前言 在第20届全国大学生智能车竞赛(智慧医疗机器人创意赛)中,我们贰贰玖拿下国一。在这里,作为队长兼技术主力兼机师兼……我想分享一下在备赛过程中的一些思路。当然,为了不把比赛搞成全都是20s以内,竞争激烈到前后几名差0.几秒,我不会开源我们的惯导和避障思路(实在太简单,太容易实现了)。 这是我们两年的备赛日记,也有我们第二年区域赛和国赛的全流程。 【贰贰玖|从省三到国一,从巡线到路径规划到惯导+纯视觉避障的贰贰玖智能车日记-哔哩哔哩】 https://b23.tv/IDJyM2P 数据集我放在这里了,一共2w9张,全都是640x480,有数据增强的(没有旋转):https://pan.baidu.com/s/10u4S4fiVATRyEeDpdzpk_A?pwd=0229 提取码:0229 下面面我会讲一下我们的网络问题怎么解决,上位机的一些辅助处理,如何半场扫码,如何准确返回 P 点,修改stm32,以及修改车的ekf.yaml。

基于FPGA的日志及参数文件存储设计

基于FPGA的日志及参数文件存储设计

基于FPGA的日志及参数文件存储设计 * 功能需求 * 系统设计 * 日志功能 * 上位机参数存储 * 本地参数查询 * 多台设备参数管理 * 系统框图 * 通信协议定义 * Flash芯片 * 引脚定义 * Flash相关指令 * Read Manufacturer / Device ID (90h) * Write Enable (06h) * Sector Erase (20h) * 32KB Block Erase (52h) * 64KB Block Erase (D8h) * Page Program (02h) * Read Data (03h) * Read Status Register * Write Status Register * 状态寄存器定义 * AC参数 * 测试结果 * 日志功能 * 上位机读/写/擦除

【机器人】复现 StreamVLN 具身导航 | 流式VLN | 连续导航

【机器人】复现 StreamVLN 具身导航 | 流式VLN | 连续导航

StreamVLN 通过在线、多轮对话的方式,输入连续视频,输出动作序列。 通过结合语言指令、视觉观测和空间位姿信息,驱动模型生成导航动作(前进、左转、右转、停止)。 论文地址:StreamVLN: Streaming Vision-and-Language Navigation via SlowFast Context Modeling 代码地址:https://github.com/OpenRobotLab/StreamVLN 本文分享StreamVLN 复现和模型推理的过程~ 下面是示例效果: 1、创建Conda环境 首先创建一个Conda环境,名字为streamvln,python版本为3.9; 然后进入streamvln环境,执行下面命令: conda create -n streamvln python=3.9 conda activate streamvln 2、 安装habitat仿真环境