认识 Cookie 的 Secure 和 SameSite 属性及其在 Koa 框架中的应用

497 阅读4分钟

在现代 Web 开发中,Cookie 是维持用户登录状态、保存用户偏好等重要机制。然而,Cookie 也是攻击者利用的重点对象之一,尤其是在跨站请求伪造(CSRF)攻击中,攻击者借助用户浏览器携带的 Cookie 发起恶意请求,给用户和网站带来严重风险。为此,浏览器引入了两个关键属性:SecureSameSite,帮助开发者提升 Cookie 的安全性。

本文将详细介绍这两个属性的含义、作用,以及如何在 Koa 框架中正确设置,防止 Cookie 被第三方请求伪造。


什么是 Secure 和 SameSite?

Secure 属性

Secure 属性表示该 Cookie 仅允许通过 HTTPS 加密连接传输。这意味着,如果用户通过 HTTP(非加密)访问网站,浏览器不会发送带有 Secure 标记的 Cookie。这样能有效防止 Cookie 在网络传输过程中被窃听或篡改,避免中间人攻击(MITM)带来的安全风险。

举例来说,开启 Secure 的 Cookie 只有在用户通过 HTTPS 访问网站时,浏览器才会携带发送,保证信息传输安全。

SameSite 属性

SameSite 属性用来限制 Cookie 在跨站请求时的发送规则,防止第三方网站借助用户身份发起伪造请求。该属性有三个主要取值:

  • Strict:严格模式,只允许同站请求携带 Cookie。任何跨站请求都不会携带 Cookie,安全性最高,但可能影响用户体验,例如从其他网站点击链接跳转时无法保持登录状态。
  • Lax(默认):在大多数跨站请求中不发送 Cookie,但允许部分“安全”跨站请求(如从外部网站点击链接跳转)携带 Cookie,兼顾安全与用户体验。
  • None:允许所有跨站请求携带 Cookie,但必须搭配 Secure 属性使用,否则浏览器会忽略该设置。

通过合理配置 SameSite,可以大幅度减少 CSRF 攻击的风险。


为什么需要设置 Secure 和 SameSite?

不设置或错误设置这两个属性,Cookie 可能被攻击者轻松利用:

  • 防止 CSRF 攻击
    攻击者利用用户登录状态下浏览器自动携带的 Cookie,在第三方网站发起恶意请求。SameSite 通过限制跨站请求时是否携带 Cookie,有效阻止此类攻击。
  • 防止 Cookie 被窃取
    Secure 属性保证 Cookie 只在 HTTPS 连接中传输,避免 Cookie 在明文 HTTP 传输过程中被窃听或篡改。

如何在 Koa 中设置 Secure 和 SameSite?

Koa 是基于 Node.js 的现代 Web 框架,设置 Cookie 通常在服务器响应中完成。Koa 自带的 ctx.cookies.set() 方法支持传入多种 Cookie 选项,包括 Secure 和 SameSite。

下面是一个示例,展示如何在 Koa 中设置带 Secure 和 SameSite 的 Cookie:

js
复制编辑
const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
  // 设置一个安全的 Cookie
  ctx.cookies.set('token', 'your-token-value', {
    httpOnly: true,                        // 只能通过 HTTP 请求访问,防止客户端 JS 读取
    secure: process.env.NODE_ENV === 'production', // 生产环境启用 HTTPS 时设置为 true
    sameSite: 'strict',                    // 严格限制跨站请求发送 Cookie
    maxAge: 7 * 24 * 60 * 60 * 1000       // 7 天过期时间,单位毫秒
  });

  ctx.body = 'Cookie 设置成功';
});

app.listen(3000, () => {
  console.log('Koa 服务器启动,监听端口 3000');
});

代码解析:

  • httpOnly: true:禁止客户端 JavaScript 访问 Cookie,防止 XSS 攻击窃取。
  • secure: true:仅在 HTTPS 连接下传输 Cookie。通常生产环境开启,开发环境可关闭(HTTP)。
  • sameSite: 'strict':严格限制 Cookie 仅在同站请求时发送。
  • maxAge:Cookie 有效期,单位为毫秒。

总结

  • Secure 属性保证 Cookie 只通过 HTTPS 安全连接传输,防止中间人窃听。
  • SameSite 属性控制 Cookie 跨站请求时是否发送,有效防止 CSRF 攻击。
  • 在 Koa 等 Node.js 框架中,通过 ctx.cookies.set() 可以方便地设置这两个属性。
  • 推荐在生产环境下开启 Secure,并根据业务需求选择合适的 SameSite 策略(Strict 或 Lax)。

合理使用 Secure 和 SameSite,是保护用户信息和防止安全攻击的重要措施。希望这篇文章能帮助你理解这两个属性的安全价值,并掌握在 Koa 中的正确使用方法。