cookie 哪个更安全:__Host 前缀或设置域?

Which is more secure for a cookie: __Host prefix or setting the Domain?

它们似乎都将 cookie 锁定到域,但它们不兼容(因为使用 __Host 前缀需要不设置域)。

我还没有找到一个更好的论据。我意识到使用 Domain 属性有一些特性,比如允许子域使用 cookie,这似乎是人们在 __Host.

上使用它的唯一原因

但在所有条件都相同且假设没有子域的情况下,您能解释一下为什么一个会比另一个更好吗?

这是一项安全功能。如果您的网站是单个静态页面(或没有子域等),那没关系。

对于具有更大攻击面的更高级的应用程序,攻击者可能能够在您的子域上执行 JS。例如,通过上传一些内容、XSS 或悬空 DNS。

当您的应用程序服务器看到 __Host- 前缀时,可以确定 cookie 是在域上设置的,而不是在受感染的子域上。

创建 __Host- 前缀是为了解决一些与 cookie 相关的安全问题,并且应该始终在域属性上使用。将域属性留空实际上更安全,因为这样您的 cookie 将仅发送回设置 cookie 的同一主机。这在 RFC6265:

中称为 host-only 标志

If the domain attribute is [empty] set the cookie's host-only flag to true.

__Host- 前缀还可以保护您的 cookie 不被托管在您域的不同子域上的网站覆盖。这是因为它们也受到 host-only 标志的约束。

最后,未加密的连接会使您的网站容易受到 man-in-the-middle 固定攻击。 __Host- 前缀通过不允许未加密的连接使用带有此前缀的 cookie 来解决此问题,从而阻止恶意第三方注入与安全 cookie 同名的 set-cookie header用户正在从 http 重定向到 https。

如果您需要设置域或路径属性,但仍需要 __Host- 前缀提供的安全性,您可以使用 __Secure- 前缀。与 __Host- 前缀一样,带有 __Secure- 前缀的 cookie 只能通过安全连接设置。