SameSite是浏览器针对Cookie的一种安全属性,主要用于防御CSRF攻击和控制跨站Cookie的发送行为,它的核心是告诉浏览器:在什么情况下允许跨站点请求携带当前Cookie
1.SameSite 的三种模式
(1)SameSite=Strict(严格模式)
-
行为 :
Cookie 仅限同站请求 (即完全一致的域名)携带,任何跨站请求均不发送。
-
适用场景 :
高敏感操作(如银行转账、修改密码),确保请求绝对来自本站。
-
示例:
http
iniSet-Cookie: sessionId=abc123; SameSite=Strict; Secure
- 用户从
https://social.com
点击链接到https://bank.com
,浏览器 不会携带bank.com
的 Cookie。
- 用户从
(2)SameSite=Lax(宽松模式,默认值)
- 行为 :
- 允许安全的跨站GET请求(如导航跳转,预加载)携带cookie
- 阻止跨站POST请求,ifram嵌入等非安全请求携带Cookie
- 适用场景 :
大多数网站:平衡安全性和用户体验 - 示例: Set-Cookie: sessionId=abc123; SameSite=Lax; Secure
markdown
- 用户从 `https://news.com` 点击链接到 `https://shop.com`,浏览器 **会携带 Cookie**。
markdown
- 但如果是 `news.com` 向 `shop.com` 发起 AJAX POST 请求,**不会携带 Cookie**。
(3)SameSite=None(禁用限制)
-
行为 :
Cookie 允许所有跨站请求携带 ,但必须同时设置
Secure
(仅限 HTTPS)。 -
适用场景 :
需要跨站共享 Cookie 的第三方服务(如嵌入的支付按钮、跨站单点登录)。
-
示例:
http
iniSet-Cookie: widget_session=xyz; SameSite=None; Secure
- 用户访问
https://site-a.com
时,内嵌的https://site-b.com
的 iframe 可以携带 Cookie。
- 用户访问
2. SameSite 如何防御 CSRF 攻击?
CSRF 攻击原理
攻击者诱导用户在已登录的网站(如 bank.com
)发起恶意请求(如转账):
html
xml
<!-- 恶意网站 evil.com 的代码 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="1000">
</form>
<script>document.forms[0].submit();</script>
如果用户已登录 bank.com
,浏览器会自动携带 Cookie,请求成功。
SameSite 的防护
-
若
bank.com
的 Cookie 设置为SameSite=Lax
或Strict
:- 跨站 POST 请求 不会携带 Cookie,攻击失效。
-
但
SameSite=None
的 Cookie 仍需配合 CSRF Token 防护。