mcpField
G
gpc-cookie-integration

gpc-cookie-integration

github.com/mukul975安全32338 次安装32 周前更新
代码仓库

关于 gpc-cookie-integration

面向网站开发和隐私团队的 GPC 与 Cookie 同意集成指南,说明如何检测浏览器信号并更新 CMP 设置。内容涵盖法律适用范围、实现示例和验证方法。

主要功能

  1. 01检测 HTTP 与 JavaScript GPC 信号
  2. 02将 GPC 映射到 CMP 同意类别
  3. 03按司法辖区处理退出请求
  4. 04验证广告 Cookie 与标签拦截
  5. 05记录并处理同意状态冲突

适用场景

  1. 01为网站添加 GPC 信号检测
  2. 02配置 OneTrust 或 Cookiebot
  3. 03测试广告追踪是否被拦截

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/privacy-data-protection-skills --skill gpc-cookie-integration

安装后在 Claude Code 中输入/gpc-cookie-integration确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
template.md
references/
standards.md
workflows.md
scripts/
process.py

详细介绍

全局隐私控制与 Cookie 同意集成

概述

全局隐私控制(GPC)是一种浏览器级信号,用于向网站传达用户的隐私偏好。GPC 由 GPC 社区组制定,并根据加利福尼亚州的 CCPA/CPRA(自 2023 年 1 月 1 日起生效)、科罗拉多州的 CPA(自 2024 年 7 月 1 日起生效)、康涅狄格州的 CTDPA(自 2023 年 7 月 1 日起生效)及美国其他州的隐私法,被认定为具有法律约束力的退出机制。每次请求中,GPC 都会发送 Sec-GPC: 1 HTTP 标头和 navigator.globalPrivacyControl JavaScript 属性。网站必须检测此信号,并自动触发退出出售、共享和定向广告,无需用户采取其他操作。与 Cookie 同意管理平台(CMP)集成至关重要,可确保 GPC 信号正确阻止广告 Cookie 和数据共享。

GPC 信号规范

GPC 的工作方式

HTTP 标头:

Sec-GPC: 1

当用户在浏览器或浏览器扩展中启用 GPC 后,该标头会出现在每个 HTTP 请求中。

JavaScript API:

navigator.globalPrivacyControl  // Returns true if GPC is enabled

支持 GPC 的浏览器和扩展:

浏览器/扩展GPC 支持启用方式
Firefox内置(v120+)设置 > 隐私与安全 >“告知网站不要出售或共享我的数据”
Brave内置(默认开启)默认启用;可在设置 > Shields 中关闭
DuckDuckGo 浏览器内置(默认开启)默认在移动设备和桌面设备上启用
DuckDuckGo 扩展扩展安装扩展;默认启用 GPC
Privacy Badger(EFF)扩展安装扩展;默认启用 GPC
OptMeowt扩展专用于 GPC 的 Chrome/Firefox 扩展
Safari不原生支持需要第三方扩展
Chrome不原生支持需要扩展(DuckDuckGo、Privacy Badger)
GPC 与 Do Not Track(DNT)的区别
功能GPCDNT
HTTP 标头Sec-GPC: 1DNT: 1
JavaScript APInavigator.globalPrivacyControlnavigator.doNotTrack
法律认可是 — CCPA/CPRA、CPA、CTDPA 及其他州法律没有法律强制机制
适用范围退出出售、共享和定向广告一般跟踪偏好
浏览器采用情况逐渐普及(Firefox、Brave、DuckDuckGo)大多数浏览器已弃用
行业合规情况在适用司法管辖区内具有法律强制性基本被忽视

美国各州法律对应关系

各州 GPC 法律要求
州法律GPC 状态生效日期要求
加利福尼亚州CCPA/CPRA具有法律约束力的退出选择2023 年 1 月 1 日必须将 GPC 视为有效的拒绝出售和共享请求(Cal. Civ. Code §1798.135(e);11 CCR §7025(b))
科罗拉多州CPA具有法律约束力的退出选择2024 年 7 月 1 日必须遵守“通用退出机制”,包括 GPC(C.R.S. §6-1-1313(1)(a);4 CCR 904-3 Rule 5.11)
康涅狄格州CTDPA具有法律约束力的退出选择2023 年 7 月 1 日(UOM:2025 年 1 月 1 日)必须遵守“退出偏好信号”(P.A. 22-15, §6(a)(6))
蒙大拿州MCDPA具有法律约束力的退出选择2024 年 10 月 1 日必须遵守通用退出机制
得克萨斯州TDPSA具有法律约束力的退出选择2024 年 7 月 1 日(UOM:2025 年 1 月 1 日)必须遵守通用退出机制
俄勒冈州OCPA具有法律约束力的退出选择2024 年 7 月 1 日(UOM:2026 年 1 月 1 日)必须遵守通用退出机制
特拉华州DPDPA具有法律约束力的退出选择2025 年 1 月 1 日(UOM:2026 年 1 月 1 日)必须遵守通用退出机制
新罕布什尔州NHPA具有法律约束力的退出选择2025 年 1 月 1 日必须遵守通用退出机制
新泽西州NJDPA具有法律约束力的退出选择2025 年 1 月 15 日(UOM:2025 年 7 月 15 日)必须遵守通用退出机制
弗吉尼亚州VCDPA自愿(无 UOM 强制要求)2023 年 1 月 1 日没有明确的 UOM 要求,但必须允许退出定向广告
犹他州UCPA自愿(无 UOM 强制要求)2023 年 12 月 31 日无 UOM 要求
GPC 会触发什么

