Cookie、Web Storage介绍

news2024/11/25 20:27:16

概述

Cookie、LocalStorage、SessionStorage、IndexDB这些作为浏览器的存储入口,也是经典的八股文了,本文再次冷饭热吃来介绍这些API,主要是因为在其他文章中看到了一些个人感觉有用的小知识点,所以在这记录一下,以便有序复习浏览。不多逼逼,开始正文。

Cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。不同的请求方式对Cookie的处理不一样:

特性Fetch API (credentials)XMLHttpRequest (withCredentials)
默认值'same-origin'false
默认行为同源请求中发送 Cookie;跨域不发送不发送 Cookie(无论同源还是跨域)
发送同源 Cookie默认发送需要设置 withCredentials = true
发送跨域 Cookie需要设置 credentials: 'include'需要设置 withCredentials = true
不发送 Cookie设置 credentials: 'omit'默认行为 false

由于HTTP 协议是无状态的,对于服务器无法区分与其连接的客服端信息,所以引入了Cookie用以记录稳定的状态信息。Cookie是基于HTTP的,通常用于告知服务端区分两个请求是否来自同一浏览器。

Cookie主要有以下特点:

  • 这四种中唯一直接和服务器交互的存储方式
  • 可以设置Cookie.SameSite来阻止CSRF攻击。
  • 保存字符串类型的值,可通过序列号处理,大小为4KB
  • 没有设置Expires/Max-Age(过期时间/有效时间)时,默认是会话式的,关闭窗口时会删除Cookie记录
SameSite 属性值描述适用场景
StrictCookie 仅在同站点请求中发送,不会在任何第三方请求(如跨站点链接、表单提交、资源加载)中发送。高安全性场景,防止所有跨站点请求携带 Cookie,如敏感数据的保护。
Lax(默认)Cookie 在同站点请求中发送,并在部分跨站点请求(如通过链接导航的 GET 请求)中发送。适用于大多数场景,平衡安全性和用户体验,防止大多数 CSRF 攻击。
NoneCookie 始终发送,包括所有跨站点请求,必须配合 Secure 属性(即仅通过 HTTPS 发送)。需要跨站点访问 Cookie 的场景,如第三方嵌入内容或跨站登录。

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。白话就是利用你的Cookie来冒充你和服务器进行通信,进行不好的操作

WebStorage

LocalStorage、SessionStorage统称为Web Storage(大小5M),而现代存储API包括: Web Storage、IndexedDB。 由于每次请求都会携带Cookie,随着Cookie存储数据过多时,会造成不必要的性能消耗。随着现代存储API出现之后,Cookie一般用于保存登录信息和服务器交互,其他数据推荐使用现代存储方式。

LocalStorage、SessionStoraged是通过 Window.sessionStorage 和 Window.localStorage 属性使用(更确切的说,在支持的浏览器中 Window 对象实现了 WindowLocalStorage 和 WindowSessionStorage 对象并挂在其 localStorage 和 sessionStorage 属性下)——调用其中任一对象会创建 Storage 对象,通过 Storage 对象,可以设置、获取和移除数据项。对于每个源 sessionStorage 和 localStorage 使用不同的 Storage 对象——独立运行和控制。
在这里插入图片描述

两者区别如下

  1. 持久性

    • LocalStorage:数据持久化,直到手动删除。
    • SessionStorage:数据在浏览器会话结束时删除,浏览器关闭即失效。
  2. 数据共享

    • LocalStorage:在同一源的所有标签页和窗口共享数据。
    • SessionStorage:仅在同一窗口或标签页内共享数据,不跨标签页。

多个tab间能否共享SessionStorage?

可能有的同学看到这里会疑问为什么会有这个问题,上面介绍了SessionStorage是会话式的,以窗口/tab进行分配空间,那在多个tab间肯定是不能共享的。

但是当那在当前页面打开控制台,然后进行以下操作:

  1. 在当前页面通过sessionStorage.setItem随意设置一个值,然后通过getItem获取,当然此时肯定会获取到设置的值。
  2. 然后继续在当前页面控制台输入Window.open('http://www.baidu.com')(任意地址都可以,本文以百度为例)
  3. 在跳转的新页面通过getItem获取,此时你会发现能获取到。呀,这就和之前理解的不一样的,从这里看sessionStorage好像也能共享?
  4. 然后在新的页面再次sessionStorage.setItem设置一个新值,并返回跳转前页面通过getItem访问,此时会返回null

