当前位置:首页 > 技术分析 > 正文内容

Cookie、本地存储、会话存储

ruisui883个月前 (03-03)技术分析14

我们很多人都听说过会话存储、本地存储和 Cookie。但它们到底是什么,它们解决什么问题,它们有何不同?

Cookie

一开始,网络使用 HTTP 协议来发送消息(顺便说一句,SSL 更安全,您应该使用 HTTPS 而不是 HTTP)。这些协议是无状态协议。在无状态协议中,每个请求不存储任何状态或“持久信息”;每个请求都是它自己的岛屿,它不知道其他请求。

采用无状态协议可以优化性能,但它也带来了一个问题:如果您需要记住用户会话怎么办?如果您有darkMode: true或user_uuid: 12345abc,如果您使用无状态协议,服务器如何记住它?带着Cookie!

可以从 HTTP 标头设置 Cookie。通常,您尝试访问的服务器(如果有 cookie)将发送如下 HTTP 标头:

Set-Cookie: choco_chip_cookie=its_delicious

当您的浏览器收到此标头时,它会保存choco_chip_cookieCookie。

Cookie 与网站相关联。如果websitea.com有,您在里面时cookie_a看不到。你需要在
.cookie_awebsiteb.comwebsitea.com

要查看您拥有的 Cookie,如果您有 Firefox,请从您的开发工具转到存储 -> Cookie;如果您有 Chrome,请从您的开发工具转到应用程序 -> 存储 -> Cookie。大多数网站都使用 Cookie,您应该在那里找到一些(如果没有,请转到其他网站)。

Cookie 可以有一个有效期。当然,如果您将其设置为遥远的未来日期,则可以将其设置为永久有效:

Set-Cookie: choco_chip_cookie=its_delicious; Expires=Mon, 28 Feb 2100 23:59:59GMT;

您可能需要了解的另一种 Cookie 行为:您的浏览器在每次请求时发送 Cookie 。当您访问时https://example.com,您必须发出 30 次请求才能下载 HTML 页面及其 29 个资产文件,您的浏览器将发送您的 Cookie(针对https://example.com域名) 30 次,每个请求发送一次。

这仅适用于您将资产存储在同一域名下的情况,例如
example.com/assets/images/cute-cats.svg、
example.com/assets/stylesheets/widgets.css等。如果您将资产存储在不同的域/子域下,例如
exampleassets.com/assets/stylesheets/widgets.css或
static.example.com/assets/stylesheets/widgets.css,那么您的浏览器将不会向那里发送 Cookie。仅供参考,将您的资产存储在不同的域中是提高速度的好策略!

Cookie 的最大大小为 4kb。这是有道理的,因为 Cookie 一直在发送。您不想在访问页面时向所有 30 个不同的请求发送 3mb Cookie 数据。即使有这个大小上限,您也应该尽可能减少 Cookie 以减少流量。

Cookie 的一种流行用法是为您的网站使用 UUID,并运行单独的服务器来存储所有 UUID 以保存会话信息。单独的 Redis 服务器是一个不错的选择,因为它速度很快。因此,当用户尝试访问 时example.com/user_settings,用户会发送其 Cookie example.com,例如example_site_uuid=user_iggy_uuid,然后服务器会读取该 Cookie,然后服务器可以将其与 Redis 中的密钥进行匹配,以获取用户会话信息以供服务器使用。在你的 Redis 服务器中,你会有类似的东西:user_iggy_uuid: {darkMode: false, lastVisit: 01 January 2010, autoPayment: false, ...}。

我强烈鼓励您看到它的实际应用。使用 Chrome / Firefox / 任何现代浏览器访问任何网页(确保它使用 Cookie)。

  • 查看您当前拥有的 cookie。
  • 现在查看“网络”选项卡并检查请求标头。您应该会看到发送相同的 Cookie。

您可以使用 Javascript 创建 cookie document.cookie。

document.cookie = "choco_chip_cookie=its_delicious";
document.cookie = "choco_donut=its_awesome";
console.log(document.cookie);

除了 之外Expires,Cookie 还有许多其他属性,您可以赋予它来执行各种操作。如果您想了解更多信息,请查看mozilla cookie 页面。

Cookie 可以被第三方访问(例如,如果网站使用 HTTP 而不是 HTTPs),因此您需要使用该Secure属性来确保仅当请求使用 HTTPS 协议时才发送您的 Cookie。此外,使用该HttpOnly属性会使您的 Cookie 无法访问,document.cookie以防止 XSS 攻击。

Set-Cookie: awesome_uuid=abc12345; Expires=Thu, 21 Oct 2100 11:59:59 GMT; Secure; HttpOnly

一般来说,如果您有疑问,请使用Secure和HttpOnlyCookie 属性。

本地存储和会话存储

本地存储和会话存储的相似之处多于不同之处。大多数现代浏览器应该支持本地存储和会话存储功能。它们用于在浏览器中存储数据。它们只能从客户端访问(Web 服务器无法直接访问它们)。此外,由于它们是前端工具,因此不支持 SSL。

与 Cookie 不同,Cookie 中的所有 Cookie(针对该域)都会在每个请求上发送,本地和会话存储数据不会在每个 HTTP 请求上发送。它们只是坐在您的浏览器中,直到有人请求为止。

