PCM
点击欺诈预防和归因发送给广告主

今年早些时候,Safari 是首个发布一项拟议网络标准的浏览器,用于以保护隐私的方式衡量广告——私密点击测量(Private Click Measurement,简称 PCM)。今天我们很高兴地宣布 PCM 的三项重大更新,已在 iOS/iPadOS 15 和 macOS Monterey 测试版中提供。

  • 归因报告也发送给点击目标。
  • 使用不可链接的令牌进行点击欺诈预防。
  • 归因报告的 IP 地址保护。

所有这些都已涵盖在 Kate 的 WWDC 会议中。还有两项关于命名和数据类型的次要更新,请参阅下文。

让我们开始吧。

PCM 快速回顾

PCM 允许测量将用户从一个网站导航到另一个网站,或从 iOS 应用导航到网站的点击。发生点击的网站或应用称为点击来源,用户导航到的网站称为点击目标。

归因报告也发送给点击目标

我们设计 PCM 的归因报告是为了确保它们对点击来源和点击目标都具有意义,也就是说,没有只能由一方理解或解码的不透明 ID。PCM 现在将生成的归因报告发送给点击来源和点击目标,以帮助广告主验证数据并控制其广告测量。这两份报告将独立发送,并有 24-48 小时的延迟(每份报告在 24-48 小时内有自己的延迟)。由于 PCM 报告已包含点击来源和点击目标的信息,因此将其发送到两个地方不会带来新的隐私风险(它们可能已经共享了这些信息)。

PCM 的调试模式(请参阅我们上一篇博文中的“测试和调试”)也会独立发送它们,但延迟较短,为 10 秒,即一个在 10 秒后,另一个在 10+10=20 秒后。

使用不可链接的令牌进行点击欺诈预防

我们在关于 PCM 的入门博文中提到,欺诈预防是该功能的一个主要需求,我们非常高兴地宣布,现在支持用于点击欺诈预防的可选不可链接令牌。令牌盲化和解盲所需的加密操作仅在 iOS/iPadOS 15 和 macOS Monterey 上可用,因此旧版操作系统上的客户端将不提供此类令牌。但是,如果您在不支持令牌的 Safari 版本中选择启用令牌,PCM 仍将正常工作并发送归因报告。此外,用于点击欺诈预防的不可链接令牌目前仅在 PCM 的网页到网页场景中可用。

不可链接令牌提供了一种由点击来源和客户端生成的、保护隐私的证明,证明归因链接上存在一次唯一的点击事件。不可链接令牌是使用RSA 盲签名实现的,这是一种经过充分研究的密码学构造,通过在客户端执行的盲化和解盲操作,保证了令牌签名时刻与最终签名验证之间的不可链接性。与其他一些加密令牌构造不同,盲签名提供了公共可验证性,允许点击来源和点击目标都可以验证点击来源网站上点击事件的真实性。

作为点击来源网站的开发者,您可以通过以下方式选择启用带有不可链接令牌的点击欺诈预防:

步骤 1:生成 RSA 密钥对

不可链接令牌需要一个用于令牌生成和验证的公钥,以及一个用于签名的相应私钥。PCM 支持三种不同的 RSA 密钥大小:2048、3072 和 4096 位。公钥的预期编码是一个 Base64 编码的 SPKI,带有 RSA-PSS OID 和与 RSABSSA IETF 草案对应的参数。

步骤 2:添加新的链接属性 attributionsourcenonce

在点击来源侧添加一个随机数 (nonce)

<a href="https://shop.example/productABC.html" attributionsourceid=3 attributiondestination="https://shop.example" attributionsourcenonce="ABCDEFabcdef0123456789"></a>

attributionsourcenonce 仅用于帮助点击来源服务器了解其签署不可链接令牌的上下文。点击来源旨在在服务器看来唯一且临时地标识一个特定的点击事件。当服务器被要求签署一个不可链接令牌时,它将获得 attributionsourcenonce 并可以决定该点击事件是否可信。

attributionsourcenonce 需要是 Base64URL 编码的 128 位/16 字节值。任何过小或过大的值都将取消欺诈预防签名的颁发流程。任何非 Base64URL 编码的值也将取消令牌交易。如果 attributionsourcenonce 格式错误,Web Inspector 将记录警告。

