本地存储与会话令牌安全对比分析

本文深入探讨了在本地存储与Cookie中存储会话令牌的安全差异,分析了两种存储方式的优缺点及适用场景,帮助开发者做出更安全的技术选择。

在本地存储中存储会话令牌

我多次听到关于在localStorage或document.cookie中存储凭据或其他敏感信息哪个更安全的讨论。但我目前正在构建一个平台,我想知道,在localStorage或document.cookie中存储会话令牌实际上哪个更安全?

我之所以这样问,是因为根据我的理解(可能是错误的):

  • localStorage无法通过HTTP请求被看到,与document.cookie不同
  • localStorage比cookie更容易设置和查看数据
  • localStorage更加简单(例如没有过期时间等)

但如果localStorage比document.cookie好这么多,我想知道为什么流行网站倾向于使用cookie。

我应该使用哪一个?为什么?

专家回答

localStorage并不比cookie更安全。它有一些好处,但也有很多主要缺点,不仅仅是安全相关的。

localStorage相比cookie的好处:

  • 天生免疫跨站请求伪造,因为存储在localStorage中的令牌永远不会自动包含在请求中
  • 严格绑定到文档的源,因此没有意外泄漏到子域或通过明文HTTP的风险

缺点:

  • 显然需要用户启用JavaScript。cookie没有这个限制。因此,除非Web应用程序已经强制要求JavaScript支持,否则cookie的支持更好
  • JavaScript对localStorage内容具有无限制的访问权限。相比之下,cookie可以通过HttpOnly标志阻止JavaScript访问,使其对跨站脚本的窃取免疫
  • 过期时间未定义。你声称这是一个好处,但认证令牌应该过期。你不希望令牌永远停留在浏览器存储中,特别是当设备可能被共享时。请注意,无论浏览器存储是否过期,你都可以并且应该实现服务器端令牌过期,但最好两者都有
  • 你无法受益于cookie特定的安全功能,如Chromium中的应用绑定加密

除此之外,cookie安全性已经通过例如cookie前缀、SameSite属性和HttpOnly等功能得到了很大改进。请注意,将cookie限制在同一站点(即SameSite=Strict)仍然比localStorage更宽松,后者限制在同一源,因此你应该采用额外的反CSRF措施,如同步令牌模式。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计