在适用司法管辖区检测到用户的 GPC 时:

处理活动GPC 影响必须采取的行动
出售个人信息触发退出选择停止出售该用户的 PI
为跨情境行为广告而共享触发退出选择停止与广告合作伙伴共享 PI
定向广告触发退出选择(CPA、CTDPA、TDPSA)禁用行为定向
用于自动化决策的画像分析触发退出选择(部分州)禁用画像分析
分析(第一方)不触发GPC 不会退出第一方分析
必要 Cookie不触发严格必要的 Cookie 不受影响

CMP 集成

检测和响应流程
Page Load
    │
    ├── Check for GPC signal
    │   ├── navigator.globalPrivacyControl === true
    │   │   OR
    │   └── Server detects Sec-GPC: 1 header
    │
    ├── Determine user jurisdiction
    │   ├── IP geolocation → US state mapping
    │   └── Check if state has GPC legal requirement
    │
    ├── If GPC detected AND applicable jurisdiction:
    │   ├── Automatically set consent state:
    │   │   ├── ad_storage: denied
    │   │   ├── ad_user_data: denied
    │   │   ├── ad_personalization: denied
    │   │   ├── analytics_storage: [per CMP default — GPC does not cover]
    │   │   └── sale_of_data: opted_out
    │   │
    │   ├── Block advertising cookies and tags
    │   ├── Do NOT fire: Meta Pixel, Google Ads remarketing, third-party ad tags
    │   ├── DO fire: GA4 (if analytics consent separate from GPC)
    │   │
    │   ├── Display modified banner (optional):
    │   │   "We detected your Global Privacy Control preference.
    │   │    We will not sell or share your personal information.
    │   │    [Manage Other Preferences]"
    │   │
    │   └── Record GPC opt-out in consent log
    │
    └── If GPC detected but NON-applicable jurisdiction (e.g., EU):
        └── Treat as privacy signal but apply jurisdiction's own rules
            (EU still requires opt-in consent regardless of GPC)
Pinnacle E-Commerce Ltd 的实现

服务器端 GPC 检测(Node.js 中间件):

function detectGPC(req, res, next) {
  const gpcHeader = req.headers['sec-gpc'];
  const gpcEnabled = gpcHeader === '1';

  req.gpcSignal = gpcEnabled;

  if (gpcEnabled) {
    // Determine jurisdiction from IP
    const userState = geolocateToState(req.ip);

    // States where GPC is legally binding
    const gpcMandatoryStates = ['CA', 'CO', 'CT', 'MT', 'TX', 'OR', 'DE', 'NH', 'NJ'];

    req.gpcLegallyBinding = gpcMandatoryStates.includes(userState);
    req.gpcOptOut = {
      sale: gpcEnabled && req.gpcLegallyBinding,
      sharing: gpcEnabled && req.gpcLegallyBinding,
      targetedAdvertising: gpcEnabled && req.gpcLegallyBinding,
    };
  }

  next();
}

客户端 GPC 检测和 CMP 更新:

function handleGPCSignal() {
  const gpcEnabled = navigator.globalPrivacyControl === true;

  if (!gpcEnabled) return;

  // Get user's jurisdiction (from server or geolocation)
  const userJurisdiction = getUserJurisdiction();
  const gpcBindingStates = ['CA', 'CO', 'CT', 'MT', 'TX', 'OR', 'DE', 'NH', 'NJ'];

  if (gpcBindingStates.includes(userJurisdiction)) {
    // Update Google Consent Mode
    gtag('consent', 'update', {
      'ad_storage': 'denied',
      'ad_user_data': 'denied',
      'ad_personalization': 'denied',
      // analytics_storage not affected by GPC
    });

    // Update CMP state
    updateCMPState({
      sale_optout: true,
      sharing_optout: true,
      targeted_advertising_optout: true,
      source: 'gpc_signal',
    });

    // Remove any existing advertising cookies
    removeAdvertisingCookies();

    // Log GPC opt-out
    logConsentEvent({
      type: 'gpc_auto_optout',
      jurisdiction: userJurisdiction,
      timestamp: new Date().toISOString(),
      gpc_header_present: true,
    });
  }
}

