为什么SameSite=Strict没阻止跨域请求带Cookie?
我在前端调用其他域名的API时,明明设置了SameSite=Strict和Secure,但浏览器还是自动带上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头设置?
你用的是原生 fetch,并且明确写了
credentials: 'include',这其实是一个主动要求携带 Cookie 的场景。SameSite=Strict 的设计初衷是用来防御 CSRF 攻击,它主要针对的是用户通过点击链接或表单提交等被动触发的跨站请求,而不是像 fetch 这种开发者显式控制的 API 调用。性能上来说,fetch 请求默认不会受到 SameSite 的限制,只要目标服务器允许跨域并且前端主动要求带上凭证(比如 Cookie),浏览器就会照做。所以这不是 SameSite 的问题,而是你误解了它的作用范围。
解决办法很简单:如果你真的想完全禁止跨域请求带 Cookie,后端需要调整 CORS 策略。具体来说,在 PHP 中,你可以这样设置响应头:
然后确保前端的 fetch 请求中
credentials: 'include'只在必要时使用。如果完全不想让跨域请求带 Cookie,直接去掉credentials: 'include'就行了。另外吐槽一句,SameSite 的行为确实容易让人混淆,尤其是文档里没仔细说明 fetch 的特殊情况。记得测试时多看看网络请求的实际行为,别光靠直觉判断。