到这里可能有的人就有些迷惑了,要明白为什么会这样,首先要理解SessionStorage是会话式的这句话的含义。我的理解上面通过在当前页面通过window.open新开一个页面的方式其实是当前页面会话的一个延续,此时延续的会话会复制当前会话的内容。注意是复制而不是共享这就是为什么在新的页面能访问而上一个页面无法访问的原因。同理不在控制台调整,在页面内通过<a>标签也能实现。

举例说明:
  • A页面点击超链接跳转到B页面,如果是target=“_self”,(默认就是_self),跳转是在同一个浏览器tab页面里面进行的,此时不管怎么操作session,在同一个tab里面两个页面的session都是一样的。
  • 如果target=“_blank”,也得分为两种情况:rel表示当前页面和跳转的目标页面具有什么关系。
    • 如果a标签没有rel="opener"属性,此时不会携带session。
    • 如果a标签有rel="opener"属性,则适用前面的原则,即从A跳转到B是一个会话,B页面会复制A页面的 session,此时在B页面回退(因为是新tab打开,所以无法回退,只能是重新有一个a标签,点击之后打开新tab,同样适用前面A页面的点击跳转规则),即打开新的A页面A1,此时A1页面是复制的B页面的session,如果B页面的session是修改过的,那么A1就是复制的最新的B页面的session。

<a>标签的rel属性指定了目标对象到链接对象的关系。而值为opener则创建一个辅助浏览上下文,可以理解为当前会话的延续。详细值可查看MDN

一句话总结:SessionStorage是会话性质的,同一个会话/会话的延续会复制session。

Web Storage是同步还是异步的?

我们知道LocalStorage保存在磁盘中,SessionStorage保存在内存中。通常情况下磁盘等IO设备为了不阻塞进程,都是异步IO的。那这么看来LocalStorage就是异步的了?

其实不是,在控制台执行下面代码:sessionLocalstorage同理都是同步的

const testLocalStorage = () => {
    console.log("==========> 设置localStorage之前");
    localStorage.setItem('testLocalStorage', '我是同步的');
    console.log("==========> 获取localStorage之前");
    console.log('=========获取localStorage', localStorage.getItem('testLocalStorage'))
    console.log("==========> 获取localStorage之后");
}

testLocalStorage()

可以看到输入是同步的,那这是为什么呢?
原因就是因为Js是单线程的,当通过js代码在访问 localStorage 时,浏览器提供的API接口通常会处于js执行线程上下文中直接调用。这意味着尽管硬盘是IO设备,当一个js执行流程访问 localStorage 时,它将同步地等待数据读取或写入完成,该过程中js执行线程会阻塞。

完整的流程

localStorage 实现同步存储的方式就是阻塞 JavaScript 的执行,直到数据的读取或者写入操作完成。这种同步操作的实现可以简单概述如下:

  • js线程调用: 当 JavaScript 代码执行一个 localStorage 的操作,比如 localStorage.getItem(‘key’) 或 localStorage.setItem(‘key’, ‘value’),这个调用发生在 js 的单个线程上。
  • 浏览器引擎处理: 浏览器的 js 引擎接收到调用请求后,会向浏览器的存储子系统发出同步IO请求。此时 js 引擎等待IO操作的完成。
  • 文件系统的同步IO: 浏览器存储子系统对硬盘执行实际的存储或检索操作。尽管操作系统层面可能对文件访问进行缓存或优化,但从浏览器的角度看,它会进行一个同步的文件系统操作,直到这个操作返回结果。
  • 操作完成返回: 一旦IO操作完成,数据要么被写入硬盘,要么被从硬盘读取出来,浏览器存储子系统会将结果返回给 js 引擎。
  • JavaScript线程继续执行: js 引擎在接收到操作完成的信号后,才会继续执行下一条 js 代码。

在同步的 localStorage 操作期间,由于 js 的单线程性质,整个线程会阻塞,即不会执行其他任何js代码,也不会进行任何渲染操作,直到 localStorage 调用返回。所以一般不要将大量数据保存在Storage中,避免长时间同步阻塞,影响体验

Web Storage有大小限制是因为同步阻塞吗?

