不使用第三方包设置Cookie后其他请求头未携带Cookie问题咨询
问题根因
- 第一个Cookie
setFromServer=1未指定path属性,浏览器默认会将该Cookie的作用域限定为当前接口路径/set-cookies的同级及子路径,只有路径匹配的请求才会携带该Cookie - 跨域场景下前端请求未开启携带凭证配置,即使服务端开启了
Access-Control-Allow-Credentials,浏览器也不会自动在后续请求中携带服务端下发的Cookie - 仅在
/set-cookies接口内配置CORS头,未适配OPTIONS预检请求:跨域POST请求前浏览器会先发送OPTIONS预检请求,若预检请求未返回合规的CORS头,后续正式请求的Cookie携带逻辑会被浏览器拦截 - 未适配浏览器默认的
SameSiteCookie策略,跨站场景下Cookie会被浏览器默认拦截
修复步骤
- 补全Cookie的公共属性,将两个Cookie的配置修改为:
["setFromServer=1;Max-Age=3600; path=/;", "jscantsee=1; Max-Age=3600; path=/; httponly;"]
如果是跨站部署,还需要额外增加SameSite=None; Secure属性,且确保服务使用HTTPS协议:
["setFromServer=1;Max-Age=3600; path=/; SameSite=None; Secure;", "jscantsee=1; Max-Age=3600; path=/; httponly; SameSite=None; Secure;"]
- 前端请求开启携带凭证配置:
- 使用XMLHttpRequest:添加配置
xhr.withCredentials = true - 使用fetch:请求参数添加
credentials: 'include' - 使用axios:全局配置
axios.defaults.withCredentials = true,或单次请求添加withCredentials: true参数
- 将CORS配置提取到全局中间件,不要仅在
/set-cookies接口内配置,确保OPTIONS预检请求也能返回正确的CORS响应头,避免预检不通过导致Cookie被拦截。
注意:你设置的
httponly属性的Cookie本身就无法通过前端JS读取,属于正常安全策略,只要浏览器在发送请求时自动携带该Cookie即为配置生效。
内容的提问来源于stack exchange,提问作者lezabiey
相关产品推荐
相关产品推荐

