SameSite=None必须同时设置Secure=true且走HTTPS,否则Chrome 80+等现代浏览器静默丢弃Cookie;本地开发需用https://127.0.0.1或降级Lax,前端fetch须设credentials: 'include'。

Chrome 80+ 报 Cookie “xxx” has been rejected because it is in a cross-site context and its “SameSite” value is “None”
这是现代浏览器(尤其是 Chrome 80 起)对未显式声明 SameSite 属性的 Cookie 的强制拦截。不是你的后端漏写了,而是浏览器默认把不带 SameSite 的 Cookie 当作 SameSite=Lax 处理;而当你在 iframe、表单提交、fetch 跨域请求中用到 Secure + SameSite=None 场景时,必须**同时满足两个条件**:SameSite=None 且 Secure=true,否则直接拒绝。
常见踩坑点:
-
SameSite=None却没配Secure→ 浏览器静默丢弃(无警告)或报上述错误 - 后端设了
SameSite=None,但响应走 HTTP(非 HTTPS)→Secure不生效,等同于没设 - 前端 JS 用
document.cookie设置 Cookie → 无法指定SameSite,该方式已废弃,必须由后端 Set-Cookie 响应头下发
Node.js/Express 中正确设置 SameSite=None 的 Set-Cookie 响应头
Express 默认的 res.cookie() 在较新版本(4.17+)已支持 sameSite: 'none',但必须手动加 secure: true,且确保部署在 HTTPS 环境下。
示例代码:
立即学习“前端免费学习笔记(深入)”;
res.cookie('session_id', 'abc123', {
httpOnly: true,
secure: true,
sameSite: 'none', // 必须字符串小写,不能是 'None' 或 true
maxAge: 24 * 60 * 60 * 1000
});注意:
-
sameSite: 'none'是唯一合法值(大小写敏感),sameSite: None(JS 布尔值)或sameSite: 'None'(首字母大写)都会被忽略 -
secure: true在开发环境(localhost)下可临时绕过,但仅限localhost—— Chrome 对此有白名单,其他域名哪怕加了secure也必须走 HTTPS - 若用 Nginx 反向代理,需确认它没有 strip 掉
Set-Cookie头中的SameSite=None; Secure字段(某些旧版配置会过滤未知属性)
前端 fetch 跨站请求携带 Cookie 的必要条件
即使后端 Cookie 已正确设为 SameSite=None; Secure,前端 fetch() 仍不会自动带上 Cookie,除非显式开启凭据模式。
必须这样写:
fetch('https://api.example.com/login', {
method: 'POST',
credentials: 'include', // 关键:不能是 'same-origin' 或省略
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user: 'a' })
});容易遗漏的细节:
-
credentials: 'include'是硬性要求,'omit'或'same-origin'都会导致 Cookie 不发送 - 目标域名必须与当前页面协议、域名、端口完全一致(同源)或明确跨域(CORS 已预检通过),否则浏览器直接拦截请求
- 服务端响应头必须包含
Access-Control-Allow-Origin: https://your-frontend.com(不能是*),且需带Access-Control-Allow-Credentials: true
如何验证 SameSite 是否生效?
打开 Chrome DevTools → Application → Cookies,看对应条目右侧的 SameSite 列值是否为 None;更可靠的方式是查 Network 面板中响应头:
找到 Set-Cookie 响应头,内容应类似:
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure; SameSite=None
如果看到 SameSite=Lax 或压根没这个字段,说明后端没生效;如果看到 SameSite=None 但没 Secure,或当前是 HTTP 页面,则该 Cookie 实际不会被发送。
特别注意:iOS Safari 12.1+ 和部分安卓 WebView 对 SameSite=None 支持不完整,若需兼容老环境,得结合 User-Agent 做降级(比如对 Safari ≤12 返回 SameSite=Lax)。


