主要原因如下:

  • 资源公平分享:同一用户可能会访问大量不同的网站,如果没有限制,随着时间的积累,每个网站可能会消耗大量的本地存储资源。这样会导致本地存储空间被少数几个站点占用,影响到用户访问其他网页的体验。限制大小可以确保所有网站都有公平的存储机会。
  • 防止滥用:如果没有存储限制,网站可能会滥用 localStorage,存储大量数据在用户的设备上,这可能导致设备存储空间迅速耗尽,也可能侵犯用户的隐私。
  • 性能限制:如之前提到的,localStorage 的操作是阻塞的。如果网站能够存储大量数据,就会加剧读写操作对页面性能的影响。
  • 存储效率:localStorage 存储的是字符串形式的数据,不是为存储大量或结构化数据设计的。当尝试存储过多数据时,效率会降低。
  • 历史和兼容性:5MB 的限制很早就已经被大多数浏览器实现,并被作为一个非正式的标准被采纳。尽管现在有些浏览器支持更大的 localStorage,但出于跨浏览器兼容性的考虑,开发者通常会假设这个限制。
  • 浏览器政策:浏览器厂商可能会依据自己的政策来设定限制,可能是出于提供用户更一致体验的角度,或者是出于管理用户数据的方便。

总结

本文主要介绍了Cookie、LocalStorage、SessionStorage三种存储机制,总结一下就是: 三者都只能保存字符串数据,并且都有大小限制。其中Cookie一般用于鉴权,LocalStorage将数据保存在磁盘中可以用于跨tab以及持久化访问,SessionStorage将数据保存在内存中,是会话式的,当在同一个会话或者会话延续时,可以访问Session。LocalStorage是共享,SessionStorage是复制。

参考文章

【前端缓存】localStorage是同步还是异步的?为什么?

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

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

相关文章

招加盟商视频怎么拍效果好?

一定没有人比我更适合分享这篇文章了&#xff0c;我自己曾经就是做宣传片的&#xff0c;而且还有一家酸奶品牌做全国招商。 我来分享下加盟招商视频怎么拍效果好&#xff1f; 一、定脚步 说个题外话&#xff0c;以前我做传媒公司的时候&#xff0c;很多客户找我做宣传片&…

Ubuntu系统Docker部署数据库管理工具DbGate并实现远程查询数据

文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…

Windows安装字体的几种方式

1.选中你要安装的字体&#xff0c;然后右键&#xff0c;点击“为所有用户安装”&#xff0c;这样字体就会安装在C:\Windows\Fonts&#xff1b;如果你点了“安装”&#xff0c;那么就会安装在C:\Users\你电脑用户的名字\AppData\Local\Microsoft\Windows\Fonts。 像电脑自带的字…

strncmp函数的使用

目录 1.头文件 2.strncmp函数的使用 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 strncmp函数的使用需要头文件 #include<string.h> 2.strncmp函数的使用 …

第一篇:教你轻松部署本地大模型(Ollama)

一、前言 搞研发的&#xff0c;想学习大模型的&#xff0c;很多都想本地部署一波&#xff0c;体验一下&#xff0c;部署是学习的第一步&#xff0c;我们不仅仅是要理论的巨人&#xff0c;还要成为实战的专家。不要恐惧&#xff0c;不要恐惧&#xff0c;不要恐惧&#xff0c;重…

【数学建模】典型相关分析

典型相关分析&#xff08;Canonical Correlation Analysis, CCA&#xff09;是一种统计方法&#xff0c;用于寻找两个多变量数据集之间的线性关系。这种分析方法可以用来衡量两个数据集之间的相关性&#xff0c;并找出能够最好地解释这种相关性的变量组合。 典型相关分析的基本…

Android系列基础知识总结

四大组件 Activity Activity生命周期 不同场景下Activity生命周期的变化过程 启动Activity&#xff1a; onCreate()—>onStart()—>onResume()&#xff0c;Activity进入运行状态。Activity退居后台&#xff1a; 当前Activity转到新的Activity界面或按Home键回到主屏&a…

WebGL系列教程二(环境搭建及着色器初始化)

目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…

好看好听的小猪包扩音器,轻巧便携更好用,得胜E10上手

我们以前在学校、景区等地方&#xff0c;都见过教师、讲解员所使用的扩音器&#xff0c;这类设备大多做得笨重粗糙&#xff0c;而且音质一般&#xff0c;声音特别粗糙刺耳&#xff0c;对使用者和旁观者影响都不好。最近我发现了一款得胜E10扩音器&#xff0c;大大提升了这种便携…

