在本地存储中存储会话令牌
我多次听到关于在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措施,如同步令牌模式。