MENU

不见,Google FloC

April 18, 2021 • 开发

FloC: Federated Learning of Cohorts (联合队列学习)

2021 年 3 月 20 日,谷歌发布的 Chrome 89 中包含了 Floc 并进行小范围 A/B 测试,该部分代码也被包含在其维护的开源项目 Chromium,如不加处理 Floc 将被包含在基于此的若干浏览器中。在 Chrome 89 发布后不久,Firefox 以及基于 Chromium 的 Opera、Brave、Vivaldi 、Edge 均表示拒绝使用 FloC 技术。

什么是 FloC

当前广告服务商多通过 Cookies 进行追踪用户信息,它被 MDN 称为渐渐被淘汰的技术,而用户也可以通过隐私狐等浏览器插件进行拦截,Cookies 所带来的隐私安全问题已然被控制住。

Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。————《HTTP cookies》 by MDN

在 2020 年,Safari 浏览器完全屏蔽了第三方 Cookie,谷歌也宣布将逐步淘汰对 Chrome 中第三方 Cookie 的支持。

随即谷歌也由此推出 FloC 技术,在它的 GitHub 文档中提到 FloC 是作为替代 Cookies 在广告个性化中作用的技术。它可以采集你过去一周所访问的网站域名,并通过 SimHash 算法给你分配 FloC ID。拥有相同 FloC ID 即与你具有相似兴趣的大批人群将被分配在同一个群组中,这个群组被 FloC 称为 cohort(C),每个群组都拥有一个 FLoC ID。该 ID 将会对所有你所访问的网站显示,这意味着网站将可以通过 FloC ID 和浏览器指纹进行较 Cookie 更精确地描绘出你的用户画像并与你绑定。

目前 FloC 还没有足够多且被证明有效的手段去禁止它,与逐渐被淘汰且可拦截的 Cookie 相比,FloC 将是对我们的隐私安全造成威胁的更大隐患。

如何禁用 FloC

用户

如果我正在使用 Chrome 89,我该如何判断自己是否被列入了 FloC 测试计划?

  • 可以通过 EFF 所提供的 Am I FLoCed? 网站 进行检测。
  • 也可以通过在 console (控制台) 中通过命令检测 document 对象下面是否存在 interestCohort() 方法。
document.interestCohort()

如果你发现自己被列入了测试计划并打算禁用 FloC,那么你可以在 Chrome 设置中禁止第三方 Cookie 即可退出 FLoC 测试。但此方案亦会带来副作用,如一些网站的单点登录功能将无法正常运行。

当然你也还可以选择抛弃 Chrome 并拥抱拒绝使用 FloC 的 Firefox(我永远喜欢 FF)。

站长

Chrome 中 FloC 默认在所有网站中启用,但网站所有者也可以通过选择退出 FLoC 来确保他们的网站不参与这个庞大的网络,只需要添加以下自定义 HTTP 响应头即可。

Permissions-Policy: interest-cohort=()

Nginx

添加以下内容到你的 Nginx 配置文件中。

# default.conf

server {
    location / {
      add_header Permissions-Policy interest-cohort=();
    }
}

通过 service nginx restart 命令重启 Nginx。

值得注意的是如果一个配置文件被用于多个站点,那么你需要在不同网站块中添加 add_header

Apache

添加以下内容到 Apache 配置文件中。

# .htaccess 

<IfModule mod_headers.c>
  Header always set Permissions-Policy: interest-cohort=()
</IfModule>

通过 service apache2 restart 命令重启 Apache。

Caddy

添加以下内容到 Caddy 配置文件中。

# Caddyfile

example.com {
    header Permissions-Policy "interest-cohort=()"
}

然后通过 caddy reload 命令重启 Caddy。

OpenLiteSpeed

添加以下内容到 OpenLiteSpeed 配置文件中。

# vhconf.conf

context / {
  location                $DOC_ROOT
  allowBrowse             1
  note                    This header disables FLoC
  extraHeaders            set Permissions-Policy interest-cohort=()
}

然后通过 service lsws restart 命令重启 OpenLiteSpeed。

Varnish

将以下内容添加到 Varnish 配置文件中。

# default.vcl

sub vcl_deliver {
    set resp.http.Permissions-Policy = "interest-cohort=()";
}

