ChatGPT解决这个技术问题 Extra ChatGPT

localStorage、sessionStorage、session和cookies有什么区别?

localStoragesessionStorage、session 和 cookies 的技术优缺点是什么?我什么时候应该使用其中的一个?

这也是一个值得一看的相关主题:HTML5 Local storage vs. Session storage (stackoverflow.com/questions/5523140/…)
另请注意,只要浏览器窗口打开(不是设置它们的选项卡),会话 cookie 就会存在,但是一旦您关闭选项卡,sessionStorage 就会为空......
是的,会话也是 cookie 的类型。特点是它是短暂的,cookie是持久的
@yar1 一个特定的浏览器窗口是一个不相关的 UI 元素。

d
divibisan

这是一个范围非常广泛的问题,许多优点/缺点将与情况相关。

在所有情况下,这些存储机制将特定于单个计算机/设备上的单个浏览器。跨会话持续存储数据的任何要求都需要涉及您的应用程序服务器端——最有可能使用数据库,但也可能使用 XML 或文本/CSV 文件。

localStorage、sessionStorage 和 cookie 都是客户端存储解决方案。会话数据保存在您直接控制的服务器上。

localStorage 和 sessionStorage

localStorage 和 sessionStorage 是相对较新的 API(也就是说,并非所有旧版浏览器都支持它们)并且几乎相同(在 API 和功能方面),唯一的例外是持久性。 sessionStorage(顾名思义)仅在浏览器会话期间可用(并在选项卡或窗口关闭时被删除) - 但是,它在页面重新加载后仍然存在(来源 DOM Storage guide - Mozilla Developer Network)。

显然,如果您存储的数据需要持续可用,那么 localStorage 比 sessionStorage 更可取 - 尽管您应该注意两者都可以由用户清除,因此在任何一种情况下您都不应该依赖数据的持续存在。

localStorage 和 sessionStorage 非常适合在页面之间保存客户端脚本中所需的非敏感数据(例如:偏好、游戏分数)。存储在 localStorage 和 sessionStorage 中的数据可以很容易地从客户端/浏览器中读取或更改,因此不应依赖于在应用程序中存储敏感或与安全相关的数据。

饼干

对于 cookie 也是如此,这些可以被用户轻易篡改,并且数据也可以以纯文本的形式从它们中读取 - 所以如果您想要存储敏感数据,那么会话实际上是您唯一的选择。如果您不使用 SSL,cookie 信息也可能在传输过程中被截获,尤其是在开放的 wifi 上。

从积极的方面来说,cookie 可以通过设置仅 HTTP 标志来防止跨站点脚本 (XSS)/脚本注入等安全风险,这意味着现代(支持)浏览器将阻止从 JavaScript 访问 cookie 和值(这也将阻止您自己的合法 JavaScript 访问它们)。这对于身份验证 cookie 尤其重要,它用于存储包含登录用户详细信息的令牌 - 如果您有该 cookie 的副本,那么就所有意图和目的而言,您将成为该用户,只要 Web 应用程序是关注,并且对用户拥有的数据和功能具有相同的访问权限。

由于 cookie 用于身份验证和用户数据的持久性,因此对于同一域的每个请求,所有对页面有效的 cookie 都会从浏览器发送到服务器 - 这包括原始页面请求、任何后续 Ajax 请求、所有图像、样式表、脚本和字体。因此,不应使用 cookie 来存储大量信息。浏览器还可能对可存储在 cookie 中的信息大小施加限制。通常,cookie 用于存储用于身份验证、会话和广告跟踪的标识令牌。令牌本身通常不是人类可读的信息,而是链接到您的应用程序或数据库的加密标识符。

localStorage 与 sessionStorage 与 Cookie

就功能而言,cookie、sessionStorage 和 localStorage 只允许您存储字符串 - 可以在设置时隐式转换原始值(读取后需要将这些值转换回以用作它们的类型),但不能存储对象或数组(可以使用 API 对它们进行 JSON 序列化以存储它们)。会话存储通常允许您存储服务器端语言/框架支持的任何原语或对象。

客户端与服务器端