HTTPX 与 AIOHTTP 与 Requests:选择哪个?

Python 有三个众所周知的库用于发送 HTTP&#xff08;超文本传输协议&#xff09;请求&#xff1a; HTTPX、AIOHTTP 和 Requests。 所有这些都有其独特的优点和缺点。 通常&#xff0c;您需要对同步 HTTP 请求使用 Requests&#xff0c;在需要同步和异步混合时使用 HTTPX&#…

场景解决方案丨突破成本限制,中小企业如何快速搭建后台管理系统

信息化时代下业务数据量激增&#xff0c;云计算、物联网、人工智能等技术的成本大幅度降低及普及&#xff0c;这些变化推动着市场需求发生改变&#xff0c;使数字化转型成为各行业的共同趋势。在这一背景下&#xff0c;大型企业利用其经济和技术优势巩固市场领导地位&#xff0…

养宠浮毛严重怎么清理?希喂、范罗士、IAM宠物空气净化器真实测评

宠物毛发不等于宠物浮毛&#xff1f;这可真是问到我的知识盲区了。养猫来我已经接受了目光所及之处都是猫毛&#xff0c;可以心平气和的打扫被猫毛占据的屋子。自认为是很勤快的人&#xff0c;家里也一直保持着干净整洁&#xff0c;结果上星期鼻子不舒服去看医生&#xff0c;告…

发现一个有趣的滑动组件样式,并给它实现了

最近在浏览网站的时候看到一个有趣的滑动组件的样式&#xff0c;觉得很有趣。一时有兴趣就去用代码实现了一下&#xff1a; 这里我就不从零开始实现了&#xff0c;借用 Material UI Slider 快速实现&#xff0c;基本上就是重新写样式覆盖。 Material UI 上的 Slider 组件默认样…

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…

【数学建模】相关系数

第一部分&#xff1a;相关系数简介 总体与样本&#xff1a; 总体&#xff1a;指研究对象的全体&#xff0c;比如全国人口普查数据。样本&#xff1a;从总体中抽取的一部分个体&#xff0c;如通过问卷调查收集的学生数据。 皮尔逊相关系数&#xff1a; 总体皮尔逊相关系数&…

GPIO(General Purpose Input/Output)输入/输出

GPIO最简单的功能是输出高低电平&#xff1b;GPIO还可以被设置为输入功能&#xff0c;用于读取按键等输入信号&#xff1b;也可以将GPIO复用成芯片上的其他外设的控制引脚。 STM32F407ZGT6有8组IO。分别为GPIOA~GPIOH&#xff0c;除了GPIOH只有两个IO&#xff0c;其余每组IO有…

cesium.js 入门到精通(5)

现在我们看这个地图是 属于一个平面的 如果我们想把这个弄成 那种真实的高低起伏的 山脉 或者 其他的建筑显示 我们可以使用 添加地形 terrainProvider: new Cesium.CesiumTerrainProvider({url: "./terrains/gz",}), 这是一个参数 配置 地形 整体代码 <templa…

vba发邮件:如何设置自动化发送电子邮件?

vba发邮件的技巧有哪些&#xff1f;VBA如何调用outlook发邮件&#xff1f; VBA发邮件功能是一个非常实用的工具&#xff0c;能够帮助用户自动发送电子邮件&#xff0c;减少手动操作的时间和错误。AokSend将详细介绍如何通过VBA发邮件来实现自动化发送电子邮件的设置。 VBA发邮…

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器&#xff08;Google Chrome&#xff09;在macOS上拥有一系列强大而隐蔽的特性&#xff0c;这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率&#xff0c;这些被低估的功能等待着被发掘。我们将逐步探索这些功能&#xff0c;帮助您最大化利用谷歌浏览…

让人眼前一亮的软件测试简历,收不到面试邀请算我输

不知道大家的简历是不是都写成下面这样 根据需求文档进行需求分析 熟悉业务流程&#xff0c;明确测试点 根据测试点设计测试用例 参与评审测试用例 提交和回归跟踪缺陷&#xff0c;确认修复完成之后关闭Bug 通过使用Fiddler进行抓包分析并定位前后端Bug 使用简单的SQL语…