为啥“安全”cookie 不安全?
Posted
技术标签:
【中文标题】为啥“安全”cookie 不安全?【英文标题】:Why are "secure" cookies insecure?为什么“安全”cookie 不安全? 【发布时间】:2019-10-27 21:58:59 【问题描述】:MDN docs on HTTP cookies 状态:
安全 cookie 仅通过 HTTPS 协议通过加密请求发送到服务器。即使使用 Secure,也不应将敏感信息存储在 cookie 中,因为它们本质上是不安全的,并且此标志无法提供真正的保护。
HTTPS 请求的请求正文和所有标头都使用 TLS 加密,包括 Set-Cookie:
响应标头和 Cookie:
请求标头。这应该可以防止第三方读取或篡改 cookie 值。
那么为什么 cookie “本质上是不安全的”?(也许 Mozilla 认为有权访问用户计算机的人能够检查他们的 cookie?)
【问题讨论】:
【参考方案1】:为什么 cookie “固有地 不安全”?
cookie最大的问题是:它存储在用户的电脑中,导致了很多可能性。一旦将 cookie 发送给客户端,服务器就会失去对 cookie 隐私的控制。由于 cookie 数据存储在用户的计算机中,因此在以下情况下可能会泄露数据:
操作系统中的漏洞被攻击者利用。 用户代理中的漏洞被攻击者利用。 浏览器扩展可以获得读取cookies的权限(例如Chrome)。是的,会向用户显示一条通知,但很多人只是忽略该警报并点击“是”。 其他人可以在浏览器开发工具中检查 Cookie。 更多...对于secure
标志,如果您将secure
cookie中的敏感信息发送到浏览器,仍然存在安全问题:
httpOnly
标志,所有恶意脚本都可以读取该cookie,并将信息发送到任何服务器。
如果domain
设置不正确,您可能会将敏感cookie 泄漏到某些接口。例如,如果secure
cookie 的domain
是/
,那么所有后端 API 都会收到敏感数据,这可能不是您想要的。
【讨论】:
这两点都很好,但它们似乎并不代表固有的不安全感。他们确实表明,单独的Secure
指令不足以使 cookie 变得“安全”,但并不是说它不能变得安全。
@NathanLong 啊,我明白你的意思了。请检查我的更新答案。
好点。一些 web 框架可以很容易地对 cookie 内容进行加密,这样可以减少 cookie 被盗时造成的损失,但当然攻击者仍然可以冒充用户。窃取的 API 令牌或服务器可能提供给客户端的任何其他标识符也是如此。
仅供参考,MDN 文档的这一部分现已更正:github.com/mdn/sprints/issues/2914 本质上,这里的重点是使传输安全并不能“绝对”保护信息。例如,如果没有设置 HttpOnly 属性,客户端仍然可以访问硬盘驱动器和 javascript。以上是关于为啥“安全”cookie 不安全?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring MockMvc 结果不包含 cookie?
为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?
为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?