关于Cookie里的SameSite

Authors
  • avatar
    Name
    小明&小艺
    Twitter

在确保用户隐私的同时安全地浏览网络是我们的首要任务。在使用 Cookie 时,重要的是要确保它们安全并按预期目的服务,而不损害用户隐私。

一个需要考虑的关键属性是 SameSite,它规定了跨站点请求中 Cookie 的发送方式。

什么是 Cookie?

Cookie 是网站请求浏览器保存在用户设备上的小数据片段。它们帮助网站记住有关用户的信息,比如他们的偏好或购物车中的内容。

然而,随着对不想要的数据共享和潜在安全风险的担忧日益增加,有必要控制这些 Cookie 何时何地被使用。这就是 SameSite 属性发挥作用的地方,允许开发者根据请求来源指定何时发送 Cookie。这个属性可以设置为 Strict(严格)、Lax(宽松)或 None(无限制),以适应不同的需求。

app.use(function (req, res, next) {
  res.cookie('name', 'value', { sameSite: 'strict' })
  next()
})

Strict(严格)

当 Cookie 的 SameSite 属性设置为 Strict 时,意味着只有在请求来自同一站点时,Cookie 才会被发送。

image_56.png

使用场景:

  • 非常适合高安全应用,如在线银行业务。
  • 防止任何跨站点使用,确保数据保密性达到高水平。

Lax(宽松)

Lax 设置在可用性和安全性之间取得了平衡。使用此设置时,Cookie:

  • 不会在跨站点子资源请求中发送,例如图片、样式表和脚本。
  • 会在顶级导航中发送,比如当用户点击链接进入站点时。

image_34.png

使用场景:

  • 适用于在其他网站上嵌入的内容,其中一定程度的跨站点交互是可以接受的。
  • 通过在用户从外部链接到达时保持会话,增强浏览体验。

如果未设置 SameSite 属性,浏览器将把 Cookie 视为设置为 Lax。

None(无限制)

为了让 Cookie 随每个请求一起发送,包括跨站点请求,SameSite 属性应该设置为 None。

然而,当使用 SameSite=None 时,Cookie 还必须标记为 Secure(安全),这意味着它只能通过 HTTPS 传输。如果您尝试在 HTTPS 站点上设置 SameSite=None 而没有 Secure 属性的 Cookie,浏览器可能会在控制台显示警告,Cookie 将无法按预期工作!

使用场景:

  • 通常由广告平台使用的跨站点跟踪。
  • 需要在多个域之间进行身份验证的单点登录系统。
  • 旨在直接供外部网站使用的功能性。

选择哪种配置取决于您的具体用例。

  • 想要顶级安全?选择 Strict。这保证了 Cookie 仅在发送到其原始站点,最小化了 CSRF 攻击或意外泄露的风险。
  • 想要用户友好性和安全性的混合?选择 Lax。这确保了更流畅的用户体验,同时仍然提供对潜在威胁的保护。
  • 需要跨站点共享 Cookie 数据?选择 None。只要记得也要将其设置为 Secure。

结论

SameSite 属性为 Web 开发者提供了对 Cookie 的细粒度控制,增强了网络安全并确保了更好的用户体验。通过理解 Strict、Lax 和 None 的细微差别,您可以做出更明智的决策,既让用户满意又安全。