localStorage,sessionStorage,session和cookie之间有什么区别?


531

localStorage,sessionStorage,session和cookie的技术优缺点是什么,何时可以在另一个之上使用?


2
这也是一个相关的主题好看看:HTML5本地存储与会话存储(stackoverflow.com/questions/5523140/...
萨林JS

2
还要注意,只要打开浏览器窗口(不是在其中设置了标签页),会话cookie就会一直存在,但是一旦您关闭标签页,sessionStorage就将为空...
yar1 '16

是的,会话也是cookie的类型。特征是cookie持久存在的地方是短暂的
Faris Rayhan

@ yar1特定的浏览器窗口是不相关的UI元素。
curiousguy18年

Answers:


717

这是一个范围极为广泛的问题,很多利弊都取决于具体情况。

在所有情况下,这些存储机制都将特定于单个计算机/设备上的单个浏览器。跨会话持续存储数据的任何要求都将涉及您的应用服务器端-最有可能使用数据库,但可能使用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和来自JavaScript的值(这也将阻止您自己的合法JavaScript访问它们)。这对于身份验证cookie尤其重要,身份验证cookie用于存储包含登录用户详细信息的令牌-如果您具有该cookie的副本,则出于所有意图和目的,您将成为该用户,直至该Web应用程序为止。并具有与用户拥有的数据和功能相同的访问权限。

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

localStorage vs.sessionStorage vs.Cookie

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

客户端与服务器端

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

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

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

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

localStorage,sessionStorage和Cookie均受“同源”规则的约束,这意味着浏览器应阻止访问数据(设置信息开头的域除外)。

有关客户端存储技术的更多信息,请参阅Dive Into Html 5


34
注意:sessionStorage,localStorage不适合身份验证信息。它们不会自动发送到服务器。这意味着,如果用户手动更改URL或单击HTML链接,则不会获得身份验证信息。即使重写HTML链接,也必须通过URL传递身份验证信息,这是安全禁止。最终,您将被迫使用Cookies。有关相关主题,请参见stackoverflow.com/q/26556749/14731
吉利2014年

23
关闭窗口或标签sessionStorage时会被删除吗?
trysis 2014年

34
关闭选项卡后,sessionStorage将被删除。
rcarrillopadron

10
@Gili如果不使用cookie,为什么通过URL传递身份验证信息是唯一的选择?为什么不将其传递给HTTP标头?
yby

21
@Gili您正确地说它不会自动发送,但是您不正确说它不合适。我在许多不同的生产应用程序中使用localStorage和sessionStorage,因为我依赖客户端,并且由于依赖localStorage / sessionStorage以及在标头中发送ID和令牌而没有一个漏洞。甚至减轻服务器负载。另外,我将事件绑定到页面重新加载和应用程序加载挂钩,以询问后端是否对该用户进行了身份验证。效果很好。验证愉快!编辑:CSRF令牌具有所有的功能,可进一步提高安全性。
NodeDad

74
  1. 本地存储

    优点

    1. 可以简单地将Web存储视为cookie的一种改进,它提供了更大的存储容量。如果您查看Mozilla的源代码,我们可以看到5120KB5MB,在Chrome上等于250万个字符)是整个域的默认存储大小。与典型的4KB Cookie相比,这为您提供了更多的处理空间。
    2. 不会针对每个HTTP请求(HTML,图像,JavaScript,CSS等)将数据发送回服务器,从而减少了客户端与服务器之间的通信量。
    3. 存储在localStorage中的数据将一直保留到明确删除为止。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。

    缺点

    1. 它适用于同源策略。因此,存储的数据仅在相同的来源可用。
  2. 饼干

    优点:

    1. 与其他人相比,没有AFAIK。

    缺点:

    1. 4K限制适用于整个cookie,包括名称,值,有效期限等。要支持大多数浏览器,请将该名称保留在4000字节以下,并将cookie的整体大小保留在4093字节以下。
    2. 每个HTTP请求(HTML,图像,JavaScript,CSS等)会将数据发送回服务器,从而增加了客户端与服务器之间的通信量。

      通常,允许以下操作:

      • 总共300个 Cookie
      • 每个Cookie 4096个字节
      • 每个域20个Cookie
      • 每个域81920字节(给出20个最大大小为4096的cookie = 81920字节。)
  3. sessionStorage

    优点:

    1. 它类似于localStorage
    2. 数据不是永久性的,即,仅每个窗口(或Chrome和Firefox等浏览器中的标签)提供数据。数据仅在页面会话期间可用。所做的更改将被保存,并且可用于当前页面,以及以后在同一窗口上对该站点的访问。关闭窗口后,将删除存储。

    缺点:

    1. 数据仅在设置它的窗口/选项卡内可用。
    2. 就像localStorage,它适用于同源政策。因此,存储的数据仅在相同的来源可用。

跨标签签出-如何简化跨源浏览器标签之间的交流。


