最近有人告诉我,cookie 比常规的旧 HTTP 标头“更安全”,后者比 URL 参数更安全,尤其是在传递访问令牌时。cookie 比 HTTP 标头更安全的原因是什么?
另外,我很确定我理解为什么 URL 参数不安全:因为它始终可见并且很容易被抓取。那是对的吗?
最近有人告诉我,cookie 比常规的旧 HTTP 标头“更安全”,后者比 URL 参数更安全,尤其是在传递访问令牌时。cookie 比 HTTP 标头更安全的原因是什么?
另外,我很确定我理解为什么 URL 参数不安全:因为它始终可见并且很容易被抓取。那是对的吗?
Cookie是HTTP 标头。标头称为Cookie:
,它包含您的 cookie。
但 cookie 实际上比 URL 参数更安全,因为 cookie 永远不会发送到其他域。另一方面,URL 参数最终会出现在Referer:
您直接从带有 URL 参数的站点访问的任何站点的标题中。
从浏览器传递数据的标准方法有三种:GET
、POST
和 cookie(为GET
和POST
请求发送)。如果您要求 www.example.org/spec.html?secret=foo,这是一个发送到服务器的示例请求:
GET /spec.html?secret=foo HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Accept: */*
将会话信息放在 URL 中使其容易被浏览器的用户复制。但是,从电线上的可见性角度来看,它没有任何区别。正是出于这个原因,敏感数据经常被POST
编辑。无论您以哪种方式提出请求,请记住它可能应该受到CSRF的保护。
至于 cookie,它们提供了一种存储在会话期间或整个浏览器选项卡中持续存在的数据的方法。
如果您通过 http 标头传递授权令牌,那么您每次发出请求时都需要有一个客户端逻辑将其传递给服务器。撇渣器可以在您的客户端代码中查找此内容,并可以使用 Java 脚本劫持您的用户会话。
但是,如果通过 cookie 传递相同的信息,则浏览器有责任在发出请求时传递 cookie(您无需编写客户端逻辑)。因此,识别传递令牌的机制有点困难(但并非不可能)。
如果 cookie 设置为 httponly,那么通过 JavaScript 几乎不可能进行会话劫持(已经阅读了一些浏览器确实会将此信息提供给 JavaScript,但支持正在增加)。并且 cookie 具有相同的来源策略。但是仍然使用像提琴手这样的工具,一个坚定的黑客将能够访问这些信息。
但是黑客应该能够嗅探网络以获取此信息。
所以总而言之,cookie 肯定更安全。
如果您非常关心安全性,那么请选择 SSL 证书,这几乎可以消除网络嗅探无用活动的威胁。