在前后端分离架构中,防止 CSRF 攻击最稳妥的方案是后端在设置 Cookie 时明确指定 SameSite 属性。同域部署优先用 Lax,跨域接口调用必须用 None 且强制开启 HTTPS。
核心结论:SameSite 是防御 CSRF 的有效手段,但配置错误会导致登录失效或接口无法调用,需根据域名关系选择值。
- 先判断:确认前端与后端接口是否跨域,跨域必须用 None,同域建议 Lax。
- 优先做:后端代码中修改 Set-Cookie 逻辑,显式声明 SameSite 和 Secure 属性。
- 再验证:通过浏览器开发者工具检查响应头,确认 Cookie 是否按预期发送。
后端配置方案
配置 SameSite 主要依赖后端框架的 Cookie 设置选项。前后端分离通常涉及跨域,默认建议使用 None + Secure 组合。
Node.js (Express):
res.cookie('session', token, { sameSite: 'none', secure: true }); // 跨域场景必须用 none 且开启 secureSpring Boot:
server.servlet.session.cookie.same-site=none
server.servlet.session.cookie.secure=true注意:设置 SameSite=None 时,必须同时设置 Secure=true,否则现代浏览器会拒绝接收该 Cookie。
前端请求设置
若跨域且使用 Cookie 认证,前端 fetch 或 axios 需开启 credentials 选项,否则浏览器不会发送 Cookie。
axios.post('/api/login', data, {
withCredentials: true
});Nginx 代理层修改
若后端代码无法修改,可在 Nginx 使用 proxy_cookie_path 配合 add_header 修改,但需注意正则匹配。
location / {
proxy_pass http://backend;
proxy_cookie_path / "/; SameSite=None; Secure";
}此方案较复杂,需确保后端原始 Cookie 路径匹配,建议优先改代码。
验证与常见问题
1. 验证生效:打开浏览器开发者工具(F12)-> Network -> 点击请求 -> Response Headers。确认 Set-Cookie 包含 SameSite=None; Secure。
2. HTTPS 强制:本地开发若未配 HTTPS,SameSite=None 会失效。建议使用 localhost 或配置本地 SSL。
3. 旧版本兼容:Safari 12 之前等旧浏览器可能不支持 None 值,需通过 User-Agent 嗅探做兼容处理。
4. 登录失效排查:若修改后用户无法登录,检查是否因 Secure 导致 HTTP 环境下 Cookie 被拦截,或前端未传 credentials。