步骤 3:响应您的公钥请求

浏览器和任何验证方需要能够随时从以下知名位置获取您的公钥:https://clicksource.example/.well-known/private-click-measurement/get-token-public-key/

您的服务器响应应如下所示,其密钥应为 Base64URL 编码

{
  "token_public_key": "MIICUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAqEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiAwIBMAOCAg8AMIICCgKCAgEAoGhU5Mgsbb51ZbJVPHSgf8c93TJdtkxeKfyxQ5fCpwE2Fe9xJ7tByExdGKj4XO+HFi7npmtEPzR4cRXdsAL7YcH5UXNbVhXmVcbFCBXks+Ih+jqLwfNac0wPLG5K1Zzhf1gZ++JBzVjw87zvqpWrzzxviuV//0sn/u7f01E1OdaD83110fhfiXp/Ex62Q2uhcek0hqbqEvyKlLVBOjlJFJc2FLyw+l8+9xd7GcX1ZRyPx4lITvYG7KIbSMrFTfuQNOyJf4DlO97qq08R6Utl249AnBfLe3ZDbWBnl0fDOwkJgBmbaa7EnRlQ3p6Ir2SY1hNTnzW+p2ceytIMYwTMSES7+j21oeTUC+OmcC/5g05AgxROzUJPZdyY33m4Q7lqkHkLAYtdN2TVCP79MuswS+fJJQOD/dDCqq/hk0MySLCbnUGe5lyFBoO5vBMH5k38LjSQuN6jfP7quYA6cOONzmn842eLT61tIjRoX2czeUJrSmx89SfY8WnFE2fhk9G52cXp6L2Vzr5IV7rOws3ZPw+RnjKnZZaejs0bKGOXC1+jl+u4A5ip55ohlUjm7lvDtKFAeJ7gajJBtiNnq3s3m/IMkv7ztCQpv0pBxst6MmvNOO0jOQvYkzQbGooI1/qjeDup0BYY67xxyNRaA9V4CKEJ7j/hznrAmjSiz0LSqTkCAwEAAQ=="
}

步骤 4:接收令牌签名请求、签名并响应

浏览器请求您的公钥后,它将向您的服务器发送一个带有不可链接令牌的签名请求,发送到以下知名位置:https://clicksource.example/.well-known/private-click-measurement/sign-unlinkable-token/

请求体如下所示

{
  "source_engagement_type": "click",
  "source_nonce": "ABCDEFabcdef0123456789",
  "source_unlinkable_token": "BC16WmucFh4u8pnfKX+3oRLyu2Bkc39UhMDt8ncOHQsd1Joo5ZslNVNdYajMQaNcOdlCpb6weGOE0R9nHtMjzMyUyJWx1T6ADsJsuFwfHvaVGY6v4fOHRc5P0WReOaiBgkGnDwOdG38rQcKk9lAWHCrcSSCsPTuA6L2W81C9/+0fUED+HY8Dqh1q7AkK/dJbsH0oA1nkYPHhPwghdp4QHZzTPSIHtQt/kNUXjT6Z2UPPEUelZNuEYKHUYyKrsKHZhP/2SJmJzJRrV3wb8chKxOpLmQPRkuDBRLIjqe+o7d2IHe4/5Gt1S3m/jrNSggUb8hekHD9C6WLcZ2tVI2A4ALV4clkJAOMtOH819KEd7fQgCT2kRjvz5EkhVto7WHhToCAbLSFCUjucMWqG7o8iRjy6BGvz09GdSNYBSeALwKm+QjOtsuh+sHMh/H0ngqRbT6RgRa8a+4ejsMCeoqZ52H9X6B+yJywT9eLqcKjDnAk2CJR+EOt4Q6FeMqkfUz5SJtGkjGv1PMnXw3PqT3SzuL3B6d3nW7DySkWkR1xMcZnIC0vW7gMgj9O5+Jq3WQh1XlNqkCraPZIbDFGeCIs4LHMRfTA8yzWFEL1CwdrMDjrmpqtzENHGxFHRr/TKozc3v/vGKc2rE9EfhWSAATFSIjeyUUByUCySR3rCzBssaR0=",
  "version": 2
}

source_nonce 是链接中提供的 attributionsourcenonce,而 source_unlinkable_token 是要签名的 Base64URL 编码令牌。

