为什么SameSite=Strict没阻止跨域请求带Cookie?

夏侯晓莉 阅读 15

我在前端调用其他域名的API时,明明设置了SameSite=StrictSecure,但浏览器还是自动带上Cookie了。后端用PHP设置的响应头是这样的:


header("Set-Cookie: auth_token=xxx; SameSite=Strict; Secure");

前端请求用的是原生fetch:


fetch('https://api.otherdomain.com/data', {
  method: 'GET',
  credentials: 'include'
})

跨域请求还是能带上Cookie,后端日志显示cookie值正常解析。难道SameSite=Strict不是应该阻止跨站请求携带吗?是不是还需要配合CORS头设置?

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
爱学习的子钊
SameSite=Strict 的行为确实会阻止跨站请求携带 Cookie,但你的问题出在对「跨站」的定义上。SameSite 的限制是基于浏览器的导航上下文,而不是单纯看域名是否不同。

你用的是原生 fetch,并且明确写了 credentials: 'include',这其实是一个主动要求携带 Cookie 的场景。SameSite=Strict 的设计初衷是用来防御 CSRF 攻击,它主要针对的是用户通过点击链接或表单提交等被动触发的跨站请求,而不是像 fetch 这种开发者显式控制的 API 调用。

性能上来说,fetch 请求默认不会受到 SameSite 的限制,只要目标服务器允许跨域并且前端主动要求带上凭证(比如 Cookie),浏览器就会照做。所以这不是 SameSite 的问题,而是你误解了它的作用范围。

解决办法很简单:如果你真的想完全禁止跨域请求带 Cookie,后端需要调整 CORS 策略。具体来说,在 PHP 中,你可以这样设置响应头:

header("Access-Control-Allow-Origin: https://your-frontend-domain.com");
header("Access-Control-Allow-Credentials: true");


然后确保前端的 fetch 请求中 credentials: 'include' 只在必要时使用。如果完全不想让跨域请求带 Cookie,直接去掉 credentials: 'include' 就行了。

另外吐槽一句,SameSite 的行为确实容易让人混淆,尤其是文档里没仔细说明 fetch 的特殊情况。记得测试时多看看网络请求的实际行为,别光靠直觉判断。
点赞 1
2026-02-18 12:08