--- tags: [Cookie, CSRF, SameSite, web-security, CORS] create time: 2026-05-22 10:00 --- # SameSite 与 CSRF 防护 ## 概述 `SameSite` 是 Cookie 的一个安全属性,用来控制浏览器在**跨站请求**中是否发送 Cookie。它是防御 CSRF(Cross-Site Request Forgery,跨站请求伪造)攻击最直接的手段——不需要额外的 Token,不需要检查 Origin 头,只需要一个 Cookie 属性就能从浏览器层面阻断攻击。 > [!question] 什么是 CSRF? > 想象你登录了银行网站 `bank.com`,浏览器里存着银行的认证 Cookie。此时你打开了一个恶意网站 `evil.com`,该页面偷偷向 `bank.com/api/transfer` 发了一个 POST 请求——由于浏览器会自动带上 `bank.com` 的 Cookie,银行服务器以为是你本人操作,转账就成功了。 > > **你什么都没点,钱就没了。** 这就是 CSRF。 ## SameSite 三个值 ### 一图总览 ```mermaid flowchart LR subgraph Origin["当前页面 origin.com"] A["发起请求"] end A --> B{"SameSite 设置?"} B -->|"Strict"| C["跨站请求不发送 Cookie"] B -->|"Lax"| D["顶级导航 GET 发送,其他不发送"] B -->|"None"| E["所有请求都发送(必须 Secure)"] style C fill:#c8e6c9 style D fill:#fff9c4 style E fill:#ffcdd2 ``` ### Strict — 最严格 ```http Set-Cookie: session_id=abc; SameSite=Strict; Secure; HttpOnly ``` **行为**:只有从本站发起的请求才会携带 Cookie。即使是用户点击外部链接跳转进来,第一次请求也不带 Cookie。 **优点**:CSRF 彻底无效。 **缺点**:用户体验差——从搜索引擎或书签点击链接进入网站时,用户会发现"明明之前登录了,怎么要重新登录?" > [!note] 适用场景 > 高敏感操作的保护,比如银行后台管理、密码修改页面。可以只在这些路由的 Cookie 上设 `Strict`。 ### Lax — 平衡之选(浏览器默认) ```http Set-Cookie: session_id=abc; SameSite=Lax; Secure; HttpOnly ``` **行为**: | 请求方式 | 同站请求 | 跨站请求 | |----------|----------|----------| | `` 链接跳转(GET) | ✅ 发送 | ✅ 发送 | | `
` 提交(POST) | ✅ 发送 | ❌ 不发送 | | `fetch` / `XMLHttpRequest` | ✅ 发送 | ❌ 不发送 | | `` / `