如何选择一个合适的Web存储方案

news2024/12/26 23:39:04

Web客户端存储是一个现代Web应用必不可少的功能,常见的有Cookie、WebStorage和IndexedDB等,如何选择一个合适的Web存储方案呢?

一. Cookie

1. 为什么要有Cookie?

HTTP协议是无状态的,即一次请求和响应就是一次完整地HTTP通信,多个请求之间是没有会话状态的。但是,现代Web应用一般是有会话状态的。例如:

  • 用户身份认证:用户登录后进入下一页面,如何判断当前请求是哪个用户?
  • 购物车:用户选中商品后进入下一页面继续购物,如何获取用户之前选中的商品呢?

所以,就有了Cookie,用于解决HTTP协议无状态的问题。

Cookie是服务器返回并保存在浏览器本地的数据,浏览器下次请求时会自动带上Cookie信息

2. Cookie是怎么实现的?

服务器将Cookie信息存放在 Set-Cookie header,浏览器收到响应后会保存到本地,之后对该服务器的请求都会通过 Cookie header带上Cookie信息。

服务器响应报文:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[页面内容]

浏览器请求报文:

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

常见应用场景:

  • 保持会话状态:用户身份认证和购物车功能。
  • 跨站追踪:第三方Cookie追踪用户行为,实现广告精准投放。

例如,当用户登录认证后,服务端生成一个Cookie并返回给浏览器,浏览器下次请求时带上Cookie,这样服务端就识别用户身份信息了。PS:一般把真实信息存放在数据库,然后关联一个token存放到Cookie中。

下面是Cookie的相关属性:

a. 有效期

  • 会话期 Cookie :仅在会话期内有效,浏览器关闭之后它会被自动删除。
  • 持久性 Cookie:在指定有效期Expires或Max-Age后失效。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

b. 作用域

domain/path 定义了Cookie的作用域,即允许 Cookie 被发送给哪些域名。domain默认是origin的域名。

set-cookie: token=123; domain=.bing.com;path=/;
  • Cookie可以在子域名之间共享。例如,单点登录,用户在网站boss.com登录后保存Cookie,之后进入子网站a.boss.com时会携带Cookie,服务端就知道是哪个用户了。
  • Cookie是禁止跨域的。即domain为www.a.com的Cookie禁止被发送到www.b.com。

c. 安全性

Cookie是存储在浏览器端,并通过HTTP报文在网络上传输,所以需要考虑安全性问题。下面是几种常见的安全问题和Cookie属性。

  1. Secure

Cookie是通过HTTP报文在浏览器和服务器之间传输,有man-in-the-middle attack的风险。 Secure属性要求Cookie 只能被HTTPS请求携带,从而保证Cookie的安全传输。

但是,能访问到客户端硬盘的人依然能读取到Cookie。所以Cookie不应该携带敏感信息

  1. HttpOnly

HttpOnly表示禁止浏览器端脚本读写Cookie,防范XSS(跨站脚本攻击)。

Cookie本来就是给服务器辨别请求来源的,对浏览器端程序应该无感。通常,服务器完成用户身份认证后,设置Set-Cookie header并指定HttpOnly,而不是由前端脚本拿到数据后再去设置Cookie。

  1. SameSite

当Cookie的domain属性不是当前网站域名和父级域名时,称为第三方Cookie,存在CSFR风险。

SameSite有以下三个值:

  • None:不限制第三方Cookie。
  • Strict:禁止第三方Cookie。
  • Lax(默认值),与 Strict 类似,但允许导航到目标网站时携带第三方Cookie。

默认使用Lax,限制第三方Cookie,但允许导航到目标网站时携带第三方Cookie,例如<a>、<link>和<form>get请求。但禁止<img>、<iframe>和ajax等请求携带第三方Cookie。

示例:

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly;SameSite=Lax;

第三方Cookie常用来跨站追踪。例如:单点登录和广告精准投放。示例:

  1. 用户进入购物网站shopping.boss.com后服务端返回Cookie(domain=.boss.com)。
  2. 之后用户的搜索和点击行为会被记录到数据库。
  3. 当用户访问了嵌入购物网站广告组件的页面时,会携带Cookie请求广告网站ad.boss.com,广告网站根据Cookie找出用户行为生成广告内容返回给浏览器。

3. Cookie的不足之处

  • Cookie容量小

    浏览器对每个站点下的Cookie大小和数量都是有限制的。每个cookie的name=value的value值大概在4k

  • 额外的性能开销

    由于服务器设置 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销。

4. 小结

Cookie是服务器返回并保存在浏览器本地的数据,浏览器下次请求时会自动带上Cookie信息。通常用来保持会话状态和跨站追踪。

但是Cookie并不适合存储复杂数据,因为其容量小且会产生性能开销。

二. Web Storage

1. 纯粹的客户端存储

过去,Cookie作为惟一的浏览器端存储方案,存储容量小且带来了额外的性能开销,并不适合所有的存储需求。更多时候,我们需要的是一个纯粹的客户端存储功能:即数据存储在浏览器端,不需要在浏览器和服务端之间来回传递。例如实现以下功能:

  • 用户搜索历史记录功能。
  • 存储客户端配置信息。