由于 HTTP 是一种无状态协议 - Web 应用程序在返回网站时无法从以前的访问中识别用户 - 会话数据通常依赖于 cookie 令牌来识别用户以进行重复访问(尽管很少使用 URL 参数相同的目的)。数据通常会有一个滑动到期时间(每次用户访问时都会更新),并且取决于您的服务器/框架,数据将要么存储在进程内(这意味着如果 Web 服务器崩溃或重新启动,数据将丢失)或外部存储在状态服务器或数据库。这在使用网络农场(给定网站的多个服务器)时也是必要的。

由于会话数据完全由您的应用程序(服务器端)控制,因此它是本质上敏感或安全的任何东西的最佳位置。

服务器端数据的明显缺点是可伸缩性 - 在会话期间每个用户都需要服务器资源,并且客户端所需的任何数据都必须随每个请求一起发送。由于服务器无法知道用户是否导航到另一个站点或关闭其浏览器,因此会话数据必须在给定时间后过期,以避免所有服务器资源被废弃的会话占用。因此,在使用会话数据时,您应该注意数据过期和丢失的可能性,尤其是在表单较长的页面上。如果用户删除他们的 cookie 或切换浏览器/设备,它也会丢失。

一些 Web 框架/开发人员使用隐藏的 HTML 输入将数据从表单的一个页面保存到另一个页面,以避免会话过期。

localStorage、sessionStorage 和 cookie 都受“同源”规则的约束,这意味着浏览器应阻止访问数据,但设置信息开始的域除外。

如需进一步了解客户端存储技术,请参阅 Dive Into Html 5


注意:sessionStorage、localStorage 不适用于身份验证信息。它们不会自动发送到服务器。这意味着如果用户手动更改 URL,或单击 HTML 链接,您将不会获得身份验证信息。即使您重写 HTML 链接,您也必须通过 URL 传递身份验证信息,这是安全禁忌。最终,您将被迫使用 Cookie。有关相关主题,请参阅 stackoverflow.com/q/26556749/14731
window 或标签关闭时会删除 sessionStorage 吗?
关闭选项卡时将删除 sessionStorage。
@Gili 如果不使用 cookie,为什么通过 URL 传递身份验证信息是唯一的选择?为什么不在 HTTP 标头中传递它?
@Gili你说它不会自动发送是正确的,但你说它不合适是不正确的。我在为我的客户提供的许多不同的生产应用程序中使用 localStorage 和 sessionStorage,并且由于依赖 localStorage/sessionStorage 以及在标头中发送 id 和令牌而没有一个漏洞。甚至减少服务器上的负载。此外,我将一个事件绑定到页面重新加载和应用程序加载挂钩,以询问我的后端该用户是否仍然经过身份验证。效果很好。祝您认证愉快!编辑:一个 CSRF 令牌,所有这些都增加了更多的安全性。
s
softvar

LocalStorage 优点:Web 存储可以简单地视为对 cookie 的改进,提供更大的存储容量。如果您查看 Mozilla 源代码,我们可以看到 5120KB(5MB 相当于 Chrome 上的 250 万个字符)是整个域的默认存储大小。与典型的 4KB cookie 相比,这为您提供了更多的工作空间。对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据不会被发送回服务器 - 减少了客户端和服务器之间的流量。存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。缺点:它适用于同源策略。因此,存储的数据将仅在同一来源上可用。 Cookies 优点:与其他人相比,没有什么 AFAIK。缺点:4K 限制是针对整个 cookie 的,包括名称、值、到期日期等。为了支持大多数浏览器,请将名称保持在 4000 字节以下,整体 cookie 大小在 4093 字节以下。对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据都会被发送回服务器 - 增加了客户端和服务器之间的流量。通常,允许以下内容: 总共 300 个 cookie 每个 cookie 4096 个字节 每个域 20 个 cookie 每个域 81920 个字节(假设 20 个最大大小为 4096 = 81920 字节的 cookie。) sessionStorage 优点:它类似于 localStorage。数据不是持久的,即数据仅在每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)可用。数据仅在页面会话期间可用。所做的更改已保存并可用于当前页面,以及将来在同一选项卡/窗口上访问该站点时可用。关闭选项卡/窗口后,数据将被删除。缺点:数据仅在设置它的窗口/选项卡内可用。与 localStorage 一样,它适用于同源策略。因此,存储的数据将仅在同一来源上可用。

