localStorage
, sessionStorage
, session 和的技术优缺点是什么,cookies
我什么时候会使用其中一个?
10 回答
这是一个范围非常广泛的问题,许多优点/缺点将与情况相关。
在所有情况下,这些存储机制将特定于单个计算机/设备上的单个浏览器。跨会话持续存储数据的任何要求都需要涉及您的应用程序服务器端——最有可能使用数据库,但也可能使用 XML 或文本/CSV 文件。
localStorage、sessionStorage 和 cookie 都是客户端存储解决方案。会话数据保存在您直接控制的服务器上。
localStorage 和 sessionStorage
localStorage 和 sessionStorage 是相对较新的 API(也就是说,并非所有旧版浏览器都支持它们)并且几乎相同(在 API 和功能上),唯一的例外是持久性。sessionStorage(顾名思义)仅在浏览器会话期间可用(并且在选项卡或窗口关闭时被删除) - 但是,它确实可以在页面重新加载后继续存在(源DOM 存储指南 - Mozilla 开发者网络)。
显然,如果您存储的数据需要持续可用,那么 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。
-
优点:
- Web 存储可以简单地视为对 cookie 的改进,提供更大的存储容量。如果您查看 Mozilla 源代码,我们可以看到5120KB(5MB在 Chrome 上等于250 万个字符)是整个域的默认存储大小。与典型的 4KB cookie 相比,这为您提供了更多的工作空间。
- 对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据不会被发送回服务器 - 减少了客户端和服务器之间的流量。
- 存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。
缺点:
- 它适用于同源策略。因此,存储的数据将仅在同一来源上可用。
-
优点:
- 与其他人相比,没有什么AFAIK。
缺点:
- 4K 限制是针对整个 cookie,包括名称、值、到期日期等。要支持大多数浏览器,请将名称保持在 4000 字节以下,并且整体 cookie 大小在 4093 字节以下。
- 对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据都会被发送回服务器 - 增加了客户端和服务器之间的流量。
通常,允许执行以下操作:
- 总共300个饼干
- 每个 cookie 4096 字节
- 每个域20 个 cookie
- 每个域81920 字节(给定 20 个最大大小为 4096 = 81920 字节的 cookie。)
-
优点:
- 它类似于
localStorage
。 - 数据不是持久的,即数据仅在每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)可用。数据仅在页面会话期间可用。所做的更改已保存并可用于当前页面,以及将来在同一选项卡/窗口上访问该站点时可用。关闭选项卡/窗口后,数据将被删除。
缺点:
- 数据仅在设置它的窗口/选项卡内可用。
- 就像
localStorage
,它适用于同源策略。因此,存储的数据将仅在同一来源上可用。
- 它类似于
Checkout cross- tabs - 如何促进跨域浏览器选项卡之间的轻松通信。
这些是 JavaScript 中“窗口”对象的属性,就像 document 是包含 DOM 对象的窗口对象的属性之一一样。
会话存储属性为每个给定的源维护一个单独的存储区域,该区域在页面会话期间可用,即只要浏览器打开,包括页面重新加载和恢复。
本地存储做同样的事情,但即使在浏览器关闭并重新打开时仍然存在。
您可以按如下方式设置和检索存储的数据:
sessionStorage.setItem('key', 'value');
var data = sessionStorage.getItem('key');
localStorage 也是如此。
本地存储:它保持存储用户信息数据,没有过期日期,当用户关闭浏览器窗口时,这些数据不会被删除,它可以用于日、周、月和年。
在本地存储中可以存储 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 名称和值。
Web Storage API 提供了浏览器可以安全地存储键/值对的机制,比使用 cookie 更直观。Web 存储 APIWindow
使用两个新属性扩展该对象-Window.sessionStorage
和Window.localStorage
. — 调用其中一个将创建 Storage 对象的实例,通过该实例可以设置、检索和删除数据项。每个源(域)使用不同的存储对象sessionStorage
。localStorage
存储对象是简单的键值存储,类似于对象,但它们在页面加载时保持不变。
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为每个给定的同源策略维护一个单独的存储区域,该区域在页面会话期间可用(只要浏览器处于打开状态,包括页面重新加载和恢复)。
- localStorage做同样的事情,但即使在浏览器关闭并重新打开时仍然存在。
可用的最大存储空间因浏览器而异,但大多数浏览器至少实现了 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 异常。(例如,如果用户禁用了站点的存储,或者超出了配额,设置可能会失败。)DOM 异常。QUOTA_EXCEEDED_ERR 是 22,例如小提琴。
安全错误:
Uncaught SecurityError: Access to 'localStorage' is denied for this document
。CHROME:-Privacy and security « Content settings « Cookies « Block third-party cookies.
StorageEvent « 当存储区域发生变化时,会在文档的 Window 对象上触发存储事件。当用户代理要为 Document 发送存储通知时,用户代理必须使用 StorageEvent 将任务排队以在 Document 对象的 Window 对象上触发名为 storage 的事件。
监听 dom/Window 上的 storage 事件来捕捉 storage 的变化。小提琴。
Cookie(网络 cookie、浏览器 cookie)Cookie 是在您的计算机上以名称-值对的形式存储在小型文本文件中的数据。
也可以使用 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示例
作为总结,
- localStorage 在不同的选项卡或窗口上持续存在,即使我们关闭浏览器,也会根据域安全策略和用户对配额限制的选择进行相应的处理。
- 如果我们关闭选项卡(顶级浏览上下文),sessionStorage 对象不会持续存在,因为如果我们通过另一个选项卡或窗口浏览,它就不存在。
- Web Storage(会话,本地)允许我们保存大量的键/值对和大量的文本,这是通过 cookie 无法做到的。
- 用于敏感操作的 Cookie 的生命周期应该很短。
- Cookies 主要用于网络上的广告和跟踪。例如,请参阅Google 使用的 cookie 类型。
- 每次请求都会发送 Cookie,因此它们会降低性能(尤其是对于移动数据连接)。用于客户端存储的现代 API 是 Web 存储 API(localStorage 和 sessionStorage)和 IndexedDB。
本地存储:
Web 存储可以简单地视为对 cookie 的改进,提供更大的存储容量。可用大小为 5MB,与典型的 4KB cookie 相比,可使用的空间要大得多。
对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据不会被发送回服务器 - 减少了客户端和服务器之间的流量。
存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。
它适用于同源策略。因此,存储的数据将仅在同一来源上可用。
饼干:
我们可以为每个cookie设置过期时间
4K 限制是针对整个 cookie,包括名称、值、到期日期等。要支持大多数浏览器,请将名称保持在 4000 字节以下,并且整体 cookie 大小在 4093 字节以下。
对于每个 HTTP 请求(HTML、图像、JavaScript、CSS 等),数据都会被发送回服务器 - 增加了客户端和服务器之间的流量。
会话存储:
- 它类似于本地存储。
更改仅适用于每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)。所做的更改已保存并可用于当前页面,以及将来在同一窗口中访问该站点时可用。关闭窗口后,将删除存储数据仅在设置它的窗口/选项卡内可用。
数据不是持久的,即一旦关闭窗口/选项卡就会丢失。与 localStorage 一样,它适用于同源策略。因此,存储的数据将仅在同一来源上可用。
本地存储
- 使用 localStorage 存储的数据没有过期日期,只能通过 JavaScript 或清除浏览器缓存/本地存储的数据来清除。
- 存储限制是三者中的最大值。
- 存储在 localStorage 中的数据会一直存在,直到被明确删除。所做的更改将被保存并可供所有当前和将来访问该站点的用户使用。
- 它适用于同源策略。因此,存储的数据将仅在同一来源上可用。
会话存储
- 它仅为会话存储数据,这意味着数据会一直存储到浏览器(或选项卡)关闭为止。
- 数据永远不会传输到服务器。
- 更改仅适用于每个窗口(或 Chrome 和 Firefox 等浏览器中的选项卡)。所做的更改已保存并可用于当前页面,以及将来在同一窗口中访问该站点时可用。窗口关闭后,存储将被删除。