为啥浏览器会忽略 set-cookie 标头,并且未使用 fetch 从 Ajax 调用中保存 cookie?

Posted

技术标签:

【中文标题】为啥浏览器会忽略 set-cookie 标头,并且未使用 fetch 从 Ajax 调用中保存 cookie?【英文标题】:Why is a set-cookie header being ignored by browser and the cookies not saved from an Ajax call using fetch?为什么浏览器会忽略 set-cookie 标头,并且未使用 fetch 从 Ajax 调用中保存 cookie? 【发布时间】:2016-12-25 22:43:05 【问题描述】:

由于某种原因,我的浏览器(我尝试了几个)没有设置 cookie,即使当通过 Ajax 使用 fetch api 进行 GET 调用时服务器返回了有效的 set-cookie 响应来进行请求

如果我只是通过将 URL 放入浏览器中进行相同的 GET 调用,则(相同的)set-cookie 响应标头会受到浏览器的尊重并保存 cookie。

我已经通过 LiveHeaders 和 Chrome 网络检查器检查了请求和响应标头,没有区别。

编辑:澄清一下,这不是 ajax 向服务器发送 cookie 的问题。当响应返回带有有效的 set-cookies 标头时,浏览器根本不保存 cookie 是一个问题(根据文档,无论是否为 ajax,都应该尊重该标头)。

【问题讨论】:

***.com/questions/2870371/… 与@Sam Axe 的问题不同。问题不在于后续请求,而在于浏览器根本没有保存 cookie。 AJAX 请求是否与当前页面同源(协议、端口、域)? 是的,没有 CORS 影响。 【参考方案1】:

经过多次头疼后,我通过将请求的“凭据”属性设置为“包含”解决了这个问题。我的印象是,这仅控制在获取请求时向服务器发送 cookie,但显然,至少在我正在使用的实现中,如果未设置它也意味着如果从服务器。

来自https://fetch.spec.whatwg.org/的规范

一个请求有一个关联的凭证模式,即“省略”, “同源”或“包括”。除非另有说明,否则为“省略”。

请求的凭据模式控制在一个过程中的凭据流 拿来。当请求的模式为“导航”时,其凭证模式为 假定为“包含”并且 fetch 当前不考虑其他 价值观。如果这里的 html 发生变化,这个标准需要相应的 变化。

凭据是 HTTP cookie、TLS 客户端证书和身份验证条目。

【讨论】:

以上是关于为啥浏览器会忽略 set-cookie 标头,并且未使用 fetch 从 Ajax 调用中保存 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如果我们尝试设置之前安全的 cookie,浏览器会忽略 Set-Cookie 响应标头

AngularJS 忽略 HTTP 标头中的 Set-Cookie

API Gateway 结合 Lambda 集成和 CloudFront 忽略了多个 Set-Cookie 标头

为啥我看到多个 set-cookie 标头?

为啥我的“Set-Cookie”响应标头没有被翻译成实际的 cookie?

为啥在使用 setRequestHeader 制作 xmlhttprequest 时无法设置 cookie 和 set-cookie 标头?