每个浏览器对于本地和会话存储中可以存储多少数据都有不同的规范。许多流行文献声称本地存储的限制约为 5mb 和 5-10mb 的限制(为了安全起见,请检查每个浏览器)。

本地存储和会话存储之间的主要区别在于,本地存储没有过期日期,而会话存储数据在您关闭浏览器选项卡时就会消失 - 因此名称为“会话”。

这两个存储都可以通过 Javascript DOM 访问。设置、获取和删除本地存储数据:

localStorage.setItem('strawberry', 'pancake');
localStorage.getItems('strawberry'); // pancake`

localStorage.chocolate = 'waffle';
localStorage.chocolate; // waffle

localStorage['blueberry'] = 'donut';
localStorage['blueberry']; // donut;

delete localStorage.strawberry;

您还可以将类似 JSON 的对象存储在本地存储中。请记住,您需要向它们传递一个 JSON 字符串(使用JSON.stringify)。另外,由于您要向其传递 JSON 字符串,因此不要忘记运行JSON.parse以获取该值。

localStorage.desserts = JSON.stringify({choco: "waffle", fruit: "pancake", sweet: "donut"});
const favDessert = JSON.parse(localStorage.desserts)['choco']; // waffle

如果您有 Chrome,您可以在 devtool 应用程序选项卡 -> 存储 -> 本地存储中看到您刚刚输入的 localStorage 值。如果您有 Firefox,则可以在开发工具中的“存储”选项卡中的“本地存储”下找到它。

使用 Javascript 访问会话存储与本地存储类似:

sessionStorage.setItem('strawberry', 'pancake');
sessionStorage.getItems('strawberry'); // pancake`

sessionStorage.chocolate = 'waffle';
sessionStorage.chocolate; // waffle

sessionStorage['blueberry'] = 'donut';
sessionStorage['blueberry']; // donut;

delete sessionStorage.strawberry;

与 Cookie 一样,这两种存储的范围都仅限于域名。如果您运行localStorage.setItem('choco', 'donut');于https://example.com且运行localStorage.setItem('choco', 'bo');于https://whatever.com,则本地存储项choco donut仅存储于example.com,而choco bo存储于whatever.com。

本地存储和会话存储均由浏览器供应商确定范围。如果您使用 Chrome 存储它,则无法从 Firefox 读取它。

Cookie、本地存储、会话存储

总结一下:

Cookie

  • 具有不同的过期日期(服务器或客户端都可以设置过期日期)
  • HttpOnly如果该标志为 true,则客户端无法访问 Cookie
  • 有 SSL 支持
  • 每个 HTTP 请求都会传输数据
  • 4kb 限制

本地存储

  • 没有有效期
  • 仅限客户
  • 不支持 SSL
  • 数据不会在每个 HTTP 请求上传输
  • 5 mb 限制(通过浏览器检查)

会话存储

  • 关闭浏览器选项卡后数据就会消失
  • 仅限客户
  • 不支持 SSL
  • 数据不会在每个 HTTP 请求上传输
  • 5-10 mb 限制(通过浏览器检查)

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2441.html

分享给朋友:

“Cookie、本地存储、会话存储” 的相关文章

迁移GIT仓库并带有历史提交记录

迁移git仓库开发在很多时候,会遇到一个问题。GIT仓库的管理,特别是仓库的迁移。我需要保留已有的历史记录,而不是重新开发,重头再来。我们可以这样做:使用--mirror模式会把本地的分支都克隆。// 先用--bare克隆裸仓库 git clone git@gitee.com:xxx/testApp...

高效使用 Vim 编辑器的 10 个技巧

在 Reverb,我们使用 MacVim 来标准化开发环境,使配对更容易,并提高效率。当我开始使用 Reverb 时,我以前从未使用过 Vim。我花了几个星期才开始感到舒服,但如果没有这样的提示,可能需要几个月的时间。这里有十个技巧可以帮助你在学习使用 Vim 时提高效率。1. 通过提高按键重复率来...

Vue中路由router的基本使用

??本文开始我们来给大家介绍在Vue中非常重要的一个内容,就是路由Router什么是路由后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特...

Vue实战篇|使用路由管理用户权限(动态路由)

权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些校验,没有通过权限校验的给出相应的提示或者直接跳转到报错页面。跟着我一起来学vue实战篇路由管理权限吧!权限校验函数getCurrentAuthority()函数用于获取当前用户权限,一...

「干货」Vue+Element前端导入导出Excel

作者:xrkffgg转发链接:https://segmentfault.com/a/11900000189936191 前言1.1 业务场景由前台导入Excel表格,获取批量数据。根据一个数组导出Excel表格。2 实现原理2.1 引入工具库file-saver、xlsx、script-loader...

基于 vue3.0 小程序拖拽定制

今天给大家分享一个使用Vue3编写的自由DIY小程序页面。mbDIY 一款基于vue3.x构建的可拖拽定制小程序模板。支持新建页面、自由拖拽模块、复制/移动、自定义模块样式等功能。整个项目分为页面、模块、控件三大部分。模块里面的组件可拖拽至主面板区,编辑后保存即可预览效果。快速安装# 克隆项目 gi...