fetch 请求是否携带 cookie 由 credentials 参数显式控制,默认为 omit(不发 cookie)。same-origin 仅同源时发送,include 则始终发送且需服务端配合 cors 头。

Fetch 请求是否携带 Cookie,由 credentials 参数控制。它不是“自动决定”的,而是必须显式设置,否则默认不发 Cookie(即使同域)。
credentials 的三个可选值及其行为
omit(默认值):完全不发送 Cookie,也不接收服务端 Set-Cookie 响应头。
same-origin:仅当请求 URL 与当前页面同源(协议、域名、端口均相同)时,才带上 Cookie;跨域请求不带。
include:无论同域还是跨域,都带上 Cookie,并允许响应中携带 Set-Cookie(需服务端配合 Access-Control-Allow-Credentials: true)。
常见误操作与注意事项
- 没写
credentials就等于omit,即使同域也不会发 Cookie —— 这是新手最常踩的坑。 - 设为
include时,如果后端未在 CORS 响应头中明确返回Access-Control-Allow-Credentials: true,浏览器会直接拒绝响应(连 status 都拿不到)。 -
same-origin对于前端路由(如 Vue Router / React Router)无影响,判断依据是真实 URL,不是 router path。 - 若用
include跨域请求,后端Access-Control-Allow-Origin不能写*,必须指定具体源(如https://example.com),否则浏览器报错。
典型使用示例
登录后请求用户信息(同域):
fetch('/api/user', { credentials: 'same-origin' })
调用第三方 SSO 接口(跨域,且需保持登录态):
fetch('https://api.sso.example.com/token', {
credentials: 'include',
headers: { 'Content-Type': 'application/json' }
})
发一个完全匿名的统计上报(确保不泄露任何凭证):
fetch('/log/click', { credentials: 'omit' })
和服务端 Cookie 属性的配合要点
- 若 Cookie 设了
SameSite=Strict或SameSite=Lax,即使credentials: 'include',跨站请求也可能被浏览器拦截(尤其 POST 或重定向场景)。 - 需要跨域携带 Cookie,建议服务端将关键 Cookie 设为
SameSite=None; Secure(注意:必须搭配Secure,即只在 HTTPS 下生效)。 - 前端无法绕过浏览器对
SameSite的强制策略,只能和服务端协同配置。