13
Cookies:“ 每次HTTP请求,数据都会发送回服务器 ”。在某些用例中(例如在身份验证过程中),这也可以视为优势。 sessionStorage:“ 更改仅适用于每个窗口(或Chrome和Firefox等浏览器中的选项卡) ”。我认为最好将其表述为“ 更改仅在页面会话期间可用 ”。页面会话的持续时间只要浏览器处于打开状态,并且在页面重新加载和还原后仍然存在(来自MDN:developer.mozilla.org/en/docs/Web/API/Window/sessionStorage
Deniz,2017年

更新!感谢@DenizToprak
softvar

1
@softvar:sessionStorage-Con 2 .:“数据不是持久性的,即,一旦关闭窗口/选项卡,数据将丢失。” -这绝对不是缺陷。我会说这是一个优势。毕竟是“会话”存储。它旨在以这种方式工作。
devstructor

@devstructor是的,您是对的。我认为这是在本地存储一些数据的方面。更新了答案。感谢您指出了这一点。
softvar '18

56

好的,LocalStorage就是您浏览器的本地存储,它可以节省多达10MB的空间SessionStorage可以做到这一点,但是顾名思义,它是基于会话的,在关闭浏览器后将被删除,还可以节省不到LocalStorage的费用,例如最大5MB,但是Cookies是浏览器中存储的非常小的数据,最多可以节省4KB,并且可以通过服务器或浏览器访问...

我还创建了以下图像,以一眼看出差异:

LocalStorage,SessionStorage和Cookies


25

这些是JavaScript中“窗口”对象的属性,就像文档是保存DOM对象的窗口对象的属性之一一样。

“会话存储”属性为每个给定的来源维护一个单独的存储区域,该存储区域在页面会话期间(即,只要浏览器处于打开状态,包括页面重新加载和还原)就可用。

本地存储执行相同的操作,但是即使关闭并重新打开浏览器也可以保留。

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

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

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

对于localStorage同样。


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

5

本地存储:一直存储用户信息数据,没有到期日期。当用户关闭浏览器窗口时,该数据将不会被删除,它将在日,周,月和年可用。

在本地存储中可以存储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,该ID用于检索存储的值。

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


2

Web存储API提供了一种机制,通过这种机制,浏览器可以以比使用cookie更直观的方式安全地存储键/值对。在Web存储API扩展了Window两个新的属性对象- Window.sessionStorageWindow.localStorage—调用其中之一将创建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存储中的两种机制如下:

  • sessionStorage为每个给定的起源维护一个单独的存储区域。同源策略在页面会话持续时间内可用(只要打开浏览器,包括页面重新加载和还原)。
  • localStorage可以做同样的事情,但是即使关闭并重新打开浏览器也可以保留。

存储 « 本地存储将数据写入磁盘,而会话存储仅将数据写入内存。应用退出时,将清除写入会话存储的所有数据。

每个浏览器可用最大存储量有所不同,但是大多数浏览器已实现w3c建议的至少5MB的最大存储限制。

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

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

StorageEvent «当存储区域更改时,将在文档的Window对象上触发存储事件。当用户代理要发送文档的存储通知时,该用户代理必须使用StorageEvent在文档对象的Window对象上排队执行一个任务,以激发一个名为storage的事件。

注意:有关真实示例,请参阅Web Storage Demo查看源代码

监听dom / Window上的存储事件以捕获存储中的更改。摆弄


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

使用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与在HTTP 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和Request API进行访问,以减轻针对跨站点脚本(XSS)的攻击。

Cookies主要用于三个目的:

  • 会话管理 «登录名,购物车,游戏得分或服务器应记住的其他任何内容
  • 个性化 «用户首选项,主题和其他设置
  • 跟踪(记录和分析用户行为)«Cookies具有与之关联的域。如果此域与您所在页面的域相同,则该cookie被称为第一方cookie。如果域不同,则称其为第三方cookie。虽然第一方Cookie仅发送给设置它们的服务器,但网页可能包含图像或其他域中存储在服务器上的其他组件(例如广告横幅)。通过这些第三方组件发送的Cookie被称为第三方Cookie,主要用于在网络上进行广告和跟踪。

发明了Cookies来解决“如何记住有关用户的信息”的问题:

  • 当用户访问网页时,其名称可以存储在cookie中。
  • 下次用户访问该页面时,属于该页面的cookie将添加到请求中。这样,服务器将获得必要的数据以“记住”有关用户的信息。

GitHubGist 示例


作为总结,

  • localStorage会保留在不同的选项卡或窗口中,即使我们关闭浏览器,也会相应地使用域安全策略和用户对配额限制的选择。
  • 如果关闭选项卡(顶级浏览上下文),则sessionStorage对象不会持久,因为如果通过另一个选项卡或窗口浏览,则该对象将不存在。
  • Web存储(会话,本地)允许我们保存大量的键/值对和大量文本,而这是无法通过Cookie进行的。
  • 用于敏感操作的Cookie的寿命应仅较短。
  • Cookies主要用于在网络上进行广告和跟踪。例如,请参阅Google使用的Cookie类型
  • Cookie随每个请求一起发送,因此它们可能会降低性能(尤其是对于移动数据连接而言)。用于客户端存储的现代API是Web存储API(localStorage和sessionStorage)和IndexedDB。

2

本地存储

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

  • 不会针对每个HTTP请求(HTML,图像,JavaScript,CSS等)将数据发送回服务器,从而减少了客户端与服务器之间的通信量。

  • 存储在localStorage中的数据将一直保留到明确删除为止。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。

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

饼干:

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

  • 4K限制适用于整个cookie,包括名称,值,有效期限等。要支持大多数浏览器,请将该名称保留在4000字节以下,并将cookie的整体大小保留在4093字节以下。

  • 每个HTTP请求(HTML,图像,JavaScript,CSS等)会将数据发送回服务器,从而增加了客户端与服务器之间的通信量。

sessionStorage:

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

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


0

这里是一个快速的回顾,并具有简单而快速的理解

在此处输入图片说明

来自freecodecamp的Beau Carnes老师

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.