现在,Web Storage提供了更纯粹的浏览器端存储方案。

2. WebStorage是怎么实现的?

Web Storage通过创建一个Storage对象来存储键值对,key和value是字符串格式。并且该Storage对象只保存在浏览器本地,不会通过HTTP请求传递给服务端。

示例:

// 1.存储值
localStorage.setItem("key","value");
// 2.获取值
var valueLocal = localStorage.getItem("key");
// 3.删除值
Storage.removeItem("key");
// 4.清除Storage对象
Storage.clear();
// 5.Storage对象发送变化时,触发storage事件
window.addEventListener('storage', function(e) {
  document.querySelector('.my-storage').textContent = e.storageArea;
});

a. 有效期

  • sessionStorage :Storage对象仅在页面会话期间有效。
  • localStorage :Storage对象是持久性的。在浏览器重新打开时依然有效。

b. 作用域

Web Storage也受同源策略保护。其中sessionStorage只作用于当前页面,即便打开两个标签页访问同一页面,也会创建两个不同的Storage对象。

c. 存储容量

Storage对象最大容量为5M左右。

3. 应用场景

Web Storage的应用场景:

  • localStorage实现用户搜索历史记录功能。

    image-20220123152526201

  • localStorage实现存储客户端配置信息。

    image-20220123161351449

  • sessionStorage可以作为会话级别的缓存,例如表单信息存储,实现刷新页面不丢失表单数据。

4. WebStorage的不足之处

  • 只能存储字符串类型的数据,不支持其它数据类型。
  • 存储容量只有5M左右。
  • 数据是明文存储,且存在XSS攻击。

5. 小结

WebStorage是纯粹的客户端存储方案,可以满足大部分的存储需求。但面对专业性要求更高的存储需求时,依然存在不足,例如只支持字符串类型,存储容量不够大,数据是明文存储等。

三. IndexedDB

1. 更专业的数据存储

IndexedDB 是一个非关系型数据库,可以存储结构化克隆算法支持的任何对象(包括字符串、ArrayBuffer 对象和 Blob 对象等二进制数据)。支持索引检索。

使用过程包括:指定数据库模式,建立数据库连接,然后检索和更新一系列事务。由于IndexedDB提供的是比较底层的api,所以开发中可以借助第三方库来操作。

四. 总结

  • Cookie 解决的是HTTP协议无状态的问题;
  • Web Storage 提供的纯浏览器端存储的功能,不涉及跟服务端交互;
  • IndexedDB 是更专业的浏览器端存储方案,支持更大的存储容量,更复杂的数据结构。

正是有了这些更专业的浏览器端存储方案的出现,让Web应用的性能进一步的提升,可以承载更加复杂的业务功能。

参考资料

mdn

Cookie 已凉,Web 存储该这么做!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle监听报错相关问题汇总

监听服务报错问题汇总&#xff1a; 1.Windows 2008系统下oracle 11g监听异常死机&#xff0c;无法连接 **C:\Users\administrator>lsnrctl status LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 16-9月 -2020 10:09:26 Copyright (c) 1991, 2010, Orac…

(十六).net学习之SOA-WebService

SOA-WebService一、SOA的思想&#xff0c;分布式服务1.SOA2.优势3.数据总线二、建立webservice1.关于webservice2.具体实现三、WCF多宿主协议1、自托管宿主2、windows service宿主3、IIS宿主4、WAS宿主一、SOA的思想&#xff0c;分布式服务 1.SOA SOA:面向服务架构&#xff0…

一个umi4的项目适配到FireFox60.7.1esr版本上的从头到尾

项目场景&#xff1a; 一个使用umi4创建的大屏项目&#xff0c;用户的浏览器使用的是火狐60.7.1的稳定版。然后就报错了&#xff01;&#xff01;&#xff01; 为什么不让用户换谷歌嘞&#xff0c;咱也不知道。那咱就搞兼容吧~~ 贴个浏览器的版本图片&#xff1a; 问题历程 …

【springboot】从解决@valid失效问题 到根据判断放行的更灵活替代方案 再到优雅的打日志

文章目录前言valid失效问题替代方案前言 valid 可以帮助我们节省很多代码 比较方便 但操作失误时 可能会失效 达不到我们预期效果&#xff1b; valid会有个问题 因为注解过于方便 反而会导致拦截后 错误日志的收集会比较麻烦 &#xff0c;以及在面对有时需要拦截 有时不需要拦截…

机器学习中的模型选择和评估

机器学习中的模型选择和评估1. 介绍2. 模型拟合效果2.1欠拟合与过拟合表现方式2.2 避免欠拟合与过拟合的方法3.实例分析3.1鸢尾花数据集3.2 对鸢尾花数据进行聚类1. 介绍 在机器学习系统中&#xff0c;如何训练出更好的模型、如何判断模型的效果&#xff0c;以及模型是否过拟合…

【内存对齐】一篇文章带你看懂内存对齐(万字详细介绍+代码样例)

