Cookie 与隐私同意模块:横幅、偏好与记录
Cookie 与隐私同意模块在顾客首次访问时说明站点会在设备上存储或读取什么,让顾客按目的接受、拒绝或自定义,记录这个选择,并允许随时更改。它管的是“同意状态”,不是那个横幅:横幅只是采集选择的界面,真正的约束是没有同意,对应脚本就不加载。
Cookie 同意 = 目的分类与脚本清单 × 同意状态与记录 × 横幅与偏好中心 × 页面语境
先确定模块在完成什么任务
- 顾客问题:这个站在我的设备上存了什么、为了什么;我能不能只允许一部分,或者全部拒绝;选完以后还能不能改。
- 对象层级:对象是访客的浏览器或设备,不是登录后的客户账户;粒度是“目的”(必要、偏好、分析、营销等),不是单个 Cookie 名称。它不同于邮件订阅邀请所收集的邮件与短信营销同意,后者是对“品牌主动联系我”的授权,见「与营销同意的区别」。
- 进入前已知:站点实际会加载的脚本与 Cookie 清单、每一项的目的与提供方、目标市场是否需要事先同意、访客是否已有有效的选择记录。
信息来源与输入
| 输入 | 来源 | 最低要求 |
|---|---|---|
| 目的分类与文案 | 隐私政策,由隐私或法务负责人确认 | 每个目的说明用途与提供方;不用“提升体验”一类空话概括分析与广告 |
| Cookie 与脚本清单 | 工程盘点(资源数据) | 名称、提供方、目的、保存时长、属于哪个目的;新增脚本必须先归类再上线 |
| 是否需要事先同意 | 平台状态或合规规则(按访客所在地区) | 运行时判定,不写成全站静态默认;规则由合规确认 |
| 当前同意状态 | 平台状态(运行时) | 每次页面加载读取,脚本加载与横幅显示都以它为准,不得写死为“已同意” |
| 同意记录 | 交易动作(顾客点击) | 只在顾客点击接受、拒绝或保存偏好时写入,能说明何时、以什么文案版本做出选择 |
| 隐私政策与偏好入口 | 站点导航与政策页 | 横幅与页脚都能进入;撤回入口常驻 |
同意状态、同意记录与是否显示横幅是运行时数据,不得改写成静态文案,也不得由站点代替访客选择。
同意与脚本加载
这是本模块的硬约束。以下为读到的官方要点,不是法律意见,各市场需要合规确认。
- 无同意不加载。EDPB 报告第 7 段回顾:默认情况下,需要同意的 Cookie 在没有同意时不得设置,同意必须由用户的积极动作表达。英国 ICO 页面写明:访客没有点击任何选项就继续浏览,不得使用需要同意的存储与访问技术,沉默或无操作不构成同意。所以“继续浏览即视为同意”的文案不能作为加载依据。
- 拒绝、撤回与关闭都要生效。ICO 页面写明:访客撤回同意后,站点必须停止使用相关技术、停止相应的个人数据处理,并通知合作的第三方;已设置的技术要能被移除。实现上,撤回必须触发脚本卸载或停发,不能只改一个布尔值。
- 加载顺序:先读同意状态,再决定是否注入分析与广告脚本;同意后按需注入,撤回后停用。同意管理脚本自身应尽早加载,其余脚本不得抢在它之前。
- 必要类是否豁免:ICO 页面写明豁免按目的区分,多用途技术难以套用;哪些 Cookie 属于“必要”,由合规逐项确认,不要因为“网站需要”就自行归类。
- 提示文案与登记:新增脚本或改变用途,必须重新归类,ICO 页面写明用途变化需要重新取得同意;文案版本随记录保存。
横幅设计要求
- 接受与拒绝同等显著。EDPB 报告第 8 段记录:绝大多数监管机构认为,带同意按钮的任何一层都没有拒绝选项,不符合有效同意的要求,构成违反(少数机构认为 ePrivacy 指令没有明文写“拒绝”);第 14 段列出的无效同意示例包括:唯一的替代操作是嵌在段落文字里、缺少足够视觉提示的“拒绝”或“不接受并继续”链接(第 13 段另写明不得让用户觉得必须同意才能访问内容)。ICO 页面的清单要求“拒绝和接受一样容易”,其示例把并列的“全部接受”“全部拒绝”标为良好做法,只有“接受”与“更多选项”而没有“全部拒绝”标为不良做法。两份材料适用于欧盟与英国,其他市场需要合规确认。
- 不预勾选。EDPB 报告第 10 段确认预勾选不构成有效同意;ICO 示例中自定义层的开关默认关闭,且“合法利益”类开关预开也被列为不良做法。
- 按钮颜色与对比度:EDPB 报告第 17 至 19 段写明不设统一的颜色与对比标准,需要逐案判断,但把替代选项做成文字几乎不可读的按钮,属于明显误导。本模块的做法是让“接受”“拒绝”使用同一组样式(尺寸、字重、对比度),不用高饱和主按钮加灰色文字链接的组合。
- 偏好中心:分目的开关,默认关;提供“保存所选”;第一层就能看到接受、拒绝和自定义三个选项,第三方的信息可放二层,但第一层需明确指向。
- 重复询问:ICO 页面写明,访客拒绝后不应反复弹出;作为一般指引,页面给出的建议间隔是六个月,用途变化时需要提前重新询问。
- 撤回与更改:EDPB 报告第 32 至 35 段写明网站应提供便于访问的撤回方案,例如常驻的小图标或位置固定的链接,但不能强制某种具体形式,需要逐案判断“撤回和给出同意一样容易”是否成立。本模块把“页脚常驻的偏好入口”作为最低要求。
状态与退化
| 状态 | 处理 |
|---|---|
| 零项(站点没有任何需要同意的脚本) | 不显示横幅;仍保留隐私政策链接,避免为展示而展示 |
| 一项(只有一个目的) | 横幅只列这一项,仍提供接受与拒绝;不为凑数拆出空类别 |
| 多项(多个目的) | 第一层接受、拒绝、自定义;分类开关放二层,默认关 |
| 加载中 | 未取得状态前,非必要脚本一律不加载;横幅在状态确认后出现,不因慢速而先加载脚本 |
| 已有选择 | 不再弹出横幅;页脚偏好入口可见;选择过期或用途变化后重新询问 |
| 读取失败或存储被禁用 | 按未同意处理,非必要脚本不加载;横幅每次访问可能再次出现,需在偏好文案里说明 |
| 撤回 | 立即停用相关脚本,更新记录,并向仍在运行的第三方传递撤回;已设置的 Cookie 按能力移除 |
| 跨市场 | 是否显示横幅、默认状态与目的分类随访客所在市场变化,不用一份配置覆盖所有市场 |
| 无 JavaScript | 非必要脚本本来就不会执行;横幅退化为页内的文字说明与隐私政策链接,说明无法在此收集选择 |
| 减少动态 | 横幅出现不用滑入动画,不引起布局位移 |
可选展现与交互
- Banner(吸底或吸顶条):默认形式,占用空间小,选择完成后收起;见 Banner、Sticky Bar。固定条不得遮住获得焦点的控件,见下一节。
- Modal(居中对话框):只有在合规要求“先选择再继续”,且已经确认不会阻断关键任务时使用;按 Modal 的焦点管理与 Escape 要求处理。一个全屏遮罩在首屏挡住购买入口,代价通常大于收益。
- 偏好中心:从横幅的“自定义”或页脚“Cookie 偏好”进入,可以是对话框,也可以是独立页面。
- 不适用:弹出后自动消失的提示、需要悬停才出现的入口,都不能作为唯一的撤回入口。
页面组合中的位置
- 出现位置:全站首次访问;页脚长期保留偏好入口。
- 前后模块:与订阅获取的弹窗不得同屏叠加,先呈现同意,再由订阅弹窗按自己的频次规则出现;商品页购买区与吸底加购栏(见购买区)在首屏不得被横幅遮住核心按钮,购物车抽屉打开时不弹出新的同意弹窗。
- 不应出现的语境:结账必经步骤中间新弹一层;错误页;访客已选择之后再次无理由弹出。
无障碍与性能
- 键盘与焦点:全部控件可用键盘完成(WCAG 2.2 SC 2.1.1 Keyboard,A);焦点顺序与视觉顺序一致(SC 2.4.3 Focus Order,A)。
- 不遮挡焦点:SC 2.4.11 Focus Not Obscured (Minimum)(AA)要求获得焦点的组件不被作者创建的内容完全遮住。W3C 页面在 Cookie 横幅一节说明,横幅完全遮住被聚焦的组件会不通过,并列出把横幅做成模态、用
scroll-padding或焦点离开横幅时自动关闭等做法。 - 对话框语义:做成模态对话框时,按 WAI-ARIA APG 的 Dialog (Modal):
role="dialog"、aria-modal="true",用aria-labelledby或aria-label命名;打开时焦点移入对话框,Tab 在其内循环,Escape 关闭,关闭后焦点回到触发它的元素。非模态横幅不限制焦点,靠位置与 DOM 顺序保证可达。 - 小屏与缩放:SC 1.4.10 Reflow(AA)要求内容在 320 CSS 像素宽度下无需二维滚动;横幅在窄屏与放大后不得占满视口,按钮不被截断。
- 性能:同意管理脚本轻量、尽早加载;未同意的脚本不产生请求;横幅不造成布局位移。
与营销同意的区别
| 项目 | Cookie 与隐私同意 | 邮件或短信营销同意 |
|---|---|---|
| 授权对象 | 设备上的存储、读取与相关数据处理 | 品牌通过邮件、短信主动联系 |
| 主体 | 匿名访客也适用 | 已提供联系方式的顾客 |
| 入口 | 横幅、偏好中心 | 订阅获取、结账勾选、账户设置 |
| 记录 | 访客设备与站点记录 | 客户档案里的订阅状态 |
| 撤回 | 偏好入口 | 邮件中的退订、账户设置 |
两者不合并为一个勾选,也不用“同意 Cookie”换取订阅。Shopify 官方页面在所读范围内没有把 Cookie 同意与邮件订阅同意写成同一状态,两者分别核对;后台设置、营销同意与数据请求的整体分工见隐私与同意。
映射到 Shopify
核验于 2026-09-29,来自 shopify.dev 与 help.shopify.com 官方页面,只写页面所写;部分页面经工具摘要读取,措辞以官方页为准。
| 机制 | 官方页面所写 |
|---|---|
| 官方 Cookie 横幅 | 帮助中心写明路径为 Settings > Customer privacy > Cookie banner,可选自动或手动的地区与内容设置,可调整颜色、偏好与位置,可预览;在英国与欧洲经济区已启用的市场自动显示,其他地区可自行启用;横幅出现在店面、购物车、结账与客户账户页 |
| 访客改选 | 访客可通过横幅或页脚的“Cookie preferences”链接查看并更改偏好 |
| 适用范围 | 页面写明该横幅管理 Shopify 自身的工具;手动安装或通过应用集成的第三方 Cookie 与像素,可能需要第三方横幅或自己的逻辑来尊重同意 |
| 法律责任 | 页面写明自动化的隐私设置不能替代法律意见,商家需确保隐私政策准确并符合适用法律 |
| Customer Privacy API | 浏览器端 JavaScript 接口;同意类别为 analytics、marketing、preferences、sale_of_data;读取用 currentVisitorConsent()、analyticsProcessingAllowed()、marketingAllowed()、shouldShowBanner() 等,写入用 setTrackingConsent(),showPreferences() 打开偏好弹窗且需要 storefront-banner.js;userCanBeTracked() 等旧方法被标为弃用 |
| 记录同意的时机 | 文档写明记录同意只应在访客交互(接受或拒绝)后进行,不得代替访客自动记录;也不得直接读写 Shopify 的 Cookie,必须通过该 API |
| 与 Pixel | Web pixel 应用扩展遵守 Customer Privacy API 的同意信号;在需要同意的地区,回调在同意后才执行,此前已登记的事件随后被重放;在按退出模式运行的地区,回调随事件执行直到访客退出。Pixel 管理器只在访客对声明为必需的全部设置都给予许可时才加载该 Pixel;Custom Pixel 可以在设置中选择“Required”并指定需要许可的目的。Pixel 内用 init.customerPrivacy 读初始状态,订阅 visitorConsentCollected 事件获取后续变化 |
与App Pixel、Custom Pixel 与 GTM 的边界一致:同意状态是测试条件,没有触发不直接等于代码故障。采集链路的选择见浏览器采集、服务端 GTM 与标签网关。
未核验:Shopify 横幅的按钮标签、接受与拒绝是否同等显著、默认状态;同意记录在平台内的保存方式与保存期限;Customer Privacy API 与 Google Consent Mode 的关系;各主题是否内置 Cookie 横幅。本库 shopify/themes 固定版本正文中搜索 cookie、customerPrivacy、consent 的命中只涉及订阅同意,不涉及 Cookie 横幅,该结论仅限这些正文。
验证一次 Cookie 同意
- 用干净浏览器配置、从目标市场的网络首次访问:横幅按预期出现,网络面板中没有任何非必要脚本请求。
- 不点击任何选项,滚动并跳转到另一页:脚本仍未加载,横幅行为与频次规则一致。
- 点击“拒绝”:脚本未加载,刷新与换页后仍未加载,横幅不再弹出。
- 从页脚打开偏好,勾选分析并保存:分析脚本此后才加载,营销脚本仍不加载。
- 再次打开偏好,撤回分析:分析请求停止,已设置的相关 Cookie 按能力清除。
- 更换地区与语言,检查是否显示横幅、默认状态与文案随市场变化;用禁用存储的模式访问,确认按未同意处理。
- 只用键盘与读屏软件完成接受、拒绝、自定义与关闭;在 320 CSS 像素宽度与 400% 放大下,横幅与主要操作不互相遮挡。
- 在商品页与购物车打开横幅,确认不遮住购买按钮与获得焦点的控件。
- 用 Shopify Pixel Helper 或等效工具,分别在拒绝与同意后触发一次加购,核对 Pixel 事件是否只在同意后发出。
记录时间、地区、浏览器、所选选项与看到的请求,避免不同条件下的结果互相比对。
待继续完善
- 各法域的法规原文(欧盟 GDPR 与 ePrivacy、英国 PECR、美国各州隐私法)没有读原文,本文只引用监管机构报告与指南,需要法务或合规确认;
- ICO 页面未标注日期,是否已随英国后续立法变动更新,未核验;
- Shopify 横幅的按钮与同意记录细节、测试店铺实测,未做;
- 缺少虚构示例的第一层文案与偏好中心样稿。