重定向后浏览器不会从带有 www 的域发送 cookie

Posted

技术标签:

【中文标题】重定向后浏览器不会从带有 www 的域发送 cookie【英文标题】:Browser doesn't send the cookie from domain with www after redirect 【发布时间】:2020-07-19 20:28:12 【问题描述】:

我的网站有一个临时版本,它是beta.example.com。我最近使用以下设置添加了 cookie 身份验证:

response.cookie(tokenName, token, 
  httpOnly: true,
  expires: new Date(Date.now() + (tokenExpirationSec * 1000))
)

在暂存身份验证工作中。

当我将代码部署到生产环境时,cookie 已成功设置(通过 Set-Cookie 标头),但未在服务器端请求中发送到服务器。因此,当我刷新登录状态时,它会消失,但会保留在客户端请求中。

值得注意的是,有一个从example.comwww.example.com 的301 重定向。 host 标头在生产中也是 www.example.com

我最终通过在设置cookie时添加domain参数解决了这个问题,如下所示:

response.cookie(tokenName, token, 
  httpOnly: true,
  expires: new Date(Date.now() + (tokenExpirationSec * 1000)),
  domain: '.example.com'
)

但是我并不完全理解问题的根源。根据MDN

域指定允许的主机接收 cookie。如果未指定,则默认为当前文档位置的主机,不包括子域。如果指定了域,则始终包含子域。

因此,当我在没有明确设置 domain 的情况下使用 beta.example.com 进行暂存时,根据 MDN,隐式 domain 将是 example.com,而 beta.example.com 将被排除在外。但是身份验证确实在暂存中起作用!

但是我在生产中遇到了与 www.example.com 相同的情况,那为什么它在生产中不起作用?

这是执行重定向的 nginx 配置:

server 
    listen       80 default_server;

    server_name beta.example.com;

    location / 
        include proxy_pass.inc;
    


server 
    listen       80 default_server;

    server_name www.example.com;

    location / 
        include proxy_pass.inc;
    


server 
    listen       80;
    server_name  example.com;
    return       301 https://www.example.com$request_uri;

【问题讨论】:

【参考方案1】:

我相信你误解了MDN documentation。

如果未指定,则默认为当前文档位置的主机,不包括子域

意思是如果你在beta.example.com,那么Domain 将被设置为值beta.example.com。这将从其他子域排除 cookie。

如果您想在所有子域上使用 cookie,您必须明确设置 Domain

【讨论】:

以上是关于重定向后浏览器不会从带有 www 的域发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

302 重定向后的 AJAX 调用将源设置为 null

NGINX 将 http 重定向到 https,将非 www 重定向到 ww

带有跨域重定向的 Safari xhr (AJAX) 请求失败

将domain.org重定向到www.domain.org

重定向后 Cookie 消失

如果域不正确则重定向