为什么浏览器会忽略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?

本文关键字:Ajax 调用 fetch 保存 cookie 浏览器 set-cookie 为什么      更新时间:2023-09-26

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

如果我通过在浏览器中放置URL来进行相同的GET调用,则浏览器会尊重(相同的)set-cookie响应头并保存cookie。

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

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

经过一番努力,我通过将请求的'credentials'属性设置为'include'来解决这个问题。在我的印象中,这只控制在获取请求时向服务器发送cookie,但显然,至少在我使用的实现中,如果不设置,它也意味着如果从服务器发送回来,cookie将不会被保存。

来自https://fetch.spec.whatwg.org/

的规范

请求具有关联的凭据模式,该模式为"省略"同源"或"包含"。除非另有说明,否则为"省略"。

请求的凭据模式控制凭据流取回。当请求的模式为"navigate"时,其凭据模式为假定为"包含";fetch目前没有考虑到other值。如果HTML在这里发生了变化,这个标准将需要相应的修改变化。

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