防止 CSRF 攻击如何在前后端分离架构中配置 SameSite?

文章导读
在前后端分离架构中,防止 CSRF 攻击最稳妥的方案是后端在设置 Cookie 时明确指定 SameSite 属性。同域部署优先用 Lax,跨域接口调用必须用 None 且强制开启 HTTPS。
📋 目录
  1. A 后端配置方案
  2. B 前端请求设置
  3. C Nginx 代理层修改
  4. D 验证与常见问题
A A

在前后端分离架构中,防止 CSRF 攻击最稳妥的方案是后端在设置 Cookie 时明确指定 SameSite 属性。同域部署优先用 Lax,跨域接口调用必须用 None 且强制开启 HTTPS。

核心结论:SameSite 是防御 CSRF 的有效手段,但配置错误会导致登录失效或接口无法调用,需根据域名关系选择值。

  • 先判断:确认前端与后端接口是否跨域,跨域必须用 None,同域建议 Lax。
  • 优先做:后端代码中修改 Set-Cookie 逻辑,显式声明 SameSite 和 Secure 属性。
  • 再验证:通过浏览器开发者工具检查响应头,确认 Cookie 是否按预期发送。

后端配置方案

配置 SameSite 主要依赖后端框架的 Cookie 设置选项。前后端分离通常涉及跨域,默认建议使用 None + Secure 组合。

Node.js (Express):

防止 CSRF 攻击如何在前后端分离架构中配置 SameSite?
res.cookie('session', token, { sameSite: 'none', secure: true }); // 跨域场景必须用 none 且开启 secure

Spring Boot:

server.servlet.session.cookie.same-site=none
server.servlet.session.cookie.secure=true

注意:设置 SameSite=None 时,必须同时设置 Secure=true,否则现代浏览器会拒绝接收该 Cookie。

前端请求设置

若跨域且使用 Cookie 认证,前端 fetch 或 axios 需开启 credentials 选项,否则浏览器不会发送 Cookie。

防止 CSRF 攻击如何在前后端分离架构中配置 SameSite?
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。

防止 CSRF 攻击如何在前后端分离架构中配置 SameSite?

2. HTTPS 强制:本地开发若未配 HTTPS,SameSite=None 会失效。建议使用 localhost 或配置本地 SSL。

3. 旧版本兼容:Safari 12 之前等旧浏览器可能不支持 None 值,需通过 User-Agent 嗅探做兼容处理。

4. 登录失效排查:若修改后用户无法登录,检查是否因 Secure 导致 HTTP 环境下 Cookie 被拦截,或前端未传 credentials。