function removeAdvertisingCookies() {
  const adCookies = ['_fbp', '_fbc', '_gcl_au', 'IDE', 'fr', 'NID'];
  adCookies.forEach(name => {
    document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.pinnacle-ecommerce.com`;
  });
}

// Run on page load
handleGPCSignal();
CMP 平台集成

OneTrust GPC 配置:

设置值
遵守 GPC 信号已启用
GPC 处理方式应用于“出售个人数据”和“定向广告”类别
GPC 适用地区US-CA, US-CO, US-CT, US-MT, US-TX, US-OR, US-DE, US-NH, US-NJ
GPC 横幅行为隐藏退出选择横幅(已退出);显示确认通知
GPC 同意记录将 GPC 信号记录为退出选择来源

Cookiebot GPC 配置:

设置值
遵守 GPC已启用
GPC → 类别映射GPC = 拒绝“营销”类别
GPC 地区加利福尼亚州、科罗拉多州、康涅狄格州、蒙大拿州、得克萨斯州、俄勒冈州、特拉华州、新罕布什尔州、新泽西州

GPC 验证与合规

测试 GPC 集成
测试预期行为验证方法
发送 GPC 标头浏览器发送 Sec-GPC: 1网络检查器
服务端检测到 GPC中间件设置 req.gpcSignal = true服务端日志
屏蔽广告 Cookie不设置 _fbp、_gcl_au、IDE CookieCookie 检查器
屏蔽广告标签不发送 Meta Pixel、Google Ads 再营销请求网络检查器
分析不受影响GA4 仍会触发(GPC 不涵盖分析)GA4 实时报告
同意日志记录 GPC记录 GPC 退出选择的时间戳和司法辖区数据库查询
CCPA 退出链接反映 GPC 状态“Do Not Sell”页面显示检测到 GPC 的退出状态UI 检查
显示修改后的横幅横幅确认已识别 GPC 偏好视觉验证
CCPA/CPRA 特定要求

根据加利福尼亚州总检察长法规(11 CCR §7025):

  1. 不得降低服务质量:企业不得将 GPC 解读为同意选择加入财务激励计划
  2. 冲突解决:如果用户此前已选择加入出售/共享,之后访问时出现的 GPC 应视为撤销该选择加入
  3. 不得再次提示:不得要求使用 GPC 的用户重新考虑其退出选择
  4. 记录保存:保留由 GPC 触发的退出记录 24 个月
  5. 隐私政策披露:在隐私政策中声明企业认可 GPC

Pinnacle E-Commerce Ltd 隐私政策文本:

“我们会识别浏览器发送的全球隐私控制(GPC)信号。当我们检测到来自加利福尼亚州用户的 GPC 信号时,会将其视为用户根据《加利福尼亚消费者隐私法案》(CCPA)和《加利福尼亚隐私权法案》(CPRA)的定义,要求退出出售和共享个人信息。我们会自动应用此退出选择,无需您采取任何其他操作。”

边缘情况

场景处理方式
用户已启用 GPC,但此前已选择加入共享GPC 优先——视为退出(以最近的信号为准)
用户已启用 GPC,但所在州不适用(例如 Utah)尊重 GPC 隐私偏好,但法律并无此要求
用户已启用 GPC,且位于 EUGPC 不能替代选择加入同意;应用 EU 规则
在 API 请求中检测到 GPC(无浏览器)如果存在 Sec-GPC 标头,则予以遵从(可能来自注重隐私的应用)
部分页面启用 GPC,其他页面禁用按请求评估;通常不应出现此情况
存在多个退出信号(GPC + Cookie 横幅拒绝)应用限制最严格的处理方式——两者都会导致退出

重要法律和技术参考

  • GPC 规范(globalprivacycontrol.org) — GPC 信号的技术规范
  • CCPA/CPRA Cal. Civ. Code §1798.135(e) — 企业必须将 GPC 视为有效的退出请求
  • 11 CCR §7025(b)-(c)(加利福尼亚州总检察长法规) — GPC 实施要求
  • Colorado CPA Rules, 4 CCR 904-3, Rule 5.11 — 通用退出机制要求,包括 GPC
  • Connecticut CTDPA P.A. 22-15, §6(a)(6) — 退出偏好信号要求
  • 加利福尼亚州总检察长执法行动:Sephora(2022 年 8 月) — 首例因未遵从 GPC 而执行的 CCPA 案件;和解金额为 120 万美元
  • EDPB 关于 GPC 的声明(2023) — 关于 GPC 可否作为行使第 21 条异议权的表达的欧洲观点
  • W3C 隐私社区组 — GPC 规范的制定
  • IAB CCPA 合规框架 — US Privacy String 与 GPC 的互操作性

评论

支持 Markdown