当我们创建 cookie 时,我们可以通过设置域属性来指定它的使用位置。
Set-Cookie: Foo=bar; Path=/; Secure; Domain=baz.qux.com;
上面的 cookie 将仅与对域的请求一起使用
baz.qux.com
。
Set-Cookie: Foo=bar; Path=/; Secure; SameSite=strict;
上面的 cookie 省略了
domain
属性,这意味着将使用 cookie set 所在的域(不包括子域,IE 例外)。它还具有属性SameSite=strict
,这意味着:
SameSite cookie 允许服务器要求 cookie 不应与跨站点(其中站点由可注册域定义)请求一起发送,这提供了针对跨站点请求伪造攻击 (CSRF) 的一些保护。
来自MDN
如果这两个 cookie 都设置在域上,那么它们之间的行为有何差异
baz.qux.com
?
SameSite=strict
属性如何防止 CSRF,而具有指定域的其他 cookie 却无法做到这一点?
Domain
属性扩大了 cookie 将发送到的主机集。 SameSite
属性限制 cookie 的发送源。
所以第一个饼干:
Set-Cookie: Foo=bar; Path=/; Secure; Domain=baz.qux.com;
可以发送到
baz.qux.com
或其任何子域,无论请求来源如何(即是否从baz.qux.com
或foo.example.com
托管的网页发送)
第二块饼干:
Set-Cookie: Foo=bar; Path=/; Secure; SameSite=strict;
只能发送到
baz.qux.com
(因为没有指定域,并且忽略 IE 例外),并且仅当请求来自 qux.com
站点时(即不会发送跨站点请求。)
这有助于防止随机网站 (
hacker.example.com
) 向包含会话 cookie 的第三方 (baz.qux.com
) 执行经过身份验证的请求,从而防止 CSRF。