结帐 across-tabs - 如何促进跨域浏览器选项卡之间的轻松通信。


Cookies :“每个 HTTP 请求都会将数据发送回服务器”。在某些用例中(例如在身份验证过程中),这也可能被视为一种优势。 sessionStorage:“更改仅适用于每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)”。我认为最好将其表述为“更改仅在页面会话期间可用”。只要浏览器打开,页面会话就会持续,并且在页面重新加载和恢复后仍然存在(来自 MDN:developer.mozilla.org/en/docs/Web/API/Window/sessionStorage
更新!谢谢@DenizToprak
@softvar:sessionStorage - Con 2。:“数据不是持久的,即一旦关闭窗口/选项卡,它就会丢失。” - 这绝对不是缺陷。我会说这是一个优势。毕竟是“会话”存储。它旨在以这种方式工作。
@devstructor 是的,你是对的。我认为它是在本地存储一些数据。已更新答案。感谢您指出了这一点。
@softvar 您说 sessionStorage 可用于未来在同一窗口中的访问。 sessionStorage 的生命不是直到页面存在吗?当标签或窗口关闭时,它会被销毁。如果正如我所说的那样,如何关闭一个站点并在同一个窗口中再次打开它,让我之前存储的 sessionStorage 可用?
A
Alireza

OK,LocalStorage 被称为是浏览器的本地存储,最多可以节省 10MB,SessionStorage 也一样,但是顾名思义,它是基于会话的,在关闭浏览器后会被删除,也可以节省不到 LocalStorage,最多 5MB,但 Cookie 是存储在浏览器中的非常小的数据,最多可以节省 4KB,可以通过服务器或浏览器访问...

我还创建了下面的图像以一目了然地显示差异:

https://i.stack.imgur.com/cI5kT.jpg


N
Ntwari Clarance Liberiste

这是一个快速回顾和简单快速的理解

https://i.stack.imgur.com/sMNoo.png

来自 freecodecamp 的讲师 Beau Carnes


P
Prashant_M

这些是 JavaScript 中“窗口”对象的属性,就像 document 是包含 DOM 对象的窗口对象的属性之一一样。

会话存储属性为每个给定的源维护一个单独的存储区域,该区域在页面会话期间可用,即只要浏览器打开,包括页面重新加载和恢复。

本地存储做同样的事情,但即使在浏览器关闭并重新打开时仍然存在。

您可以按如下方式设置和检索存储的数据:

sessionStorage.setItem('key', 'value');

var data = sessionStorage.getItem('key');

localStorage 也是如此。


只需添加 - 对于 sessionStorage,即使是新标签也是一个新窗口。因此,在一个选项卡中为特定域存储的任何内容都不能用于下一个选项卡中的同一域。
C
Community

Web Storage API 提供了浏览器可以安全地存储键/值对的机制,比使用 cookie 更直观。 Web Storage API 使用两个新属性 — Window.sessionStorageWindow.localStorage 扩展了 Window 对象。 ——调用其中一个将创建一个 Storage 对象的实例,通过它可以设置、检索和删除数据项。每个源(域)的 sessionStoragelocalStorage 使用不同的存储对象。

存储对象是简单的键值存储,类似于对象,但它们在页面加载时保持不变。

localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');

键和值始终是字符串。存储任何类型 convert it to String 然后存储它。始终建议使用 Storage interface 方法。

var testObject = { 'one': 1, 'two': 2, 'three': 3 };
// Put the object into storage
localStorage.setItem('testObject', JSON.stringify(testObject));
// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');
console.log('Converting String to Object: ', JSON.parse(retrievedObject));

Web Storage 内部的两种机制如下:

sessionStorage 为每个给定的 originSame-origin 策略维护一个单独的存储区域,该策略在页面会话期间可用(只要浏览器处于打开状态,包括页面重新加载和恢复)。

localStorage 做同样的事情,但即使在浏览器关闭并重新打开时仍然存在。

存储 « 本地存储将数据写入磁盘,而会话存储仅将数据写入内存。当您的应用退出时,任何写入会话存储的数据都会被清除。

maximum storage available is different per browser,但大多数浏览器至少实现了 w3c 建议的最大存储限制 5MB

+----------------+--------+---------+-----------+--------+
|                | Chrome | Firefox | Safari    |  IE    |
+----------------+--------+---------+-----------+--------+
| LocalStorage   | 10MB   | 10MB    | 5MB       | 10MB   |
+----------------+--------+---------+-----------+--------+
| SessionStorage | 10MB   | 10MB    | Unlimited | 10MB   |
+----------------+--------+---------+-----------+--------+

始终捕获 LocalStorage 安全和配额超出错误

QuotaExceededError:当此函数 window.sessionStorage.setItem(key, value); 超出存储限制时,如果无法设置新值,则会抛出“QuotaExceededError”DOMException 异常。 (例如,如果用户禁用了站点的存储,或者超出了配额,设置可能会失败。) DOMException.QUOTA_EXCEEDED_ERR 为 22,例如小提琴。

SecurityError : Uncaught SecurityError: 拒绝访问此文档的“localStorage”。 CHROME:-隐私和安全 « 内容设置 « Cookie « 阻止第三方 cookie。

StorageEvent « 当存储区域发生变化时,会在文档的 Window 对象上触发存储事件。当用户代理要为 Document 发送存储通知时,用户代理必须使用 StorageEvent 将任务排队以在 Document 对象的 Window 对象上触发名为 storage 的事件。

注意:有关真实世界的示例,请参阅 Web 存储演示。查看源代码

监听 dom/Window 上的 storage 事件来捕捉 storage 的变化。 fiddle

Cookie(网络 cookie、浏览器 cookie) Cookie 是在您的计算机上以名称-值对的形式存储在小型文本文件中的数据。

使用 Document.cookie 访问 JavaScript

也可以使用 Document.cookie 属性通过 JavaScript 创建新的 cookie,如果未设置 HttpOnly 标志,则也可以从 JavaScript 访问现有的 cookie。

document.cookie = "yummy_cookie=choco"; 
document.cookie = "tasty_cookie=strawberry"; 
console.log(document.cookie); 
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

安全和 HttpOnly cookie HTTP 状态管理机制

Cookies 通常在 Web 应用程序中用于识别用户及其经过身份验证的会话

当接收到 HTTP 请求时,服务器可以发送带有响应的 Set-Cookie 标头。 cookie 通常由浏览器存储,然后将 cookie 与在 Cookie HTTP 标头内向同一服务器发出的请求一起发送。

Set-Cookie: <cookie-name>=<cookie-value> 
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>

当客户端关闭时,会话 cookie 将被删除。他们没有指定 Expires 或 Max-Age 指令。

Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/

永久 cookie 在特定日期 (Expires) 或特定时间长度 (Max-Age) 后过期。

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

Cookie HTTP 请求标头包含服务器先前发送的带有 Set-Cookie 标头的存储的 HTTP cookie。仅 HTTP cookie 无法通过 JavaScript 通过 Document.cookie 属性、XMLHttpRequest 和请求 API 访问,以减轻对跨站点脚本 (XSS) 的攻击。

Cookies主要用于三个目的:

会话管理 « 登录、购物车、游戏分数或服务器应记住的任何其他内容

个性化 « 用户偏好、主题和其他设置

跟踪(记录和分析用户行为) « Cookie 具有与之关联的域。如果此域与您所在页面的域相同,则称 cookie 为第一方 cookie。如果域不同,则称为第三方 cookie。虽然第一方 cookie 仅发送到设置它们的服务器,但网页可能包含存储在其他域的服务器上的图像或其他组件(如广告横幅)。通过这些第三方组件发送的 Cookie 称为第三方 Cookie,主要用于网络上的广告和跟踪。

发明 Cookie 是为了解决“如何记住用户信息”的问题:

当用户访问网页时,他的姓名可以存储在 cookie 中。

下次用户访问该页面时,属于该页面的 cookie 会添加到请求中。通过这种方式,服务器获取必要的数据来“记住”有关用户的信息。

GitHubGist Example

作为总结,

localStorage 在不同的选项卡或窗口上持续存在,即使我们关闭浏览器,也会根据域安全策略和用户对配额限制的选择进行相应的处理。

如果我们关闭选项卡(顶级浏览上下文),sessionStorage 对象不会持续存在,因为如果我们通过另一个选项卡或窗口浏览,它就不存在。

Web Storage(会话,本地)允许我们保存大量的键/值对和大量的文本,这是通过 cookie 无法做到的。

用于敏感操作的 Cookie 的生命周期应该很短。

Cookies 主要用于网络上的广告和跟踪。例如,请参阅 Google 使用的 cookie 类型。

每次请求都会发送 Cookie,因此它们会降低性能(尤其是对于移动数据连接)。用于客户端存储的现代 API 是 Web 存储 API(localStorage 和 sessionStorage)和 IndexedDB。


S
Srikrushna

本地存储:它保持存储用户信息数据,没有过期日期,当用户关闭浏览器窗口时,这些数据不会被删除,它可以用于日、周、月和年。

在本地存储中可以存储 5-10mb 的离线数据。

//Set the value in a local storage object
localStorage.setItem('name', myName);

//Get the value from storage object
localStorage.getItem('name');

//Delete the value from local storage object
localStorage.removeItem(name);//Delete specifice obeject from local storege
localStorage.clear();//Delete all from local storege

会话存储:与本地存储日期相同,只是它会在 Web 用户关闭浏览器窗口时删除所有窗口。

在会话存储中最多可以存储 5 mb 数据

//set the value to a object in session storege
sessionStorage.myNameInSession = "Krishna";

会话:会话是存储在服务器上的全局变量。每个会话都分配有一个唯一的 ID,用于检索存储的值。

Cookies:Cookies 是数据,以名称-值对的形式存储在您的计算机上的小型文本文件中。设置 cookie 后,随后的所有页面请求都会返回 cookie 名称和值。


D
Developer

本地存储:

Web 存储可以简单地视为对 cookie 的改进,提供更大的存储容量。可用大小为 5MB,与典型的 4KB cookie 相比,可使用的空间要大得多。

对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据不会被发送回服务器 - 减少了客户端和服务器之间的流量。

存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。

它适用于同源策略。因此,存储的数据将仅在同一来源上可用。

饼干:

我们可以为每个cookie设置过期时间

4K 限制是针对整个 cookie,包括名称、值、到期日期等。要支持大多数浏览器,请将名称保持在 4000 字节以下,并且整体 cookie 大小在 4093 字节以下。

对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据都会被发送回服务器 - 增加了客户端和服务器之间的流量。

会话存储:

它类似于本地存储。

更改仅适用于每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)。所做的更改已保存并可用于当前页面,以及将来在同一窗口中访问该站点时可用。关闭窗口后,将删除存储数据仅在设置它的窗口/选项卡内可用。

数据不是持久的,即一旦关闭窗口/选项卡就会丢失。与 localStorage 一样,它适用于同源策略。因此,存储的数据将仅在同一来源上可用。


V
Vivek Kumar

确切的用例 -

如果您希望您的页面始终保存一些非机密数据,那么您可以使用 localStorage。

如果服务器需要知道一些信息,比如认证密钥,你应该使用 cookie 来存储它们。

sessionStorage 可用于存储界面的状态,即,每当您访问一个页面、对其进行自定义、访问另一个页面并返回同一页面时,您都希望向该页面显示用户如何自定义它。这是 sessionStorage 的一个很好的用例。

https://i.stack.imgur.com/6EL55.png


P
Pankaj

本地存储

使用 localStorage 存储的数据没有过期日期,只能通过 JavaScript 或清除浏览器缓存/本地存储的数据来清除。存储限制是三者中的最大值。存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。它适用于同源策略。因此,存储的数据将仅在同一来源上可用。

会话存储

它仅为会话存储数据,这意味着数据会一直存储到浏览器(或选项卡)关闭为止。数据永远不会传输到服务器。更改仅适用于每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)。所做的更改已保存并可用于当前页面,以及将来在同一窗口中访问该站点时可用。窗口关闭后,存储将被删除。