目录 为什么需要内存对齐 性能 范围 原子性 结论 数据模型 C 的内存对齐 具名要求 平凡类 标准布局类 平凡类与标准布局类总结 标准布局类的内存对齐 普通的标准布局类 带有位域的标准布局类 手动指定对齐大小的标准布局类 非标准布局类的内存对齐 GLSLang 的…

分布式事务(3):AT模式实战-Seata

1 介绍 Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff0c;简单可扩展自治事务框架&#xff09;是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。Seata 开源半年左右&#xff0c;目前已经有接近一万 star&#xff0c;社…

信息系统项目管理师考试总结

1、结果展示 从结果上看&#xff0c;论文刚刚过&#xff0c;案例分析差两份&#xff0c;选择题差五分。 问题一&#xff1a;案例分析中&#xff0c;计算题可以拿到分&#xff0c;提高案例分析的通过率。计算题比较客观。可以在下一次考试中多准备准备。 问题二&#xff1a;客观…

QUIC的诞生

背景 自1999年HTTP/1.1被提出以来&#xff0c;它已经稳定地被使用超过了20个年头。不过经典并不意味着完美&#xff0c;HTTP/1.1中一个连接同一时刻只能处理一个HTTP请求&#xff0c;如果当前的请求没有结束之前&#xff0c;其他的请求只能处于阻塞状 态。这一“对头阻塞”问题…

权限管理的配置思路

1.在main.js中引入permission.js 2.permission.js中通过vuex中getters.access_token进行路由的重定向 直接import ‘.permission’

MSF基本使用和控制台命令

前言 ● Msfconsole使用接口 ○ 最流行的用户接口 ○ 几乎可以使用全部MSF功能 ○ 控制台命令支持TAB自动补全 ○ 支持外部命令的执行&#xff08;系统命令等&#xff09; ○ 点击鼠标启动 / msfconsole -h -q -r -v / exit ○ help / &#xff1f; / help vulns 控制台命令 …

【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解)

【Python】利用Python实现精准三点定位&#xff08;经纬度坐标与平面坐标转换法求解&#xff09; 众所周知&#xff0c;如果已知三个点的坐标&#xff0c;到一个未知点的距离&#xff0c;则可以利用以距离为半径画圆的方式来求得未知点坐标。 如果只有两个已知点&#xff0c;则…

【Array数组】面试前基础知识点深度记忆总结

写本篇博客的原因是发现有人遇到了以下误区&#xff0c; 1、在我面试别人的过程中&#xff0c;我想让他说一下数组的一些内置方法和含义&#xff0c;然后他条例思路不太清晰&#xff0c;跳动着说&#xff0c;所以遗漏了很多&#xff0c;或许按照es5到es6是一个指导顺序&#xf…

51单片机——独立按键实验,小白讲解,相互学习

按键介绍&#xff1a; 按键是一种电子开关&#xff0c;使用时轻轻按开关按钮就可式开关接通&#xff0c;当松手时&#xff0c;开关断开。开发板上使用的按键及内部简易图如下图&#xff1a; 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xf…

Pandas-根据数据表1中的字段a,筛选出数据表2中也包含字段a的数据

前言 本文是该专栏的第18篇,后面会持续分享python的数据分析知识,记得关注。 假设现在有个数据分析的需求,如下: 数据表1中有几十万条数据,数据表2中有几万条数据,两张数据表1和2有两个相同的字段phone,现在需要将数据表1和数据表2中,phone字段存在相同的行,保留下来…

redis集群操作

Redis集群1 集群2 集群架构图3 集群细节4 集群搭建4.1.创建集群4.2.查看集群状态4.3.添加主节点4.4.添加从节点4.5.删除副本节点4.6.集群在线分片1 集群 Redis在3.0后开始支持Cluster(模式)模式&#xff0c;目前redis的集群支持节点的自动发现&#xff0c;支持slave-master选举…

Nmap系统扫描实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Nmap系统扫描实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

解决Win系统cad激活安装失败问题,AutoCad 2022 中文/英文正式详细安装教程

Autodesk AutoCAD 2022简称“cad 2022”是一款功能强大的CAD三维绘图辅助设计软件。autocad 2022适用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;广泛应用于机械设计、工业制图、工程制图、土木建筑、装饰装潢、服装加工等多个行业领域。CAD2022新特征&#xff…

线径看板帮助电线电缆厂提高生产效率的工作原理

当今&#xff0c;市场上出现了越来越多的电线电缆品牌&#xff0c;电线电缆市场的竞争越来越激烈&#xff0c;电线厂家稍有不慎&#xff0c;出现了产品不规范、不合格的异常情况&#xff0c;就很可能会被市场淘汰&#xff0c;被消费者所抛弃。那么&#xff0c;要怎样才能够保障…

MVC(Model,View,Controller)

MVC是指Model&#xff08;模型层&#xff0c;数据&#xff09;&#xff0c;View&#xff08;视图层),Controller(控制层&#xff09; 核心是DispathcherServlet&#xff08;一个Servlet&#xff09; (1) 客户端的请求提交给DispathcherServlet (2&#xff09;DispathcherServl…