返回文章

Cookie 技术详解与问题分析

目录


CookieStore API

  • 描述:Chrome 提供了新的 cookieStore API,用于更方便地管理和操作 Cookie。
  • 特点:
    • 提供异步接口,避免阻塞主线程。
    • 支持对特定 Cookie 的增删改查。

  • 问题描述:Safari 对第三方 Cookie 的支持存在一些奇怪的行为,需要进一步调研。
  • 可能原因:
    • Safari 的隐私保护策略(如 ITP)限制了第三方 Cookie 的使用。
    • 某些场景下,Safari 可能会直接丢弃或阻止第三方 Cookie。

  1. 会话 Cookie:

    • 不设置 Expires 或 Max-Age。
    • 关闭浏览器后会被删除,但关闭 Tab 不会影响。
  2. 持久 Cookie:

    • 设置了 Expires 或 Max-Age。
    • 即使关闭浏览器,Cookie 仍然有效。
  3. HttpOnly Cookie:

    • 无法通过 JavaScript 访问或修改。
    • 由服务端设置,主要用于防止 CSRF 攻击。

  • 定义:当 A 网站访问 B 域名时,B 域名在响应中设置的 Cookie 被称为第三方 Cookie。
  • 用途:
    • 用户行为跟踪(如广告脚本)。
    • 实现跨域免登录功能。
  • 限制:
    • 欧盟 GDPR 条例正在限制第三方 Cookie 的使用。

Google CHIPS 方案

自己的请求只能往自己的域名设置cookie(浏览器无法通过document.cookie往其他三方域名写cookie), 现在往三方cookie设置值需要用户允许,这样可以再A站点通过B站点请求往B站点设置cookie,具体设置的是一个id建立了A站点信息和B站点的关系。从而能实现访问b站点时带上这个id,知道这个用户访问过A站点的什么信息。 这样A站点到B站点投广告,会更加精准,因为B站点知道用户关注过什么内容。 通过三方脚本注入实现了自信息闭环,包括谷歌、facebook的广告机制都是如此。

简单说: 如果A站点嵌入了三方脚本,这个三方脚本可以获取到当前站点的所有信息包括cookie(非http only),然后往自己的域名里写相同的cookie,这样方访问三方站点时,cookie会自动带到服务端,也就是可以拿到A站点访问过的信息,包括设备、浏览历史等等

  • 描述:Google 提出的 CHIPS(Cookies Having Independent Partitioned State)方案,用于解决第三方 Cookie 的隐私问题。
  • 实现方式:
    • 使用 Partitioned 属性将 Cookie 分区。
    • 内嵌网站在 A 网站设置的 Cookie 只能在 A 网站中使用。
  • 示例:
    Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;
    

浏览器默认行为与权限

  • 默认行为:浏览器通常禁用通过 JavaScript 修改 Cookie 的权限。
  • 解决方案:需要手动修改浏览器权限以允许修改 Cookie。

  • 作用:控制跨站请求是否携带 Cookie,防止 CSRF 攻击。
  • 取值:
    • Strict:仅同站请求携带 Cookie。
    • Lax:允许部分跨站请求(如导航到目标站点)携带 Cookie。
    • None:允许跨站请求携带 Cookie,但必须与 Secure 属性一起使用。
  • 示例:
    Set-Cookie: key=value; SameSite=Strict;
    Set-Cookie: key=value; SameSite=Lax;
    Set-Cookie: key=value; SameSite=None; Secure;
    

跨站请求与 CSRF 防护

  • 特点:
    • 跨站请求一般不会带上自定义请求头。
    • 通过限制 GET 请求更新状态,可以降低 CSRF 攻击的风险。
  • 建议:
    • 避免使用 GET 请求更新状态。
    • 使用 POST 请求处理敏感操作。

  • 问题描述:
    • 如果两个域名下有相同名称的 Cookie,例如:
      _lang=zh_CN; Domain=.a.com
      _lang=en_US; Domain=b.a.com
      
    • document.cookie 返回的结果可能是 _lang=zh_CN; _lang=en_US,顺序取决于 Cookie 的设置顺序。
  • 解决方案:
    • 通过服务端明确区分 Cookie 的作用域。
    • 客户端读取时需注意解析逻辑。

  • 示例:
    document.cookie = "e_id=pt1; Domain=.a.com; Expires=Tue, 13-Mar-2091 12:03:24 GMT; Path=/; Secure; SameSite=None";
    
  • 注意事项:
    • Domain 必须与当前页面的域名一致才能设置成功。
    • SameSite=None 允许跨站点请求发送和接收 Cookie,但需评估 CSRF 风险。
    • Secure 要求必须是 HTTPS 请求。

  • 场景描述:
    • A 站点内嵌 B 站点,并通过 URL 参数传递语言信息。
    • B 站点根据传递的语言参数切换 Cookie 并刷新 iframe。
  • 问题:
    • 如果语言 Cookie 未正确传递,B 站点会在响应头中设置新的 Cookie。
  • 解决方案:
    • 确保语言 Cookie 在请求中正确传递,避免服务端重复设置。

  • Path 属性:
    • 按照具体到不具体的顺序返回。
    • 示例:
      Set-Cookie: name=value; Path=/user;
      Set-Cookie: name=value; Path=/;
      
  • 过期时间:
    • 根据客户端的时间判断。
    • 如果客户端时间被篡改,可能导致 Cookie 过期时间异常。

alt text

References