然后通过 service varnish restart 命令重启 Varnish。

HAProxy

将以下内容添加到 HAProxy 配置文件中。

# frontend, listen, or backend section

http-response set-header Permissions-Policy interest-cohort=()

然后通过 service haproxy restart 命令重启 HAProxy。

Traefik

将以下内容加入你的 Treafik toml 配置文件中。

# traefik.toml

[http.middlewares]
  [http.middlewares.floc.headers]
    [http.middlewares.floc.headers.customResponseHeaders]
        Permissions-Policy = "interest-cohort=()"

如果你使用的配置文件采用 yaml 格式,添加以下内容到你的配置文件中。

# traefik.yml

http:
  middlewares:
    floc:
      headers:
        customResponseHeaders:
          Permissions-Policy: "interest-cohort=()"

如果你通过 docker-compose 部署 Traefik 你也可以在 docker-compose.yml 对响应头进行配置。

# docker-compose.yml

labels:
  - "traefik.http.middlewares.floc.headers.customresponseheaders.Permissions-Policy=interest-cohort=()"

然后执行 docker-compose up -d 命令进行更新。

Lighttpd

添加以下内容到你的 Lighttpd 配置文件中。

# lighttpd.conf

server.modules += ( "mod_setenv" )

setenv.add-response-header = ( "Permissions-Policy" => "interest-cohort=()" )

通过 service lighttpd restart 命令重启 Lighttpd。

H20

添加以下内容到你的 H20 配置文件中。

# h2o.conf

hosts:
  "example.com":
  header.set.ifempty: "Permissions-Policy: interest-cohort=()"

通过 service h2o restart 命令重启 H20。

Netlify

将以下内容添加到 Netlify 配置文件中。

# netlify.toml

[[headers]]
  for = "/*"
  [headers.values]
    Permissions-Policy = "interest-cohort=()"

如果你更喜欢使用 _headers 文件进行添加响应头,则需添加以下内容。

# _headers

/*
  Permissions-Policy: interest-cohort=()

Netlify 将在你下次构建或部署时更新响应头。

Vercel

将以下内容添加到 Vercel 配置文件中。

# vercel.json 

"headers": [
  {
   "source": "/(.*)",
   "headers" : [
      {
        "key": "Permissions-Policy",
        "value": "interest-cohort=()",
      }
    ]
  }
]

GitHub Pages

目前 GitHub Pages 暂时没有方法可以禁用 FloC,但我已通过工单进行询问解决方案。

在我提交工单的一周后,GitHub Pages 已全部添加该响应头,用户无需任何操作1

GitLab Pages

如果你正在使用 GitLab CE (Community Edition) 版,添加以下内容到 gitlab.rb 文件中。

# gitlab.rb

gitlab_pages['headers'] = [ "Permissions-Policy: interest-cohort=()" ]

你也可以在启动 GitHub Pages 二进制文件时附带响应头。

./gitlab-pages -header "Permissions-Policy: interest-cohort=()"

Cloudflare Workers

添加以下内容到你的 Worker 脚本中。

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  let response = await fetch(request)
  let newHeaders = new Headers(response.headers)
  newHeaders.set("Permissions-Policy", "interest-cohort=()")

  return new Response(response.body, {
    status: response.status,
    statusText: response.statusText,
    headers: newHeaders
  })
}

将此脚本添加到任意域名作为 Worker 路由。

WordPress

WordPress 允许通过钩子进行自定义响应头。在你当前启用的主题根目录下的 functions.php 文件末尾添加以下内容即可:

# functions.php

function disable_floc($headers) {
    $headers['Permissions-Policy'] = 'interest-cohort=()';
    return $headers;
  }

add_filter('wp_headers', 'disable_floc');

如果你正在使用缓解方案,那么添加响应头后,你需要清理缓存好让缓存替换为最新版本。

此外你亦可使用由 WordPress 核心贡献者所开发 Disable FLoC 插件 来禁用它。

注意

无法通过在 标签中添加 <meta http-equiv="Permissions-Policy" content="interest-cohort=()"/> 来禁用 FloC。只有极小一部分响应头可以使用 HTTP-Equiv 来修改,而 Permissions-Policy 并不在此列之中。

参见

Last Modified: June 1, 2021