如果您认为这是一个有效请求,您的服务器将执行 RSABSSA 草案的 盲签名操作(BlindSign operation),这是一个对浏览器提供的 source_unlinkable_token 进行的 RSA 私钥操作,并将盲签名作为 Base64 编码的输出,标记为“unlinkable_token",以如下所示的响应返回

{
  "unlinkable_token": "QfvIa2RF16zPcXmsbhrsX7ZcUDAk1rtoOcrqE1XoaK7MUrsLNeolZwzNhkOUSSwJKiXPJpam4q1/teU379uiizDFTLPPaPXqxoEq7L/+QjkGmh5lrmFYSbN475Lm+hb9k1rrPT+ek4PDQ3PZpk35h/cB36iE4cf0/F72Iuf4gnn2S/gGL4oZDb4Yi9njY186TzAZ3E9/1bGKiw6qg1gFD92i7yEm//KdqlcwTrdvaMkqzZtD7KmCzkaub46bVIokLwOuDa2SCj9dDaBVRmcHIAtF174nARQjKkp3do/q8pdZh+syeEUYmnpl+qe+yG9+AlSWQXI+3zW6KZ0PbFAQ/hrmqTU9v3vDOdKFi/gr321A6XeUtL4dQxr/Anw0opLxX/lcwsa6gFiWnpMqBv7x+xnhJBFJI+0USUxq2gXVonhXBg/HVMhrW+eEbqMtrVF23JkXaYX1eaQrV9lfFf6LgHo+7GAVbHF6Y7J4IwfwuvksDfJ1/9axdO5jKQ58gCAlH0zpVgMxNmBcAgCBUv3ebZmrKNzNFSjsodBQ30FmKMPkT1l0eWlaDBz5QIG4y1Pc+ZKW9tCV0rFTg4FMoeN8aayUkTCKGpnRgmfO03uQMeQbuPOkAndjyXQyhevOTespEo9X6Z1KI+w7dVmPL/8oG8Mx+2bic6eszWprP/Kef64="
}

步骤 5:响应您的公钥的另一次请求

当浏览器发送归因报告时,它将再次从您的服务器获取公钥,并确保是相同的公钥。这是 PCM 确保服务器不使用用户特定密钥的方式。请注意,对您公钥的第二次请求可能发生在您测量的点击之后数天,如果浏览器收到不匹配的密钥,它将丢弃归因数据。

目前不支持托管密钥续订。我们打算支持包含两个公钥的响应——一个当前密钥和一个已停用密钥。这样,浏览器可以与两者进行比较,并允许使用与已停用公钥匹配的私钥签名的令牌进行归因。

步骤 6:接收并验证归因报告

生成的归因报告将包含一个已签名的秘密令牌(source_secret_token),您的服务器从未见过该令牌,并且您的服务器无法将其链接到其对应的不可链接令牌(source_unlinkable_token)。但是,您使用私钥创建的签名将对该秘密令牌有效,有效地向您证明您在之前某个时间认为这是一次可信的点击。请务必验证签名。

由于点击目标也会收到归因报告,它们也应该验证该令牌。

报告将如下所示,其中 source_secret_tokensource_secret_token_signature 为 Base64URL 编码

{
  "source_engagement_type": "click",
  "source_site": "clicksource.example",
  "source_id": 201,
  "attributed_on_site": "shop.example",
  "trigger_data": 10,
  "version": 2,
  "source_secret_token": "7JgS5aIQPUm9T5DcT2a91NC1lt2xq5bLjuaJi4A/Wbg=",
  "source_secret_token_signature": "ThyNW13Z7DTVSj/U8+5oWyG73bskeB2ZtmyG+tZRbuX216mK2F7wgv8piQEFxjDC49O9fPP7DFovcJbGOx3JR7zS7fDq3pYOKz/LkF8I2DkLz9jDcgXxgddMRfFsG8ud6FyEtmESiFgF23Nfqnn4JrhC4luDb7JceOdFsNWtXTURYeVcnARhKlcQ8h8Gs0zTCTGz2LkhwOHUlRYUTnqy5Ng9DiK4Rb9XSaTTPFPK2VJ7PNDmVFtvj1uc2OSxO8AJu9FYF4pv0wQjXjBKy00BF6Qm3m7vZXIwu7pTHBbXlb7DpJ2/15OblNEZrbS0BbXUzv8gqhz6MqmstltZdDiQZHRNDXabmPX7Rm1NRiy5XBr2oF+YBcSHJ0xV3YEH3XoeGN2McBoZCQ7CLhhMcDQLGVBv0L05Wp5rwausxd6Yerf01ebedk5D7RlQmrQ0lMo6fnqm6/F9gEHil2axA8zB/xThPD4ZQ0ARHkGWQYraQzGq5Xj65CIa1yV174iDcf6ZP18Hvkj1VcQIderLg0oMI6FOFzSYYeWJR0vKSc6C+y6jAX4dPPS+1uKRMBBijdv/4H9GazAQHhXLGKxaRgbLg+mLXKG4I9YoPVgU/gc/ePeTAyXFs+EgTi5ExpTF2Klv10E8HTtYLAO76FQVjnDNB98dq+XIbFHMuVKzAaBFr7s="
}

