fetch 默认不发送 Cookie 出于安全考虑,必须显式设置 credentials: 'include' 并配合后端 Access-Control-Allow-Credentials: true 和具体 Access-Control-Allow-Origin 才能携带 Cookie。

在 JavaScript 中使用 fetch 发送请求时,若需让浏览器自动携带 Cookie(例如登录态),必须显式设置 credentials: 'include',否则跨域或同域请求默认都不会发送 Cookie。
为什么需要显式设置 credentials
出于安全考虑,fetch 默认行为是不发送 Cookie(等价于 credentials: 'omit')。即使请求是同域的,也必须主动声明才启用 Cookie 传输。常见误区是以为只要后端设置了 Access-Control-Allow-Credentials: true 就够了,其实前端也必须配对设置。
正确写法:include + 后端配合
基本用法如下:
- 前端请求中添加
credentials: 'include' - 确保后端响应头包含
Access-Control-Allow-Credentials: true - 注意:
Access-Control-Allow-Origin不能为*,必须指定具体源(如https://example.com)
示例:
立即学习“Java免费学习笔记(深入)”;
fetch('/api/user', {
method: 'GET',
credentials: 'include' // ✅ 关键
})
.then(res => res.json())
.then(data => console.log(data));
credentials 的三个可选值
- 'omit':默认值,完全不发送 Cookie(包括同域)
- 'same-origin':仅同域请求携带 Cookie,跨域不带(无需后端配置 CORS 凭据)
-
'include':始终携带 Cookie,无论同域还是跨域(要求后端开启
Access-Control-Allow-Credentials)
常见问题与排查
-
401 或未登录状态:检查是否漏写
credentials: 'include',或后端未返回Access-Control-Allow-Credentials: true -
CORS 报错 “The value of the 'Access-Control-Allow-Origin' header must not be the wildcard”:说明后端用了
*,需改为具体域名 -
本地开发跨域失效:确认前端地址(如
http://localhost:3000)和后端地址(如http://localhost:8080)是否被后端正确列入允许源


















