Cookie 技术详解与问题分析

目录 🔗︎


CookieStore API 🔗︎

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

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

  1. 会话 Cookie

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

    • 设置了 ExpiresMax-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=.aliexpress.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

当发布很酷的东西时,请第一时间通知我

订阅电子邮件,以获得我的最新文章。我不会向您发送垃圾邮件。随时取消订阅。