归因报告的 IP 地址保护

Safari 15 已经从已知跟踪器中隐藏了设备的 IP 地址,因此如果 PCM 与已知跟踪器通信,该保护措施是存在的。除此之外,PCM 现在还保护它发出的所有请求,这些请求并非在第一方上下文中与可链接事件发生时间非常接近,即那些不太可能基于时间与最近的未受保护请求匹配的请求。设备 IP 地址通过两跳中继发送请求来隐藏,这确保 Apple 无法看到归因数据等信息。在 WWDC 会议“为 iCloud 私密中继做好准备”中了解有关此技术的更多信息。

PCM 调试模式跳过 IP 地址保护,以便您可以在本地进行测试。

属性名称和数据类型变更

我们关于 PCM 的入门博文也提到,由于正在努力尽可能与 Google 的替代提案 点击归因报告 API 保持一致,命名可能会发生变化。

Safari 15 中的 PCM 命名和数据类型变更如下:

  • 点击目标现在在锚点元素的 attributiondestination 属性中声明(以前是 attributeon)。
  • attributionsourceid 现在是一个无符号长整型,即一个非负整数(以前是字符串)。

这意味着 PCM 链接现在看起来像这样

<a href="…" attributionsourceid=3 attributiondestination="https://shop.example"></a>

功能启用和禁用应无法区分

我们在该领域的持续工作告诉我们,设计广告测量功能时,重要的是要让网站无法判断用户是否启用了该功能,至少在页面渲染时不能。这样做的原因是为了给用户提供真正的选择。如果网页能知道用户选择了禁用广告测量,它可能会迫使用户启用它。我们鼓励该领域的其他浏览器厂商考虑用户自主权的这一重要方面,特别是在多年来努力使网络在没有第三方 cookie 的情况下(作为用户设置或作为默认设置)良好运行的背景下。

常见问题

问题 1:我的触发事件未被接受。我该如何调试?
回答 1:确保对 https://clickSource.example/.well-known/private-click-measurement/trigger-attribution/ 的 HTTP 请求是同站 HTTP 重定向的结果,例如从 clickSource.exampleclickSource.example 的重定向。否则它将不被接受为触发事件。这种要求有两个原因:

  • 支持旧版跟踪像素。通过重定向,点击目标网站无需更改任何内容。
  • 服务器端控制。通过要求服务器端重定向,我们使域名所有者能够控制何时触发事件。如果只是一个 HTTP 请求,目标网站上的任何 JavaScript 都可以触发事件。重定向并非万无一失的系统,但它至少提供了一个控制检查点。

问题 2:我在测试中没有收到归因报告。我该如何调试?
回答 2:归因报告通过 HTTPS 发送给点击来源和点击目标的注册域名。这些域名都需要有有效的 TLS 证书,并且服务器需要接受对知名位置的请求。

问题 3:Apple 是否会为目标网站上的触发事件添加对不可链接令牌的支持?
回答 3:是的,这是我们的意图。

问题 4:这些增强功能是否会在旧版 macOS 上的 Safari 15 中提供?
回答 4:归因报告也发送给点击目标的功能将在 Safari 15 的所有版本中提供。但是,使用不可链接令牌进行点击欺诈预防的功能依赖于仅从 iOS/iPadOS 15 和 macOS Monterey 开始提供的加密功能。