SameSite=Lax 是服务端通过 Set-Cookie 响应头设置的安全策略,JavaScript 无法直接设置或修改;其仅在顶级导航的 GET 请求(如点击链接、GET 表单提交、地址栏输入)中自动发送 Cookie,AJAX/fetch 等子资源请求不携带。

在 JavaScript 中无法直接设置 Cookie 的 SameSite=Lax 策略——这是服务端通过 Set-Cookie 响应头控制的,JavaScript 只能读写已存在的 Cookie(且受 SameSite 限制),不能修改其安全属性。
SameSite=Lax 是服务端设置的响应头属性
SameSite=Lax 是浏览器强制执行的 Cookie 安全策略,必须由后端在设置 Cookie 时明确声明。例如:
- Node.js(Express):
res.cookie('session_id', 'abc123', { sameSite: 'Lax', httpOnly: true, secure: true }); - PHP:
setcookie('user_token', 'xyz', ['samesite' => 'Lax', 'secure' => true, 'httponly' => true]); - Nginx 或反向代理中也可通过
add_header Set-Cookie注入(需谨慎)
Lax 策略下哪些 GET 请求能携带 Cookie
启用 SameSite=Lax 后,Cookie 仅在以下顶级导航的 GET 请求中被自动发送:
- 用户点击链接(
<a href="https://example.com/">) - 表单提交方法为
GET(<form method="GET">) - 地址栏直接输入 URL 并回车
- 不包括:AJAX/fetch/XHR、图片/iframe/script 加载、POST 表单提交、重定向链中的后续请求
前端 JavaScript 能做什么(有限但实用)
虽然不能设 SameSite,但可配合 Lax 策略做合理处理:
立即学习“Java免费学习笔记(深入)”;
- 用
document.cookie读取已存在且未被屏蔽的 Cookie(注意:Lax 下跨站子资源请求读不到) - 发起跨域 GET 导航时,无需额外操作——只要 Cookie 是 Lax 且目标是顶级导航,浏览器会自动带上
- 避免用
fetch模拟导航;如需带认证,改用window.location.href = url触发真实导航 - 检查是否登录可用
document.cookie.includes('auth='),但不能依赖它判断跨站请求是否成功(因 Lax 不生效于 fetch)
常见误区提醒
不要尝试这些无效做法:
-
document.cookie = "a=b; SameSite=Lax"—— 浏览器忽略该属性,且可能被静默丢弃 - 前端 JS 修改已有 Cookie 的 SameSite 属性 —— 不可能,属性只读且不可变更
- 认为
fetch(url, { credentials: 'include' })在跨站时能拿到 Lax Cookie —— 实际不会发送,除非是顶级 GET 导航


















