You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SameSite=Strict Cookie跨站请求下两种重定向的行为差异问询

跨站请求中SameSite=Strict Cookie在不同重定向方式下的行为差异原因

核心原因在于浏览器对请求发起上下文的判断逻辑不同,这直接决定了SameSite=Strict Cookie是否会被携带。

先明确SameSite=Strict的核心规则:只有当请求是从目标站点的同源上下文发起时(比如用户在site-a的页面内操作、site-a页面内的JS发起请求),浏览器才会携带该Cookie;如果请求来自跨站上下文(比如其他站点的链接跳转、其他站点的JS发起请求),则不会携带。

针对你的测试场景逐一拆解:

步骤4:HTTP重定向的情况

  • 点击site-b上指向/c的链接,第一个请求GET /c是跨站上下文发起(触发源是site-b的页面),因此不会携带SameSite=Strict Cookie。
  • 服务器返回的HTTP重定向(3xx状态码)属于请求链的延续,浏览器会将重定向后的GET /b请求的上下文直接继承自原请求——也就是仍然属于跨站发起的请求,所以同样不会携带Cookie。

步骤5:Javascript重定向的情况

  • 点击site-b上指向/d的链接,第一个请求GET /d同样是跨站上下文发起,不带Cookie。
  • 但/d返回的是site-a的同源HTML页面,当页面加载后执行location.href='/b'时,这个跳转请求是在site-a的同源上下文里发起的(此时浏览器的页面上下文已经切换为site-a),完全符合SameSite=Strict的携带规则,因此会带上之前设置的Cookie。

你的测试用Express代码可整理为:

app.get("/a", function(req, res) {
  res.cookie("a", "b", {sameSite: "strict", secure: true, httpOnly: true});
  res.end();
})
.get("/b", function(req, res) {
  res.end(req.get("Cookie"));
})
.get("/c", function(req, res) {
  res.redirect("/b");
})
.get("/d", function(req, res) {
  res.send(`<!DOCTYPE html><html><body onload="location.href='/b'"></body></html>`);
});

内容的提问来源于stack exchange,提问作者Heiko Theißen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:25:43