SameSite 是什么
SameSite 是 Cookie 的一个属性,用来控制浏览器在跨站请求中是否携带该 Cookie。它把『是否发送』的判定从服务端挪到了浏览器端,因此能明显收窄 CSRF 面,但不改变服务端仍需校验请求来源与令牌的事实。现代浏览器已把未声明该属性的 Cookie 按 Lax 处理,站点行为会随浏览器策略变化,需要显式声明而不是依赖默认值。
基本信息
| 属性取值 | Strict / Lax / None |
|---|---|
| 浏览器默认 | Chrome 等已将未声明值按 Lax 处理 |
| None 前提 | 必须同时带 Secure,否则 Cookie 被浏览器拒绝 |
| 作用范围 | 仅影响浏览器发送行为,服务端校验仍不可省略 |
取值与行为
| 取值 | 跨站发送行为 | 适用场景 |
|---|---|---|
| Strict | 跨站请求一律不发送 | 高敏感管理后台 |
| Lax | 顶层导航 GET 发送,其余不发送 | 通用站点默认值 |
| None | 总是发送,必须配 Secure | iframe 嵌入、跨站单点登录回调 |
| 未声明 | 按浏览器默认(趋同 Lax) | 不推荐:行为随浏览器版本漂移 |
典型使用场景
- 自建管理后台的会话 Cookie 用 Strict,避免从外部链接直接带会话进入
- 电商类站点用 Lax:既防跨站表单提交,又保证从邮件与搜索进入时保持登录态
- 需要嵌入第三方站点的登录组件用 None + Secure,并单独评估第三方可信度
- 排查『用户点邮件链接后需要重新登录』问题时,先看是否被 Strict 拦掉了跨站导航
- 做安全整改基线时把 SameSite 与 HttpOnly、Secure 一起核查,避免属性互相打架
下发示例
下发示例
# 通用站点:默认用 Lax
Set-Cookie: session=abc; Path=/; Secure; HttpOnly; SameSite=Lax
# 高敏感后台:收紧到 Strict
Set-Cookie: admin_session=xyz; Path=/admin; Secure; HttpOnly; SameSite=Strict
# 需要跨站携带(谨慎评估后使用)
Set-Cookie: sso_state=def; Path=/; Secure; SameSite=None
# 核查线上实际下发:
# curl -sI https://example.com/login | grep -i set-cookie把后台从 Lax 改为 Strict 能进一步收窄跨站面,但必须回归『从邮件、工单、IM 外链进入』的流程,否则会出现登录态丢失的投诉。
SameSite=None 缺少 Secure 属性时浏览器会直接丢弃该 Cookie,表现为登录随机失效,排查时优先核对这两个属性是否成对出现。