Attribution レベル 1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-attribution-20260708/
最新公開バージョン:
https://www.w3.org/TR/attribution/
編集者草案:
https://w3c.github.io/attribution/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/attribution/
フィードバック:
public-patwg@w3.org 件名行「[attribution] … メッセージのトピック …」で送信(アーカイブ
GitHub
編集者:
(Google)
(Mozilla)
(Meta)
(Meta)
(Google)
(Mozilla)

概要

これは、広告パフォーマンスを測定するためのブラウザー API を定義する。目標は、広告がどのようにコンバージョンにつながるかについて、 個々の Web ユーザーのプライバシーに対するリスクを生じさせることなく、集計統計を生成することである。この API は複数の Web オリジンから人々に関する情報を照合するため、プライバシーに対する重大なリスクとなる可能性がある。このリスクを管理するため、 収集される情報は、厳格な制限内で集計を行うことをユーザーエージェントに信頼された集計サービスを用いて集計される。このサービスが 生成する集計には、差分プライバシーを提供するためにノイズが追加される。Web サイトは、ユーザーエージェントが提供する承認済み 集計サービスのリストから集計サービスを選択できる。

この文書の位置付け

この節は、この文書の公開時点における位置付けを説明する。現在の W3C 出版物およびこの技術報告の最新改訂版の一覧は、 W3C 技術報告索引にある。

本仕様に対するフィードバックおよびコメントを歓迎する。 本仕様に関する議論には GitHub Issues が推奨される。 あるいは、PAT ワーキンググループのメーリングリスト public-patwg@w3.orgアーカイブ)へコメントを送ることもできる。 この草案では、ワーキンググループでまだ議論される予定の保留中の課題の一部を強調している。 これらの課題の結果については、有効であるかどうかも含め、まだ決定されていない。

この文書は、Private Advertising Technology ワーキンググループにより、勧告 トラックを用いた作業草案として公開された。

作業草案としての公開は、 W3C およびそのメンバーによる支持を意味しない。

これは草案文書であり、いつでも他の文書により更新、置換、または廃止される可能性がある。この文書を、 作業中のもの以外として引用することは不適切である。

この文書は維持管理され、随時更新される。この文書の一部は作業中である。

この文書は、W3C 特許ポリシーの下で活動するグループによって作成された。 W3C は、当該グループの成果物に関連して行われた特許開示の公開一覧を維持しており、そのページには特許を開示するための手順も含まれている。 ある個人が、その個人が必須請求項を含むと考える特許について実際の 知識を有する場合、その情報をW3C 特許ポリシーの第 6 節に従って開示しなければならない。

この文書は、2025年8月18日 W3C プロセス文書に準拠する。

1. 導入

この文書は、集約された差分プライバシー付きメトリクスの収集を可能にする、 ブラウザー向けの API を定義する。

この API の目標は、広告のアトリビューションを可能にすることである。

1.1. Attribution

広告における attribution とは、関心対象の結果に先行する行動を 識別し、それらの行動に価値を割り当てる処理である。

広告主が関心を持つ行動は、 主に広告の表示 (インプレッションとも呼ばれる)である。 その他の行動には、広告クリック(またはその他のインタラクション)や、 利用されなかった広告表示の機会が含まれる。

広告における望ましい結果は、 広告主が広告表示を通じて改善しようとする任意の結果を含むため、 より多様である。 望ましい結果は コンバージョンとも呼ばれることがあり、 これは潜在顧客を顧客へと「転換」することを指す。 コンバージョンに該当するものには、 販売、購読、ページ訪問、問い合わせなどが含まれ得る。

この API では、行動結果はいずれも イベント、すなわち一度だけ発生する物事である。 広告における attribution に特有なのは、 これらのイベントが同じサイト上で発生しない場合があることである。 広告は、広告主のサイト以外のサイトで表示されることが最も多い。

attribution における主な課題は、プライバシーを維持することである。 Attribution は異なるサイト上の活動を結び付ける。 attribution の目標は、コンバージョンが発生する前に同じ人物に表示された インプレッションを見つけることである。

attribution 情報が直接明らかにされた場合、 望ましくない コンテキスト横断認識を可能にし、 それによりトラッキングを可能にする。

この文書は、attribution 情報が集計サービスを用いて集計されることを保証することで、 コンテキスト横断認識を回避する。 集計サービスは、各人物がその集計に寄与した値を明らかにすることなく 集計を計算すると信頼される。

各ブラウザーインスタンスが特定のサイトの集計に寄与する情報量には 厳格な制限が設けられる。 差分プライバシーは、各寄与に追加のプライバシー保護を提供するために用いられる。

集計サービスの動作の詳細は § 6 集計 に含まれる。 使用される差分プライバシー設計は § 7 差分プライバシー で概説される。

1.2. 背景

Web の初期から、 広告はサイト作成を財政的に支援するため広く用いられてきた。

Web を他の広告媒体と区別する特徴の一つは、 広告キャンペーンの効果に関する情報を取得できることであった。

Web 広告主は、リーチ(広告を見た人数)、 フリークエンシー(各人が広告を見た頻度)、 およびコンバージョン(広告を見た人のうち、 その後その広告が促そうとしていた行動を取った人数)といった主要なメトリクスを測定できた。 比較すると、これらの測定は他のどの媒体よりもはるかに迅速かつ正確であった。

測定性能の代償はプライバシーであった。 正確で包括的な情報を生成するために、 広告事業者はすべての Web ユーザーの活動を広範に追跡した。 各ブラウザーには追跡識別子が与えられ、 多くの場合、サイト横断コンテンツにより記録される Cookie が用いられた。 関心対象のすべての行動がこの識別子に対して記録され、 個人のオンライン活動に関する包括的な記録が形成された。

個人の行動に関する詳細な記録を持つことで、広告主は人々の特徴を推論できた。 それらの特徴により、広告に適したオーディエンスを選びやすくなり、 その効果が大幅に向上した。 これにより、より多くの情報を収集する強い動機が生じた。

オンライン広告は非常に競争が激しい。 広告を表示するサイトは、各広告枠からできるだけ多くの収益を得ようとする。 広告主は、費用に対して最も効果がある場所に広告を掲載しようとする。 これらの主体—​およびその代理として活動する仲介者—​が得る競争上の優位性は、 潜在的なオーディエンスについてより包括的な情報を持つことに依存する。

時間の経過とともに、関心対象の行動はオンライン活動のほぼあらゆる側面を含むように拡大した。 その情報を Web 外の活動と相関させる方法が考案された。 活発な取引が形成され、 さまざまな目的で取引される個人情報を扱う複数の業者が存在するようになった。

1.3. 目標

この文書の目標は、トラッキングを可能にしない形で広告の attributionを実行する手段を定義することである。

1.4. エンドユーザーの利益

広告パフォーマンスの測定は、サイト横断の新たな情報フローを作り出す。 その情報フローは、コンテキスト横断認識というプライバシーリスクまたはコストを生じさせるため、 エンドユーザーに対する利益の観点から正当化される必要がある。

attributionの使用を通じてエンドユーザーが得る利益は間接的である。

Web サイトを訪問するエンドユーザーは、 そのサイトが表示する広告に対する主として自らの注意を通じて、 「無料」のコンテンツまたはサービスの代価を支払う。 この「価値」は広告主に生じ、 広告主はその対価としてサイトに支払う。 サイトはこの資金を、 コンテンツまたはサービスの提供を支援するために使用することが期待される。

| 広告主 | | | 注意 | | +-------------+ +-----+------+ ^ | | コンテンツと | お金 | サービス | | v .----+------. +------------+ | コンテンツ | | | | 制作 | 投資 | | 利益, | / |<-----------+ Web サイト +-------> | サービス | | | 費用, | 改善 | | | など... '-----------' +------------+ ]]> ユーザー 広告主 注意 コンテンツと お金 サービス コンテンツ 制作 投資 利益, / Web サイト サービス 費用, 改善 など...
広告支援型コンテンツおよびサービスにおける価値交換

attribution 測定システムへの参加は、 Web ユーザーにとって二次的なコストを構成する。

attribution のサポートは、 主としてどの広告がどのような状況で最も効果を発揮するかを広告主に知らせることにより、 より効果的な広告を可能にする。 そのような状況には、 広告が表示された時刻と場所、 広告が提示された人物、 そして広告自体の詳細が含まれ得る。

その情報を結果に結び付けることで、 広告主は、自らが最も重視する結果に最も頻繁につながる状況を知ることができる。 これにより、広告主は効果的な広告により多く支出し、 効果の低い広告への支出を減らすことができる。 これにより、得られる価値に対する広告の総費用が低下する。 [ONLINE-ADVERTISING]

コンテンツ出版社やサービス提供者など、広告在庫を提供するサイトは、 より効率的な広告から間接的に利益を得る。 広告主が求める結果につながる広告をより適切に表示できる広告媒体は、 広告枠に対してより高い料金を請求できる。

広告の掲載を通じて支援を得るサイトは、 質の高いコンテンツまたはサービスをよりよく提供できる。 重要なのは、その支援がオーディエンスから不均等に得られることである。 これは、他の形態の財政的支援よりも公平であり得る。 広告対象の商品に支出する傾向または能力が低い人々も、 支払う余裕のある人々と同じ広告支援型コンテンツおよびサービスを利用できる。 [EU-AD][COPPACALYPSE]

広告に支えられた「無料」サービスを提供する能力には、 それらのサービスの価値に由来する測定可能な経済的利益がある。 [FREE-GDP]

1.5. 集合的プライバシー効果

集計の使用は、適切に実装されている場合、サイトに提供される情報が個人ではなくグループに関するものとなることを保証する。

したがって、この機構の導入は、集合的プライバシーの考え方に沿った、集合的意思決定を表す。

attribution 測定への参加は、 参加するグループが大きいほどプライバシーコストが低くなる。 これは、集計が、 サイトが集計から個人に関する情報を抽出する能力に与える影響による。 これは特に、この仕様で使用されるプライバシー設計の数学的基盤である 中央型差分プライバシーに当てはまる。

参加者のより大きなコホートは、測定されている広告について、 より代表性が高く、したがってより有用な統計も生成する。

attribution が正当化される場合、 これら二つの要因はいずれも、すべてのユーザーに対して attribution を有効にする動機となる。

ユーザーエージェントが attribution 測定を有効にすることは、 一部の人々には好意的に受け止められない。 広告に関与することで生じるコストと利益の受け止め方は、人によって異なる。 提案されている設計では、人々がその選択をサイトに明らかにすることなく attribution に参加しているように見せる選択肢を可能にしている。§ 9.2 Attribution API の無効化を参照。

1.6. ヒストグラムを用いた Attribution

Attribution は、 一つ以上の広告掲載(インプレッション)と、 広告主が望む結果との相関を測定しようとする。

集計として考える場合、 個人に関する情報は有用ではない。 行動と結果はグループ化される必要がある。

attribution の最も単純な形式は、 広告の属性に従ってインプレッションをいくつかのグループに分割し、 コンバージョン数を数える。 グループは、広告が表示された場所、 表示された内容(「クリエイティブ」)、 広告が表示された時刻、 または誰に表示されたかといった属性から形成され得る。

これらのグループ化と、 それぞれに attribution されたコンバージョンの集計が ヒストグラムを形成する。 ヒストグラムの各バケットは、 広告グループのコンバージョンを数える。

example.com news.example classified.example search.example
インプレッションが表示されたサイト別にグループ化された、 コンバージョン数のサンプルヒストグラム

異なる目的には異なるグループ化が用いられ得る。 たとえば、クリエイティブ(広告の内容)によるグループ化は、 どのクリエイティブが最も効果的かを知るために用いられ得る。

各コンバージョンで 1 より大きい値を追加すると、 単なる件数以上のものが可能になる。 ヒストグラムは値も集計でき、 これは異なる結果を区別するために用いられ得る。 インプレッションに割り当てられる値は、 コンバージョン 値と呼ばれる。 より高いコンバージョン値は、より大きな購入や、 より高く評価される任意の結果に用いられ得る。 コンバージョン値は、信用を分割するために複数のインプレッション間で分割されることもある。

2. 動作の概要

Attribution API は、 インプレッションコンバージョンという二つのイベントクラス間の関連について、 集計情報を提供する。

インプレッションとは、 広告主が任意の Web サイト上で行う任意の行動である。 API は、何をインプレッションとして記録できるかを制約しない。 広告主が測定しようとする典型的な行動には、次のものが含まれる。

API において、コンバージョンは、 測定対象となる結果である。 API は、何が結果と見なされ得るかを制約しない。 広告主が測定しようとする典型的な結果には、次のものが含まれる。

この節の残りでは、 Attribution API が集計サービスと連携して 集計 attribution 測定を生成する方法を説明する。 その動作は次の図に示される。

| | | 広告主 | | 集計 | | サーバー | | サービス | | |<-----------+ | +--------------+ ヒストグラム +-------------+ ^ ^ ^ コンバージョン | | | レポート | | '-----------. | '-----------. | | | | +-------------+-+-+ +---------+----+ | | | | | | | | 他のユーザー | パブリッシャー | | | | 広告主 | | サイト | | | | サイト | | | | | | | +------+------+-+-+ +-----+--------+ | | ^ saveImpression | measureConversion | | コンバージョン | | | レポート v v | +-------------------------------------+---------+ | | | Private Attribution API | | | +-----------------------------------------------+ ^ | v .-----------. | | | インプレッション | | ストア | | | '-----------' ]]> コンバージョン レポート 広告主 集計 サーバー サービス ヒストグラム コンバージョン レポート 他のユーザー パブリッシャー 広告主 サイト サイト saveImpression measureConversion コンバージョン レポート Private Attribution API インプレッション ストア
Attribution 動作の概要

2.1. インプレッションの記録

インプレッションが発生すると、 saveImpression() メソッドを使用して、 ブラウザーに情報の保存を要求できる。 これには、インプレッションの識別子と、 インプレッションについての追加情報が含まれる。 たとえば、広告主は追加情報を使用して、 インプレッションが広告ビューであったか広告クリックであったかを記録する可能性がある。

2.2. コンバージョンまたはインプレッションの照会

コンバージョン時に、コンバージョンレポートが 作成される。 コンバージョンレポートは、 ブラウザーが以前に保存した任意のインプレッションからの情報を含む、 暗号化されたヒストグラム寄与である。

measureConversion() メソッドは、 コンバージョンレポートを構築する方法をブラウザーに伝えるために使用される、 制限付きクエリを受け入れる。 これには、ブラウザーが保存したインプレッションから選択する値、 選択されたインプレッションに割り当てられるコンバージョン値、 およびコンバージョンレポートを構築するために必要なその他の情報が含まれる。

コンバージョンレポートにより作成されるヒストグラムは、次のように構築される。

ブラウザーは、報告されたコンバージョンを反映するようにプライバシー予算ストアを更新する。

結果のヒストグラムは、選択された集計サービスの要件に従って集計用に準備され、サイトに返される。 これには少なくともヒストグラムの暗号化が含まれる。

この API を呼び出すサイトは、常に有効なコンバージョンレポートを受け取る。 その結果、サイトはこのインタラクションから他のサイトで何が起きたかについて何も知ることがない。

2.3. 集計

サイトは、この API の呼び出しから受け取る暗号化されたヒストグラムを収集し、 それらを集計サービスに送信できる。

サイトから暗号化されたヒストグラムの集合を受け取ると、集計サービスは次のことを行う。

  1. 提供された入力から以前に集計を 計算していないこと、 および十分な数のコンバージョンレポートがあることを 確認し、

  2. 十分な ノイズ を含めてヒストグラムを加算し、 差分プライバシー性を持つ集計ヒストグラムを生成し、

  3. その集計をサイトに返す。

集計サービスの最終出力を、アトリビューション結果と呼ぶ。

ブラウザー実装は、上記の機能を確実に実行すると信頼される 集計サービスの集合を持つ必要がある。 提供されるサービスの集合の中から、 コンバージョンサイトは、 集計を実行するサービスの選択について 合意に達する必要がある。

ブラウザーは、集計サービスを登録するためのプログラムを確立するかもしれない。 これは、ブラウザーが Web PKI 証明書の 検証に使用する認証局を認可するために用いられる ルートストアプログラム と 性質が似ている。 そのようなプログラムの確立は、 この文書の範囲外である。

3. API の使用

Attribution API を使用するサイトは、通常、 インプレッションまたはコンバージョンのいずれかを登録するが、 場合によっては同じサイトが 両方を行うこともある。

インプレッションを登録するには、サイトは saveImpression() を呼び出す。この API を使用するために、 パラメーター値を収集する以外の準備は必要ないが、 Attribution API を使用するかどうかを判断する際に、サポートされている aggregationServices を調べることは有用な場合がある。

ユーザーエージェントにリソースを提供する際、HTTP レスポンスに `Save-Impression` ヘッダーを含めることによってインプレッションを登録することも可能である。

コンバージョンレポートを要求するには、サイトは measureConversion() を呼び出す。 この API を呼び出す前に、サイトはサポートされている集計サービスを選択しなければならない。 ページは、 aggregationServices にあるサポート済みサービスのいずれかを選択できる。 選択されたサービスの名前は、 measureConversion() メソッドを呼び出す際に、 AttributionConversionOptions 辞書の aggregationService メンバーとして指定しなければならない。

3.1. サイト識別子

この API は、動作の主なスコープとして、HTML におけるサイトの定義に依存する。 三種類のサイトが認識される。

この API はオリジンではなくサイトを使用する。 これは、プライバシー上の影響を持ち得るすべての活動を単一の主体に関連付けることに依存しているためである。 Cookie のような機能は、プライバシーに関連する情報を同一サイトオリジン間で自由に交換できるようにし、 それがなければプライバシー予算を超過するために使用され得る。

この API のすべての機能は、 navigator.attribution 属性に接続される。

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Attribution attribution;
};

これは三つの主要な機能を提供する。

3.3. サポートされる集計サービスの検索

aggregationServices 属性は、 ユーザーエージェントがサポートする集計サービスの集合を含む。 ページは、 measureConversion() メソッドを呼び出す際に、 これらのサービスの一つを選択して指定しなければならない。 インプレッションを登録する前にサポートされるサービスを照会することも有用な場合があるが、 これは必須ではなく、 インプレッションは単一の集計サービスにスコープされない。

サイトには、使用する集計サービスについて優先順位がある場合がある。 次のコードは優先リストを反復処理し、 ユーザーエージェントがサポートするものを見つける。

const preferredServices = [
  "https://aggregator.example/tee",
  "https://aggregator.example/dap",
  "https://example.com/aggregator",
];
const supportedServices = navigator.attribution?.aggregationServices;
const serviceUrl = preferredServices.find(url => supportedServices?.has(url));

ユーザーエージェントがその URL をサポートし、 かつそれが優先サービスの一つを含む場合、 最初の優先サービスが serviceUrl という名前の変数に保存される。 それ以外の場合、serviceUrlundefined のままとなる。

enum AttributionAggregationProtocol { "dap-18-histogram" };

dictionary AttributionAggregationService {
  required AttributionAggregationProtocol protocol;
};

[SecureContext, Exposed=Window]
interface AttributionAggregationServices {
  readonly maplike<USVString, AttributionAggregationService>;
};

[SecureContext, Exposed=Window]
interface Attribution {
  readonly attribute AttributionAggregationServices aggregationServices;
};

aggregationServices 属性は、 集計サービスを識別する URL から、 そのサービスに関するメタデータへのマッピングである。

protocol, 型は AttributionAggregationProtocol
集計サービスが使用する protocol。 同じプロトコルの異なるバージョンは異なる値を使用する。 単一のサービスプロバイダーが複数のプロトコルをサポートする場合であっても、 それぞれは異なる URL を使用する必要がある。 これにより、プロトコルの選択も指定することなく、 各サービスを URL により一意に識別できることが保証される。

識別された集計サービスを選択するために、 URL は measureConversion() への aggregationService パラメーターとして渡される。

AttributionAggregationProtocol は、異なる 集計サービスで使用される 送信プロトコルを記述する。この文書は 1 つのプロトコルを定義する:

dap-18-histogram
MPC を使用する DAP ベースのプロトコル [DAP]§ 6.1 マルチパーティ 計算集約を参照。

3.4. インプレッションの保存

saveImpression() メソッドは、 ユーザーエージェントに、インプレッションインプレッションストアに記録するよう要求する。

広告主の広告を表示するサイトは、 インプレッションを保存できる。

この場合、サイトはインプレッションを直接保存し、 広告主(advertiser.example)を識別し、 広告主によって取り決められた情報を含める。 次の例では、 これには、広告主が後でこの広告を選択するために使用する可能性のある matchValue 値(2)、 attribution された値を含める先のヒストグラムのインデックス(histogramIndex = 3)、 および広告主が必要とする期間以上の保持期間(lifetimeDays = 7) が含まれる。

navigator.attribution.saveImpression({
  histogramIndex: 3,
  matchValue: 2,
  conversionSites: ["advertiser.example"],
  lifetimeDays: 7,
});

あるいは、Supply-Side Platform(SSP)や Demand-Side Platform(DSP)などの仲介者が、 iframe から同じ API を呼び出す場合がある。 フレームから同じ API 呼び出しを行うと、 仲介サイトの識別子がインプレッションとともに保存される。

dictionary AttributionImpressionOptions {
  required unsigned long histogramIndex;
  unsigned long matchValue = 0;
  sequence<USVString> conversionSites = [];
  sequence<USVString> conversionCallers = [];
  unsigned long lifetimeDays = 30;
  long priority = 0;
};

dictionary AttributionImpressionResult {
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionImpressionResult> saveImpression(AttributionImpressionOptions options);
};

saveImpression() への引数は次のとおりである。

histogramIndex, 型は unsigned long
measureConversion() がこの インプレッションを後続の コンバージョンと照合した場合、コンバージョン値は このインデックスで識別されるヒストグラムバケットに加算される。
matchValue, 型は unsigned long、既定値は 0
インプレッションに関連付けられた任意のメタデータ片。この値は、 どのインプレッションが コンバージョンから アトリビューションを受け取る可能性があるかを識別するために使用できる。
conversionSites, 型は sequence<USVString>、既定値は []
このインプレッションに対するコンバージョンが 発生し得るトップレベルの コンバージョン サイトであり、 それらのドメイン名によって識別される。 measureConversion() メソッドは、 示されたサイトの 1 つによって呼び出された場合にのみ、このインプレッションに帰属させる。 空である場合、任意の コンバージョン サイトが照合する。
conversionCallers, 型は sequence<USVString>、 既定値は []
コンバージョンのために このインプレッションを選択できる 仲介 サイトまたは コンバージョンサイトであり、 それらのドメイン名によって識別される。 measureConversion() メソッドは、 示されたサイトの 1 つによって呼び出された場合にのみ、このインプレッションに帰属させる。 このオプションには、コンバージョンサイト仲介サイトの両方が含まれる。 空である場合、API を呼び出す任意のサイトが照合する。
lifetimeDays, 型は unsigned long、既定値は 30
正の「time to live」(日数)であり、この期間の後はインプレッションは もはやアトリビューションを受け取れなくなる。 ユーザーエージェントは有効期間に上限を課すべきであり、 ここで指定された値がその上限を超える場合は、その値を暗黙的に減らすべきである。
priority, 型は long、既定値は 0
アトリビューション中にインプレッションを並べ替えるために使用される整数。

3.5. コンバージョンに対する Attribution の要求

measureConversion() メソッドは、 ユーザーエージェントに、コンバージョンに対してattributionを実行し、 コンバージョン レポートを返すよう要求する。

measureConversion() メソッドは、 一致するインプレッションが見つかるかどうかに関係なく、 常にコンバージョンレポートを返す。 一致がない場合、または差分プライバシーが attribution の報告を許可しない場合、返されるコンバージョンレポートは ヒストグラムに寄与しない、すなわち一様にゼロとなる。

コンバージョンを観測したサイトは、 異なる保存済みインプレッションの効果の測定を 要求することを選択する場合がある。

暗号化された測定の作成を要求するために、 サイトは measureConversion() メソッドを呼び出す。

この関数は四つの異なる種類の入力を受け取る。

  1. 選択された集計サービス。 これは URL を使用して識別される。 集計サービスを選択するための例の手順は、 ブラウザーがサポートするサービスを選択する方法を示している。

    const serviceDetails = {
      aggregationService: serviceUrl,
    };
    
  2. 集計測定の詳細。 これらの値は、複数のブラウザーにわたる API のすべての呼び出しで一貫している。 これには、ヒストグラムのサイズと、 費やされる可能性のあるプライバシー予算の量が含まれる。

    const aggregatedMeasurementDetails = {
      histogramSize: 20,
      epsilon: 1,
    };
    
  3. 考慮するインプレッションを選択する、 すべて任意の属性の集合。 これには、インプレッションがどれだけ古くてもよいか (lookbackDays)、 インプレッションを保存した可能性のあるインプレッション サイトimpressionSites)、 インプレッションを保存した可能性のある仲介サイトimpressionCallers)、 および matchValues の選択が含まれる。

    const selectionDetails = {
      lookbackDays: 14,
      impressionSites: ["publisher.example", "other.example"],
      impressionCallers: ["ad-tech.example"],
      matchValues: [2],
    };
    
  4. attribution ロジックのパラメーター。

    const attributionDetails = {
      // top impression's histogram index gets 50% of value, the next two 25% each
      credit: [.5, .25, .25],
      value: 3,
      maxValue: 7,
    };
    

これらの値が決定されたら、 サイトは API を呼び出して、暗号化されたコンバージョンレポートを取得する。

const measurement = await navigator.attribution.measureConversion({
  ...serviceDetails,
  ...aggregatedMeasurementDetails,
  ...selectionDetails,
  ...attributionDetails,
});
sendReportToServer(measurement.report);

このレポートは、 このブラウザーおよび他のブラウザーからの他のレポートとともに 収集できる。 収集されたレポートはすべて集計サービスに提出して、 集計ヒストグラムを取得できる。

dictionary AttributionConversionOptions {
  required USVString aggregationService;
  double epsilon = 1.0;

  required unsigned long histogramSize;

  unsigned long lookbackDays;
  sequence<unsigned long> matchValues = [];
  sequence<USVString> impressionSites = [];
  sequence<USVString> impressionCallers = [];

  sequence<double> credit;
  unsigned long value = 1;
  unsigned long maxValue = 1;
};

dictionary AttributionConversionResult {
  required Uint8Array report;
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionConversionResult> measureConversion(AttributionConversionOptions options);
};

measureConversion() への引数は次のとおりである。

aggregationService, 型は USVString
aggregationServices に見つけられる 集計サービスからの選択。
epsilon, 型は double、既定値は 1.0
この コンバージョンレポートに費やす プライバシー バジェットの量。
histogramSize, 型は unsigned long
コンバージョンレポートで使用するヒストグラムバケットの数。
lookbackDays, 型は unsigned long
正の整数の日数。過去 lookbackDays 内に発生したインプレッションのみが、 この コンバージョンと照合し得る。省略 された場合、最大ルックバックと同等である。
matchValues, 型は sequence<unsigned long>、既定値は []
集合であり、 インプレッションを選択するために使用できる match value の集合。
impressionSites, 型は sequence<USVString>、既定値は []
インプレッションサイトの 集合インプレッションサイトが この集合内にある場所で記録された インプレッションのみが、 この コンバージョンと照合する資格を持つ。 空である場合、任意のサイトが照合する。
impressionCallers, 型は sequence<USVString>、既定値は []
saveImpression() API を呼び出した可能性のある、 集合の サイトであり、 インプレッションサイト仲介 サイトの両方を含む。 空でない場合、 listed sites の 1 つによって記録された インプレッションのみが、 この コンバージョンと照合する資格を持つ。
value, 型は unsigned long、既定値は 1
コンバージョン 値。アトリビューションが行われ、かつ プライバシー 制限が満たされる場合、この値は コンバージョンレポートにエンコードされる。
maxValue, 型は unsigned long、既定値は 1
集計に含まれるすべての貢献にわたる最大の コンバージョン 値。 epsilon とともに、結果に追加されるランダムノイズの分布を較正するために使用される。 また、この コンバージョンレポートに費やす プライバシーバジェットの量を 決定するためにも使用される。
credit, 型は sequence<double>
複数のインプレッションにわたってコンバージョン値がどのように配分されるかを記述する、 有限の正の数の リスト。 値は、指定された順序で、 リスト内の値に比例して、選択されたインプレッションのリスト全体に分割される。 選択されたインプレッションの数がこのリスト内の値より少ない場合、 このリスト内の追加項目は無視される。 存在しない場合、コンバージョン値は 1 つのインプレッションに割り当てられる。

3.6. 仲介者の役割

この API は、仲介者トップレベルサイトに代わって 動作することをサポートしている。 広告は、掲載、入札、および測定を担当する独立した事業者に委任されることが多い。

仲介者によって保存されるインプレッションは、 仲介サイトの識別子を記録する。 コンバージョン測定のために インプレッションを選択する際、 仲介サイト 識別子を使用してインプレッションを選択できる。

3.7. ヒストグラム構築

概念的には、保存された各インプレッションは、 単一のヒストグラム定義を持つ。 各インプレッションは、 そのインプレッションに割り当てられる 結果のヒストグラムのどこに現れるかを決定する、単一のHistogram Index 属性を持つ。

したがって、measureConversion() の各呼び出しは、同じヒストグラム定義を持つインプレッションを選択する必要がある。 これは API のすべての使用に適用されるが、 ヒストグラムの一貫した定義は、インプレッションが 複数の仲介者によって保存され、 測定される場合に特に重要である。

measureConversion() の呼び出し時に選択され得る すべてのインプレッションは、 同じヒストグラム定義を使用する必要がある。 API は、適切なインプレッションだけが選ばれることを保証するための いくつかの手段を提供する。

保存されたインプレッションについては、次のとおりである。

コンバージョン時点の共通 照合ロジックの一部として、次のとおりである。

これらのオプションは、attribution がヒストグラムを選択する方法についてサイトに柔軟性を提供する。 これは、コンバージョンサイトによる異なるヒストグラムの使用を妨げない。 複数のインプレッションは、 measureConversion() の呼び出しが、 異なるヒストグラム定義を持つインプレッションを 決して選択しない限り、 異なるヒストグラム定義とともに保存できる。 これにより、measureConversion() を複数回呼び出すことで、 コンバージョンを複数のヒストグラムに attribution できることが保証される。

3.8. Permissions Policy 統合

仲介者へ委任する能力は、 Permission Policyによって制御される。

この仕様は二つのポリシー制御機能を定義する。

これら両方の機能に対するデフォルト許可リスト* である。

saveImpression()measureConversion() に別々の権限を持たせることで、両方を行うページは、 サブリソースを想定される種類の活動に制限できる。

デフォルトで権限を有効にすることで、 外部サービスを統合する作業が簡素化される。

Permissions policy は、全か無かの制御のみを提供する。 プライバシー予算の一部を委任することは可能にしない。

4. API 内部構造

4.1. インプレッションストア

インプレッションストアは、 measureConversion() メソッドによって、一致する インプレッションを見つけるために使用される。

この API はサイトによるデータの保存を可能にするが、 インプレッションストアストレージキーを使用しない。

4.1.1. 内容

インプレッションストアは、 集合であり、インプレッションからなる。

Match Value: saveImpression() に渡された matchValue
Impression Site: saveImpression() が呼び出された インプレッション サイト
Intermediary Site: saveImpression() を呼び出した仲介サイト、 または API がインプレッションサイトによって呼び出された場合は undefined
Conversion Sites: saveImpression() に渡された コンバージョンサイト集合
Conversion Callers: measureConversion() を呼び出す際に、 このインプレッションを選択できるサイト、すなわち コンバージョンサイトまたは仲介サイト集合
タイムスタンプ: saveImpression() が呼び出された時刻。
有効期間: インプレッションが attribution の対象として残る期間saveImpression() の呼び出しによるもの、 またはユーザーエージェント定義の制限によるもの。
Histogram Index: saveImpression() に渡されたヒストグラムインデックス。
優先度: attribution 中にインプレッションをソートするために使用される整数。

4.1.2. 保守

ユーザー エージェントは、 タイムスタンプおよび 有効期間の値を 定期的に使用し、インプレッションストア内の、期限切れとなったインプレッションを識別して削除すべきである。

measureConversion() が、期限切れのインプレッションattributionから 除外する限り、 インプレッションを期限切れと同時に削除する必要はない。 しかし、 ユーザー エージェントは期限切れのインプレッションを無期限に保持すべきではない。

4.1.3. Clear-Site-Data 統合

`Clear-Site-Data` フィールド [CLEAR-SITE-DATA] は、 サイトに対し、ユーザーエージェントによって維持される状態を削除する能力を与える。 `"impressions"` 型は、 Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field で定義される、認識される型の一覧に追加される。

レスポンスについてサイトデータを消去する アルゴリズムが呼び出された場合、 型のリストが `"impressions"` を含むなら、 サイトについてインプレッションを消去するが呼び出され、 origin を渡す。

origin origin を与えられ、 サイトについて インプレッションを消去するには、 次の手順を実行する。
  1. originタプルオリジンでない場合、戻る。

  2. originhost 部分を渡して、 登録可能ドメインを取得するを呼び出すことで返される値を site とする。

  3. インプレッション ストアの各インプレッション impression について反復する

    1. impressionIntermediary Siteundefined であり、 そのImpression Sitesite と等しい場合、 remove impression from the インプレッションストア and continue.

    2. impressionsite と等しいIntermediary Siteを持つ場合、 remove impression from the インプレッションストア and continue.

    3. impressionConversion Sitessite含む場合:

      1. impressionConversion Sitesから site削除する

      2. impressionConversion Sites空である場合、 impressionインプレッションストアから削除して、 continue

    4. impressionConversion Callerssite含む場合:

      1. impressionConversion Callersから site削除する

      2. impressionConversion Callers空である場合、 impressionインプレッションストアから削除して、 continue

この処理は、 空の集合Conversion Sitesで保存されたインプレッションを削除しない。

4.1.4. サイト名

インプレッションストアは、 三種類のサイトに関する情報を保存する。 インプレッションサイト、 任意の仲介サイト、 およびコンバージョンサイト集合である。

これらのサイトはすべて、 "https" のスキームを持つ scheme-and-host 形式でなければならない。 これは、hostの 単純な文字列シリアライズが、サイトを識別するのに十分であることを意味する。 したがって API は、単純な文字列を使用して サイトを表すことができる。

実装が内部的に、タプルのhost 部分だけを使用してサイトを表すことも可能である。

文字列 input を与えられ、 siteまたは失敗を返す サイトを解析するには、 次の手順を実行する。
  1. host を、input を渡してホストパーサーを呼び出すことにより返される値とする。

  2. host が failure である場合、failure を返す。

  3. site を、host を渡して登録可能ドメインを取得するにより返される値とする。

  4. site が null である場合、failure を返す。

  5. site が "localhost" である場合、または site が ".localhost" で終わる場合、 failure を返す。

  6. ("https", site) のscheme-and-host タプルを返す。

このアルゴリズムは、登録可能ドメインよりも多くの ドメインラベルを含む文字列からも、 site を正常に生成する。 たとえば、"extra.example.com" は "example.com" として解析される。

このアルゴリズムは localhost ドメイン [RFC6761] を受け入れない。 そのため、サイト名の抽出に依存する任意のアルゴリズムは、 localhost ドメインが言及された場合、 または現在のサイト(トップレベルまたはフレーム内)が localhost ドメインである場合に失敗する。 これは、テストおよび開発にローカルサーバーを使用することを困難にする可能性がある。 実装は、テストおよび開発を支援するために localhost チェックを無効化する設定を提供してもよい。

4.2. プライバシー予算管理のための状態

ユーザー エージェントは、 プライバシー予算の消費を管理するために使用される、いくつかの状態を維持する。

プライバシー予算 ストアグローバルプライバシー予算ストア、 およびインプレッションサイトクォータストアは、 プライバシーおよび安全予算を控除するによって更新される。

インプレッション ストアと同様に、 プライバシー予算 ストアおよび関連ストアはストレージキーを使用しない。 これらのストアには、情報の消去方法に関する追加の制約がある。 詳細は § 9.7 API 状態の消去 を参照。

attribution budget lock を真偽値フラグとして定義する選択は、 仕様上の便宜によるものである。 実装には代替構造の方が適している可能性がある。 実装は、競合の範囲を狭めるために、 エポックごとなどにこの値を分割できる可能性がある。

4.2.1. プライバシー予算ストア

プライバシー予算キーは、 次の項目からなるタプルである。

エポックインデックス

エポックインデックス

サイト

サイト

プライバシー予算 ストアは、キーが プライバシー予算キーであり、 値が32 ビット符号なし整数であるマップである。 これらの整数は、 microepsilon単位の値を格納する。 microepsilonは、 差分プライバシー [DP] で使用される 単位 epsilon 値の 100 万分の 1 である。

32 ビット整数の選択は、epsilon の設定を 最大 epsilon 4294 以下に制限する。 これは実装にとって十分すぎるはずである。

グローバル プライバシー予算ストアは、キーが エポックインデックスであり、値が 32 ビット符号なし整数であるマップであり、 microepsilon単位である。

グローバルプライバシー予算ストアは、 すべてのサイトにまたがって適用され、 各エポックで更新される単一の プライバシー予算の消費を追跡する。 これは、同じ人物の活動を複数のサイトにまたがって相関させることができる 敵対者に対する安全制限を提供する。

サイトごとのプライバシー予算ストアとは異なり、 グローバルプライバシー予算ストアエポックインデックスのみによってキー付けされ、 サイトによってはキー付けされない。

インプレッション サイトクォータストアは、キーが プライバシー予算キーであり、 値が32 ビット符号なし整数であるマップであり、 microepsilon単位である。

インプレッションサイトクォータストアは、 単一のインプレッション サイトが一つのエポックで寄与できる「在庫」 (インプレッションに関連するプライバシー予算)の量を制限する。 これは、単一のインプレッションサイトが、 悪意をもって引き起こされ得るグローバル制限から過剰な量を消費することを防ぐ。

プライバシー予算キー key集合であるインプレッション impressionsdouble epsilon、 整数 value、 整数 maxValue、 真偽値 isSingleEpoch、 整数 l1Norm集合であるプライバシー予算キー deductedImpressionQuotas および集合であるエポック・インデックス deductedGlobalBudgets が与えられたとき、プライバシーおよび安全性予算を控除するには、次を実行する:
  1. l1NormSensitivity を、isSingleEpoch の場合は l1Norm、 そうでなければ 2 * value とする。

  2. valueSensitivity を 2 * value とする。

  3. noiseScale を 2 * maxValue / epsilon とする。

  4. l1NormDeductionFpl1NormSensitivity / noiseScale とする。

  5. valueDeductionFpvalueSensitivity / noiseScale とする。

    単一エポックのアトリビューションは、 エポックをまたぐ連鎖的な影響を一切生じさせない。 複数のエポックを伴うアトリビューションは、1 つの変更が エポックをまたいでアトリビューションに影響する可能性があるため、 予算を 2 倍消費する。 控除を 2 倍にすることは、 maxValue / epsilon に比例するラプラスノイズが 集約ヒストグラムに追加されることを前提としている。

  6. l1NormDeductionl1NormDeductionFp * 1000000 とし、 正の無限大方向に丸める。

  7. valueDeductionvalueDeductionFp * 1000000 とし、正の無限大方向に 丸める。

  8. アトリビューション予算ロックが true である場合、 その値が false になるまで待機し、 その後、その値を true に設定する。

  9. deduction を、isSingleEpoch が true の場合は l1NormDeduction、 そうでなければ valueDeduction とする。

  10. keydeductionvalueDeduction、および impressions を指定して 利用可能なプライバシー予算を確認することを呼び出した結果が false である場合、次の手順を実行する:

    1. アトリビューション予算ロックを false に設定する。

    2. false を返す。

  11. すべての予算確認に合格したので、控除を実行する:

    1. currentValue を、値を取得することにより、 プライバシー予算ストア 内の key の値を取得した結果とし、デフォルトをサイトごとのプライバシー予算とする。

    2. 設定することにより、プライバシー予算ストア内の key の値を currentValuededuction に設定する。

    3. epoch を、keyエポック・インデックス成分とする。

    4. deductedGlobalBudgetsepoch含まない場合、 deductedGlobalBudgetsepoch付加し、グローバル・プライバシー予算 ストア[epoch] を valueDeduction だけ減少させる。

    5. impressions 内の各 impression について、 次を実行する

      1. impressionSite を、impressionインプレッション・サイトとする。

      2. impressionQuotaKey を、項目が epoch および impressionSite であるプライバシー予算 キーとする。

        以下は、同じサイトに対して複数のインプレッションがある場合に、 同じインプレッション・サイト割当量から 予算を複数回控除しないことを保証する。

      3. deductedImpressionQuotasimpressionQuotaKey含まない場合:

        1. deductedImpressionQuotasimpressionQuotaKey付加する。

        2. currentImpressionQuotaValue を、値を取得することにより、 エポックごとのインプレッション・サイト割当量 内の impressionQuotaKey の値を取得した結果とし、デフォルトをエポックごとのインプレッション・サイト割当量 とする。

        3. 設定することにより、エポックごとのインプレッション・サイト割当量[impressionQuotaKey\] の値を currentImpressionQuotaValuevalueDeduction に設定する。

  12. アトリビューション予算ロックを false に設定する。

  13. true を返す。

プライバシー予算 キー key、整数 deduction、 整数 valueDeduction、 および集合であるインプレッション impressions が与えられたとき、利用可能なプライバシー予算を確認するには、次を実行する:
  1. currentValue を、値を取得することにより、 プライバシー予算ストアから key の値を取得した値に設定し、 デフォルトをサイトごとのプライバシー予算とする。

  2. deductioncurrentValue より大きい場合、false を返す。

  3. epoch を、keyエポック・インデックス成分とする。

  4. currentGlobalValue を、値を取得することにより、 グローバル・プライバシー予算ストアから epoch の値を取得した値に設定し、 デフォルトをエポックごとのグローバル・プライバシー予算とする。

  5. valueDeductioncurrentGlobalValue より大きい場合、false を返す。

  6. impressions 内の各 impression について、次を実行する

    1. impressionSite を、impressionインプレッション・サイトとする。

    2. impressionQuotaKey を、項目が epoch および impressionSite であるプライバシー予算キー とする。

    3. currentImpressionQuotaValue を、値を取得することにより、 インプレッション・サイト割当量ストアから impressionQuotaKey の値を取得した値に設定し、デフォルトを エポックごとのインプレッション・サイト割当量 とする。

    4. valueDeductioncurrentImpressionQuotaValue より大きい場合、 false を返す。

  7. true を返す。

4.2.2. Attribution API の有効化

The Attribution API は、一時的アクティベーション消費 APIを おおよそのモデルとしている。 そこでは、ユーザーアクティベーションが 一時的に API を利用可能にする。 いくつかの違いにより、この設計は 一時的アクティベーション消費 APIと区別される:

これは効果として、広く一時的アクティベーションに似ている。 しかし、attribution activation は一時的アクティベーションとは別個の状態を使用し、 その状態は異なる方法で追跡される。 Attribution activation 状態は、影響を受ける Window ではなく、 トップレベル traversable上で追跡される。 その結果、attribution activation はナビゲーションをまたいで持続し、 アクティベーションがナビゲーションにつながる場合に、 新しいページの読み込み後の短い期間、 API の使用を可能にする。

別個の状態を持つことで、 attribution activation が一時的アクティベーション消費 APIと相互作用しないことが保証される。 アクティベーションを消費する API は、 Attribution API が利用可能になることを妨げない。 同様に、Attribution API を使用しても、 一時的アクティベーション消費 APIが利用可能になることを妨げない。

別個の状態追跡により、ユーザーアクティベーションを消費するユーザー操作を、 Attribution API により独立して測定できることが保証される。

ナビゲーションをまたいでアクティベーションを保持することで、広告における一般的なパターンが可能になる。 サイトは Attribution API を使用して、 インタラクションが発生した site から、 または後続の site 上で、 アクションを調べることができる。

これを実装するために、 各トップレベル traversableは、Attribution API について 2 つの状態を追跡する:

  1. attribution enabled flag は、API が有効であるかどうかを追跡する boolean 値である。 この値は false に初期化される。

  2. attribution activation timestamp は、 最後のユーザーアクティベーションを追跡する momentである。 この値はunix epochに初期化される。

実装は、attribution activation duration も、 実装定義durationとして設定する。 これは一時的アクティベーション期間以上であるべきだが、 ナビゲーションによる遅延が Attribution API をアクセス不能にしないことを保証するため、 より大きな値が望ましい場合がある。

実装は、ナビゲーション中にページ内容を読み込む際に伴う遅延を考慮して、 許可される時間を延長することを選択してもよい。 固定値では、デバイスやネットワークにおける パフォーマンスの違いを考慮できない可能性がある。 実装は、パフォーマンス特性の理解に基づいて、 アトリビューション活性化期間 の値を延長してもよい。 あるいは、実装はページ読み込み中に 任意のタイマーを一時停止してもよい。

ユーザー操作により、Document document 内でアクティベーションを引き起こす入力イベントが発火する場合、 ユーザーエージェントは、イベントを配送する前に、 アクティベーション通知手順に加えて、以下の手順を 実行しなければならない。 この場合、navigable navigable を null に設定する。

あるいは、ナビゲーションが開始するとき、 ユーザーナビゲーション関与"browser UI" である場合、 navigable を影響を受けるnavigableに設定し、 document を null に設定して、 以下の手順を実行する。

手順は次のとおりである:

  1. navigable が null でない場合、nnavigable とする。

  2. そうでなければ、n を、documentノード navigableを取得した結果とする。

  3. top を、nトップレベル traversableを取得した結果とする。

  4. topattribution activation timestamp現在の高解像度時刻に設定する。

トップレベル traversable top が、ナビゲートされるとき、 navigate アルゴリズムの一部として、 document state documentState が確定された後、 かつresponseorigin responseOrigin が既知になった後、 次の手順を実行する:
  1. documentStateinitiator originresponseOriginsame siteである場合、返す。

  2. topattribution enabled flagを false に設定する。

Document document が与えられ、 失敗時に "NotAllowedError" DOMException を投げるものとして、 attribution API activation を確認するには:
  1. n を、documentノード navigableを取得した結果とする。

  2. top を、nトップレベル traversableを取得した結果とする。

  3. topアトリビューション有効化フラグが true の場合、返る。

  4. lastActivation を、topアトリビューション活性化タイムスタンプとする。

  5. lastActivationアトリビューション活性化期間 を加えた値が、現在の高分解能時刻より小さい場合、 "NotAllowedError" DOMException を投げる。

  6. アトリビューション活性化タイムスタンプUnix エポックに設定する。

  7. topアトリビューション有効化フラグを true に設定する。

4.2.3. エポック開始時刻

プライバシーバジェットエポック(またはエポック)は、 ある期間を識別する。 エポックの長さは、1 週間、すなわち 7 に固定される。 ここで、は 86400 秒として定義される。

エポック開始時刻は、 壁時計からの時点である。 エポックは、 各ユーザーエージェントについて、 週の中からランダムに選択された時刻に開始する。 これにより、プライバシー バジェットがゼロに達することで生じる集計の偏りが、 すべてのユーザーからのすべての貢献全体に 平均化されることが保証される。

同一デバイス上では、 すべてのプライバシーバジェットおよびクォータは、 エポック開始時刻に基づいて同時に更新される。

開始時刻は、 現在の エポックを取得するアルゴリズムを呼び出した副作用として、エポックが最初に必要になったときに ユーザーエージェントによってランダムに選択される。

エポックインデックスは、 与えられたエポックを参照する整数である。 エポックインデックスは、 インプレッション およびエポック開始時刻に アクセスするために使用される。

時点が抽象的な概念であり、 別の時点に相対的な期間としてしか表現できないのと同様に、 エポックは 抽象的である。

エポックインデックスは、 設定された参照点に相対的な 整数として保存される。 この仕様におけるエポックインデックスは、 エポック開始 時刻 を参照点として使用する。 ユーザーエージェントは、別の時点を使用して、 “ゼロ”または参照エポックを示すことを選択してもよい。

この仕様のアルゴリズムはすべて、より抽象的なエポックではなく、 具体的なエポックインデックスを使用する。 時点は、 現在の エポックを取得するアルゴリズムを使用して、 対応するエポックエポックインデックスへ変換される。

時点 t が与えられ、 エポックインデックスを返して、 現在の エポックを取得するには:
  1. period を、1 エポック期間 とする。

  2. エポック 開始時刻が設定されていない場合、 次のように、直近のエポック 内からランダムに選択された時刻に設定する:

    1. rand を、0(含む)から period(含まない)の間で ランダムに選択された期間t から差し引いた値とする。

    2. ms を、Unix エポックから rand までの 期間に含まれるミリ秒数とする。

    3. hour を、ms を 3600000 (1 時間のミリ秒数)で割り、 ゼロ方向に丸めた後、 3600000 を掛けた値とする。

    4. エポック開始時刻を、Unix エポックhour期間として加えた値に設定する。

  3. startエポック開始時刻とする。

  4. elapsed を (tstart) / period とする。

  5. elapsed を、負の無限大方向に丸めた整数として返す。

4.2.4. 最後の閲覧履歴消去時刻

直近の閲覧履歴消去は、 閲覧履歴が最後に消去された時刻を追跡する、 壁時計を使用する時点である。 直近の閲覧履歴消去値は、 ユーザーの要求により いずれかのサイトレベル状態が消去されたときに、 現在の粗化された壁時計時刻 に更新される。 この値は最初は未設定である。

任意の最適化として、 次のすべてが true である場合、直近の閲覧履歴消去の更新を省略できる:

3 つの条件がすべて true である場合、 直近の閲覧履歴消去は更新する必要がない。 代わりに、影響を受けるすべてのサイトおよびエポック対応するエポックインデックスを使用する) から形成できるすべてのプライバシーバジェット キーの組み合わせについて、 値 0 を設定することで、 プライバシー バジェットストアを更新しなければならない。

この最適化は、ユーザーエージェントが、 影響を受けるサイトとのインタラクションに関する情報を、 影響を受けるエポック内で保持していることに依存する。 これは、保持されているインタラクションのいずれもが バジェットの枯渇をもたらした可能性があるためにのみ機能する。 閲覧履歴の空白に関する情報が 露出しないようにするには、バジェットをリセットする必要がある。

時点 now が与えられ、 エポックインデックスを返して、 attribution 用の開始エポックを取得するには:
  1. earliestEpochIndex を、 now最大 lookback 日数現在のエポックを取得する 結果とする。

    これにより、可能なすべてのインプレッションを照会できることが保証される。

  2. startEpochearliestEpochIndex とする。

  3. 直近の閲覧履歴消去が設定されている場合、 次の手順を実行する:

    1. clearEpoch を、直近の閲覧履歴消去の値で 現在の エポックを取得する 結果とする。

      この現在のエポックを取得する の使用は、負の値を返すことがある。 これは、エポック開始時刻 が、履歴が最後に消去された後の時刻に設定される可能性が高いためである。

    2. clearEpochclearEpoch + 1 に設定する。

      1 を加えることは、attribution 用のエポック範囲が、 閲覧履歴が消去される前のエポック と重ならないようにするために必要である。

    3. clearEpochstartEpoch より大きい場合、 clearEpoch を返す。

  4. startEpoch を返す。

集合であるサイト sitesブール値 forgetVisits、 および時点 now が与えられ、 attribution 用に閲覧履歴を消去するには:
  1. forgetVisits が false の場合:

    1. 表明するsites空で ない

    2. sites 内の各 site について反復する

      1. startingEpoch を、 now が与えられてattribution 用の開始エポックを 取得するを呼び出した結果とする。

      2. currentEpoch を、 now が与えられて現在のエポックを取得する を呼び出した結果とする。

      3. startingEpoch から currentEpoch までの包括範囲 内の各 epoch について反復する

        1. key を、siteepoch から形成される プライバシー バジェットキーとする。

        2. プライバシー バジェットストア[key] を 0 に設定する

    3. 返る。

  2. sites空である場合:

    1. インプレッションストア消去する

    2. プライバシーバジェット ストア消去する

    3. インプレッションサイトクォータストア消去する

    4. グローバル プライバシーバジェットストア消去する

  3. sites空でない場合:

    1. インプレッションストア内の各 impression について反復しsitesimpressionインプレッションサイト含む場合、 impressionインプレッションストアから削除する

    2. プライバシーバジェットストアキー 内の各 key について反復しsiteskeyサイト構成要素を含む場合、 プライバシーバジェット ストア[key] を削除する

    3. インプレッションサイトクォータストアキー 内の各 key について反復しsiteskeyサイト構成要素を含む場合、 インプレッションサイトクォータ ストア[key] を削除する

      この処理はグローバル プライバシーバジェットストアには触れない。 主として、これはプライバシーバジェットが、 いったん消費されたら忘れられないことを保証するためである。

  4. 直近の閲覧履歴消去now に設定する。

    一部のサイトについてのみ状態を消去している間 (すなわち、sites空で ない場合)に 直近の閲覧履歴消去を設定すると、 その集合に含まれていないサイトについて、一部のインプレッションに到達できなくなる。 実装は、その結果として使用できなくなる 使用不能なインプレッションや バジェット記録 (グローバルプライバシーバジェットストア内のものなど) も削除できる。

4.3. インプレッション保存アルゴリズム

saveImpression(options) メソッド手順は 次のとおりである。
  1. this から 暗黙の API 入力を取得する結果を implicitInputs とする。

  2. Assert: implicitInputs は null でない。

  3. options および implicitInputs を指定して インプレッションを保存するを実行した結果を返す。

AttributionImpressionOptions options および暗黙的 API 入力 implicitInputs が与えられ、 インプレッションを 保存するには:
  1. documentimplicitInputs関連付けられた文書とする。

  2. realmdocument関連するレルムとする。

  3. document が "save-impression" という名前のポリシー制御機能使用することを許可されていない場合、 realm 内の "NotAllowedError" DOMException却下された promiseを返す。

  4. document が与えられて、 attribution API activation を確認する。 投げられた理由があれば、その理由で却下された promiseを返す。

  5. ページから供給される API 入力を検証する:

    1. options.histogramIndex実装定義最大ヒストグラムサイズ以上である場合、 realm 内の RangeError却下された promiseを返す。

    2. options.lifetimeDays が 0 である場合、 realm 内の RangeError却下された promiseを返す。

    3. options.lifetimeDays最大 lookbackに丸め込む。

    4. options.conversionSitesサイズが、 実装定義インプレッションあたりの 最大 conversion site 数より大きい場合、 realm 内の RangeError却下された promiseを返す。

    5. conversionSites を、options.conversionSites 内の各値について サイトを解析する を呼び出した結果である集合とする。

    6. conversionSites 内のいずれかの結果が failure である場合、 realm 内の "SyntaxError" DOMException却下された promiseを返す。

    7. options.conversionCallersサイズが、 実装定義インプレッションあたりの 最大 conversion caller 数より大きい場合、 realm 内の RangeError却下された promiseを返す。

    8. conversionCallers を、options.conversionCallers 内の各値について サイトを解析する を呼び出した結果である集合とする。

    9. conversionCallers 内のいずれかの結果が failure である場合、 realm 内の "SyntaxError" DOMException却下された promiseを返す。

  6. 次の手順を並列に実行する:

    1. impression を、次から構成される保存済みインプレッションとして構築する:

      Match Value

      options.matchValue

      Impression Site

      implicitInputsトップレベルサイト

      Intermediary Site

      implicitInputs中間サイト

      Conversion Sites

      conversionSites

      Conversion Callers

      conversionCallers

      Timestamp

      implicitInputstimestamp

      Lifetime

      options.lifetimeDays

      Histogram Index

      options.histogramIndex

      Priority

      options.priority

    2. Attribution API が有効である場合、 impressionインプレッションストアに保存する。

  7. result を新しい AttributionImpressionResult とする。

  8. realm 内の result解決された promiseを返す。

saveImpression() は、インプレッションが記録されたかどうかを示すステータスを返さない。 これにより、Attribution API が無効であるときを検出する能力が最小化される。

実装は、API 状態を明らかにしうるサイドチャネル を軽減することを試みなければならない。例えば、返される promise の解決は、 impressionインプレッションストアに保存することを前提にしない。 これは、解決にかかる時間が、既存の インプレッション数や API が有効かどうかに依存しないことを保証するためである。

暗黙的 API 入力は、次のフィールドを持つ構造体である:

トップレベルサイト: サイト
中間サイト: サイトまたは undefined
タイムスタンプ: 時点
関連付けられた文書: Document
レルム realm から、 任意のオリジン(既定値 null)を伴って 暗黙的 API 入力を取得するには:
  1. windowrealmグローバルオブジェクトとする。

  2. windowWindow でない場合、null を返す。

  3. settingsrealm設定オブジェクトとする。

  4. timestampsettings現在の壁時計時刻とする。

  5. topLevelOriginsettingsトップレベルオリジンとする。

  6. origin が null の場合、originsettingsオリジンに設定する。

  7. topLevelSite を、topLevelOrigin からサイトを取得する結果とする。

  8. intermediarySite を次の値とする:

    1. origintopLevelOrigin同一サイト である場合、undefined の値、

    2. そうでない場合、origin からサイトを取得する結果。

  9. 次のフィールドを持つ暗黙的 API 入力を返す:

    トップレベルサイト

    topLevelSite

    中間サイト

    intermediarySite

    timestamp

    timestamp

    関連付けられた文書:

    window関連付けられた文書

4.4. コンバージョン測定アルゴリズム

measureConversion() メソッドは 非同期に完了し、Attribution タスクソース上に作業をキューする。

measureConversion(options) メソッド 手順は次のとおりである:
  1. implicitInputs を、this から暗黙的 API 入力を取得する結果とする。

  2. 表明するimplicitInputs は null でない。

  3. options および implicitInputsconversion を測定するを実行した結果を返す。

AttributionConversionOptions options および暗黙的 API 入力 implicitInputs が与えられ、 conversion を 測定するには:
  1. documentimplicitInputs関連付けられた文書とする。

  2. realmdocument関連するレルムとする。

  3. document が "measure-conversion" という名前のポリシー制御機能使用することを許可されていない場合、 realm 内の "NotAllowedError" DOMException却下された promiseを返す。

  4. 帰属 API の有効化をチェックdocument を受け取り、投げられた任意の理由で拒否されたプロミスを返す。

  5. validatedOptions を、 options検証する結果とする。 投げられた理由があれば、その理由で却下された promiseを返す。

  6. promiserealm 内の新しい promiseとする。

  7. 次の手順を並列に実行する:

    1. report を、validatedOptionsヒストグラムサイズ全ゼロヒストグラムを作成するを呼び出した結果とする。

    2. Attribution API が有効である場合、 report を、validatedOptionsimplicitInputsトップレベルサイトimplicitInputs中間サイト、および implicitInputstimestampattribution を行いヒストグラムを埋める結果に設定する。

    3. aggregationServicevalidatedOptionsaggregation serviceとする。

    4. aggregationService.protocol の値で分岐する:

      dap-18-histogram

      次の手順を実行する:

      1. encryptedReport を、validatedOptionsimplicitInputsトップレベル siteimplicitInputs仲介 siteimplicitInputstimestamp、および report が与えられたうえで、 DAP レポートを構築するを呼び出した結果とする。

    5. result を、次の項目を持つ AttributionConversionResult とする:

      report

      encryptedReport

    6. promiseresult解決するため、 タスクをキューする。 これはAttribution タスクソース上で行う。

  8. promise を返す。

実装は、API 状態を明らかにしうるサイドチャネル を軽減することを試みなければならない。例えば、理想的には、返される promise の解決にかかる時間は、 保存または一致したインプレッション数や API が有効かどうかに依存しないことになる。

検証済み conversion optionsは、次のフィールドを持つ構造体である:

Aggregation Service: AttributionAggregationService のインスタンス。
Epsilon: 有限の正の数。
Histogram Size: 32 ビット符号なし整数
Lookback: 正の期間
Match Values: 32 ビット符号なし整数集合
Impression Sites: サイト集合
Impression Callers: サイト集合
Credit: 数値のリスト
Value: 32 ビット符号なし整数
Max Value: 32 ビット符号なし整数
optionsAttributionConversionOptions を検証するには:
  1. aggregationServices が、 options.aggregationServiceキーを持つ entry含まない場合、 ReferenceError を投げる。

  2. aggregationService を、 options.aggregationService が与えられて、 AttributionAggregationServices から値を取得する結果とする。

  3. options.epsilon が 0 以下、またはmaximum epsilonより大きい場合、 RangeError を投げる。

  4. options.histogramSize が 0、または実装定義最大ヒストグラム サイズより大きい場合、 または options.aggregationService について、存在するならmaximum aggregation-service histogram sizeより大きい場合、 RangeError を投げる。

  5. options.value が 0 である場合、 RangeError を投げる。

  6. options.valueoptions.maxValue より大きい場合、 RangeError を投げる。

  7. credit を、options.credit存在する場合はそれ、そうでない場合は «1» とする。

  8. credit空である場合、RangeError を投げる。

  9. credit項目のいずれかが 有限でない、または 0 以下である場合、 RangeError を投げる。

  10. creditサイズが、実装定義maximum number of credit valuesを超える場合、 RangeError を投げる。

  11. lookback を、options.lookbackDays存在する場合はその値とし、 そうでない場合は最大 lookback とする。

  12. lookback がその最大値より大きい場合、 lookback最大 lookback に設定する。

  13. lookback が 0 である場合、 RangeError を投げる。

  14. options.matchValuesサイズが、 実装定義maximum number of match valuesより大きい場合、 RangeError を投げる。

  15. matchValues を、 options.matchValues集合を作成するを実行した結果とする。

  16. options.impressionSitesサイズが、 実装定義conversion 用の最大 impression site 数より大きい場合、 RangeError を投げる。

  17. impressionSites を、options.impressionSites 内の各値についてサイトを 解析するを呼び出した結果である集合とする。

  18. impressionSites 内のいずれかの結果が failure である場合、"SyntaxError" DOMException を投げる。

  19. options.impressionCallersサイズが、 実装定義conversion 用の 最大 impression caller 数より大きい場合、 RangeError を投げる。

  20. impressionCallers を、options.impressionCallers 内の各値についてサイトを 解析するを呼び出した結果である集合とする。

  21. impressionCallers 内のいずれかの結果が failure である場合、"SyntaxError" DOMException を投げる。

  22. 次のフィールドを持つ検証済み conversion optionsを返す:

    Aggregation Service

    aggregationService

    Epsilon

    options.epsilon

    Histogram Size

    options.histogramSize

    Lookback

    lookback

    Match Values

    matchValues

    Impression Sites

    impressionSites

    Impression Callers

    impressionCallers

    Credit

    credit

    Value

    options.value

    Max Value

    options.maxValue

4.4.1. Attribution ロジック

Attribution ロジックは、 コンバージョン値をヒストグラムバケットにどのように割り当てるかを決定する。

attribution を行いヒストグラムを埋めるには、 検証済み conversion options optionsサイト topLevelSiteサイトまたは undefined intermediarySite、および 時点 now が与えられた場合:
  1. now を指定して現在のエポックを取得する結果を currentEpoch とする。

  2. now を指定してattribution の開始エポックを 取得する結果を startEpoch とする。

  3. (nowoptionsルックバック) を渡して、 現在のエポックを取得するを 呼び出した結果を earliestEpoch とする。

  4. currentEpochearliestEpoch と等しい場合は true、 そうでなければ false を isSingleEpoch とする。

  5. l1Norm を 0 とする。

  6. isSingleEpoch が true の場合:

    1. optionstopLevelSiteintermediarySitecurrentEpoch、および nowを指定して共通照合 ロジックを呼び出した結果を impressions とする。

    2. impressions空で ある場合、optionsヒストグラムサイズを指定して 全ゼロヒストグラムを作成するを 呼び出した結果を返す。

    3. impressionsoptionsヒストグラムサイズoptions、および optionscreditを指定して last-n-touch attribution で ヒストグラムを埋めるを実行した結果を histogram とする。

    4. histogram 内の項目の合計を l1Norm とする。

    5. Assert: l1Normoptions以下である。

  7. 新しい集合deductedImpressionQuotas とする。

  8. 新しい集合deductedGlobalBudgets とする。

  9. 集合matchedImpressions とする。

  10. startEpoch から currentEpoch までの各 epoch について、両端を含めて:

    1. optionstopLevelSiteintermediarySiteepoch、および nowを指定して共通照合 ロジックを呼び出した結果を impressions とする。

      単一エポックの場合、これは matchedImpressionsを再計算している。 実装は、その作業を二度行わないようにしたいだろう。

    2. impressions空で ない場合:

      1. epoch および topLevelSiteを項目とする プライバシー予算キーkey とする。

      2. keyimpressionsoptionsepsilonoptionsoptions最大値isSingleEpochl1NormdeductedImpressionQuotas、および deductedGlobalBudgetsを指定して プライバシーおよび安全予算を 控除するを呼び出した結果を budgetAndSafetyOk とする。

      3. budgetAndSafetyOk が true の場合、 matchedImpressionsimpressions拡張する

  11. matchedImpressions空で ある場合、 optionsヒストグラムサイズを指定して 全ゼロヒストグラムを作成するを 呼び出した結果を返す。

  12. matchedImpressionsoptionsヒストグラムサイズoptions、および optionscreditを指定して last-n-touch attribution で ヒストグラムを埋めるを実行した結果を histogram とする。

  13. histogram を返す。

integer size を与えられ、 全ゼロ ヒストグラムを作成するには、次を実行する。
  1. サイズsizeであり、その項目がすべて 0 であるリストを返す。

4.4.2. 共通インプレッション照合ロジック

共通 マッチングロジックを実行するには、 検証済み conversion options optionsサイト topLevelSiteサイトまたは undefined intermediarySiteエポックインデックス epoch、および 時点 now が与えられた場合:
  1. 集合matching とする。

  2. インプレッションストア内の 各 impression について反復する

    1. impressionタイムスタンプを渡して、 現在の エポックを取得するを呼び出した結果を impressionEpoch とする。

    2. impressionEpochepoch と等しくない場合、 continueする。

    3. now が、impressionタイムスタンプimpression有効期間を加えた時刻より後である場合、 continueする。

    4. now が、impressionタイムスタンプoptionsルックバックを加えた時刻より後である場合、 continueする。

    5. impressionコンバージョンサイト空でなく、 かつ topLevelSite含まない場合、 continueする。

    6. intermediarySiteundefined でない場合は intermediarySite を、そうでなければ topLevelSiteconversionCaller とする。

    7. impressionコンバージョン呼び出し元空でなく、 かつ conversionCaller含まない場合、 continueする。

    8. optionsmatch value空でなく、 かつ impressionmatch value含まない場合、 continueする。

    9. optionsインプレッションサイト空でなく、かつ impressionインプレッションサイト含まない場合、 continueする。

    10. impression仲介サイトundefined でない場合はそれを、 そうでなければ impressionインプレッションサイトimpressionCaller とする。

    11. optionsインプレッション呼び出し元空でなく、 かつ impressionCaller含まない場合、 continueする。

    12. impressionmatching追加する

  3. matching を返す。

4.4.2.1. Last-N-Touch Attribution
double のリスト credit と integer valueを与えられ、 credit を公平に 割り当てるには、次を実行する。
  1. Assert: creditでない。

  2. credit項目の合計を sumCredit とする。

  3. 新しいリストroundedCredit とする。

  4. credit の各 item について反復する

    1. value * item / sumCreditnormalizedCredit とする。

    2. normalizedCreditroundedCredit追加する

  5. idx1 を 0 とする。

  6. roundedCreditインデックスを取得するから、最初の項目を除いた各 n について反復する

    1. idx2n とする。

    2. roundedCredit[idx1] − floor(roundedCredit[idx1]) を frac1 とする。

    3. roundedCredit[idx2] − floor(roundedCredit[idx2]) を frac2 とする。

    4. frac1frac2 の両方がゼロに等しい場合、 continueする。

    5. frac1 + frac2 が 1 より大きい場合、 incr1 を 1 − frac1 とし、 incr2 を 1 − frac2 とする。

    6. そうでなければ、incr1 を −frac1 とし、 incr2 を −frac2 とする。

      incr1 は、 roundedCredit[idx1] が整数になるよう増分する量を表し、 incr2 および idx2 についても同様である。 これらの値は負になり得ることに注意。

    7. incr2 / (incr1 + incr2) を p1 とする。

      p1 の値は、idx1 内の項目が整数へ丸められる確率を表す。 incr1 + incr2 が 0 のときにゼロ除算が発生するが、 これは frac1frac2 の両方が整数である場合 (両方が 0、または正確に 1 のいずれか)にのみ可能である。 この場合、idx2 を丸める必要はないため、単にスキップする。

    8. 0 から 1(含む)の間のランダムな double を r とする。

    9. rp1 より小さい場合、 incrincr1 とし、 idx1idx2 の値を交換する。

    10. そうでなければ、incrincr2 とする。

    11. roundedCredit[idx2] を incr だけ増分する。

    12. roundedCredit[idx1] を incr だけ減分する。

  7. roundedCredit から項目すべて 最も近い整数へ丸めることで整数に変換し、 ちょうど中間の場合はゼロから離れる方向に丸めた結果を integerCredit とする。

  8. integerCredit を返す。

    この最後の丸め手順は、微小な浮動小数点の 加算および減算誤差によって、 roundedCredit[idx1] の小数部分が完全には取り除かれない場合のためだけにある。 半分のときの丸めモードが実際に発生することはなく、実装を容易にするため C++ の std::round の挙動と一致するよう選択されている。

    このアルゴリズムの目的は、 1) 割り当て全体にわたって正確に value の総値を割り当てること、 2) integerCredit の期待値が正規化された credit (すなわち、credit * value / sumCredit。 ここで * は要素ごとの乗算を表す)と正確に等しいという性質を維持すること、 3) どの割り当てにも 1 を超える誤差を生じさせないことである。

インプレッション集合 matchedImpressions、integer histogramSize、integer value、および double のリスト creditを与えられ、 last-n-touch attribution でヒストグラムを 埋めるには、次を実行する。
  1. Assert: matchedImpressions空で ない

  2. matchedImpressions を、優先度、次にタイムスタンプ降順にソートしたものを sortedImpressions とする。

  3. creditサイズと、 sortedImpressionsサイズの最小値を N とする。

  4. sortedImpressions の先頭 N 個のエントリーを lastNImpressions とする。

  5. credit の先頭 N 個を除くすべてのエントリーを削除する

  6. credit および valueを指定してcredit を公平に 割り当てる結果を normalizedCredit とする。

  7. histogramSize を指定して全ゼロ ヒストグラムを作成するを呼び出した結果を histogram とする。

  8. lastNImpressionsインデックスの各 i について反復する

    1. lastNImpressions[i] を impression とする。

    2. normalizedCredit[i] を value とする。

    3. impressionヒストグラムインデックスindex とする。

    4. indexhistogramサイズより小さい場合、 histogram[index] を value だけ増分する。

  9. histogram を返す。

4.5. 実装定義値の設定

この仕様はいくつかの実装定義値を識別する。 この節では、実装がそれらの値を最適に設定する方法についての いくつかの推奨事項を含む。

実装は、lifetimeDays および lookbackDays について、実装定義最大 lookback を設定する。 最大 lookbackは、 正の整数個のである。 これらの値について異なる最大値を持たせても意味はない。 2 つのうち小さい方の値が、 どの保存済みインプレッションが conversion に利用できるかを決定するためである。

実装は、少なくとも 30 日の最大 lookbackを設定しなければならない。 この期間内に、実装はインプレッションサイトごとに少なくとも 1000 個のインプレッションを保持するよう 試みるべきである

実装は、可能な場合、 時間および個数に関するこれらの推奨される制限を超えてインプレッションを保持するべきである。 インプレッションを保存するために利用可能な容量は、 インプレッションデータを保持するために必要なストレージと、 conversion report を生成するために必要な処理時間の両方に依存する。 実装は、サイトが利用可能な容量を超えてインプレッションの保存を要求した場合、 ユーザーに要求された場合(§ 9.2 Attribution API の無効化を参照)、 または実装定義の理由により、 これらの制限に達する前にインプレッションを破棄してもよい

実装がインプレッションを保持しないことを選択しうる理由の 1 つは、 そのサイトが十分なユーザーエンゲージメントを受けていないことである。

saveImpression() および measureConversion() に渡されるサイトのリストについて、実装定義値が選択される。 インプレッションあたりの最大 conversion site 数 は、conversionSites の値の個数に対する制限であり、 実装はこの値を少なくとも 5 に設定しなければならないインプレッションあたりの最大 conversion caller 数 および conversion 用の最大 impression caller 数 は、それぞれ conversionCallers および impressionCallers の値の個数に対する制限であり、 実装はこれらの値をそれぞれ少なくとも 10 に設定しなければならないconversion 用の最大 impression site 数 は、impressionSites の値の個数に対する制限であり、 実装はこの値を少なくとも 30 に設定しなければならない

credit の値の個数に対する制限である 最大 credit 値数について、実装定義値が選択される。 実装はこの値を少なくとも 10 に設定しなければならないmatchValues の値の個数に対する制限である 最大 match value 数について、実装定義値が選択される。 実装はこの値を少なくとも 30 に設定しなければならない

measureConversion() によって生成されるヒストグラムのサイズは、 実装定義最大ヒストグラムサイズmaximum aggregation-service histogram size の両方の対象となる。 最大ヒストグラムサイズには最小値は設定されない。 集計技術の選択によって制限が設定されることが期待されるためである。 maximum aggregation-service histogram size は、aggregation serviceで使用される技術の選択によって決定される 固定値となる。 これは実装定義ではない。

4.5.1. プライバシーおよび安全制限パラメーター構成

ユーザー エージェントは、次について値を定義することで、 プライバシーバジェットおよび安全上の制限を構成する:

安全上の制限サイトごとのバジェットの倍数として構成することで、 複数のサイトによって API をどのように使用できるかが決まる。 この倍数を設定する際に、 実装は、バジェットを使用する可能性のあるサイト数として どの程度を想定するかを考慮する必要があり、 バジェットを完全には使用しないサイトを考慮して 下方修正することもある。

安全上の制限サイトごとのバジェットの倍数として設定することで、 共有制限を使い尽くすには多くのサイトによる協調が必要になることが保証され、 それらは主たるプライバシー機構としてではなく、 濫用から保護する手段として主に有用になる。

5. HTTP API

5.1. インプレッションの保存

`Save-Impression` は、 Dictionary Structured Headerであり、 ユーザーエージェントに saveImpression() API を呼び出すよう要求する応答に設定される。

これは、JavaScript の saveImpressionに相当する HTTP である:
Save-Impression: histogram-index=3, match-value=2, conversion-sites=("advertiser.example"), lifetime-days=7

次のキーが定義されており、 saveImpression() に渡される AttributionImpressionOptions 辞書のメンバーに対応する。省略された 任意キーの既定値は、対応する AttributionImpressionOptions フィールドと同じ方法で扱われる。不明な辞書キーは無視され、 不明なパラメーターも同様に無視される。

conversion-sites
conversionSites の値。 文字列を含む 内部リストである。 各文字列値は A-label のみを使用するドメイン名を含む。 したがって、国際化 ドメイン名punycodeを使用する必要がある。 このキーは任意である。
conversion-callers
conversionCallers の値。 文字列を含む 内部リストである。 各文字列値は A-label のみを使用するドメイン名を含む。 したがって、国際化 ドメイン名punycodeを使用する必要がある。 このキーは任意である。
histogram-index
histogramIndex の値。 32 ビット符号なし整数範囲内の 整数である。このキーは必須である。
priority
priority の値。 32 ビット符号付き整数範囲内の 整数である。このキーは任意である。
match-value
matchValue の値。 32 ビット符号なし整数範囲内の 整数である。このキーは任意である。
lifetime-days
lifetimeDays の値。 正の整数である。このキーは任意である。
ヘッダー値 input を与えられ、 Save-Impression ヘッダーを解析するには、次の手順を実行する。
  1. input_bytesinput に設定し、 field_type を "dictionary" に設定して structured fields を 解析する結果を dict とする。

  2. 解析が失敗した場合、エラーを返す。

  3. dict["histogram-index"] を、undefined をデフォルトとして取得したものhistogramIndex とする。

  4. histogramIndex32 ビット符号なし整数範囲内の整数でない場合、 エラーを返す。

  5. 次の項目を持つ新しい AttributionImpressionOptionsopts とする。

    histogramIndex

    histogramIndex

  6. dict["conversion-sites"] が存在する場合:

    1. そのconversionSites とする。

    2. conversionSites内部 リストでない場合、または conversionSites項目のいずれかが 文字列でない場合、 エラーを返す。

    3. opts.conversionSitesconversionSites に設定する。

  7. dict["conversion-callers"] が存在する場合:

    1. そのconversionCallers とする。

    2. conversionCallers内部 リストでない場合、または conversionCallers項目のいずれかが 文字列でない場合、 エラーを返す。

    3. opts.conversionCallersconversionCallers に設定する。

  8. dict["match-value"] が存在する場合:

    1. そのmatchValue とする。

    2. matchValue32 ビット符号なし整数範囲内の 整数でない場合、 エラーを返す。

    3. opts.matchValuematchValue に設定する。

  9. dict["lifetime-days"] が存在する場合:

    1. そのlifetimeDays とする。

    2. lifetimeDays が正の整数でない場合、 エラーを返す。

    3. opts.lifetimeDayslifetimeDays に設定する。

  10. dict["priority"] が存在する場合:

    1. そのpriority とする。

    2. priority32 ビット符号付き整数範囲内の 整数でない場合、 エラーを返す。

    3. opts.prioritypriority に設定する。

  11. opts を返す。

5.2. コンバージョンの測定

`Measure-Conversion` は、 Dictionary Structured Headerであり、 ユーザーエージェントに measureConversion() API を呼び出すよう要求する応答に設定される。

これは、JavaScript の measureConversionに相当する HTTP であり、 生成されたレポートが POST される report-url が追加されている:
Measure-Conversion: aggregation-service="https://aggregator.example/tee", histogram-size=20, epsilon=1.0, lookback-days=14, impression-sites=("publisher.example" "other.example"), impression-callers=("ad-tech.example"), match-values=(2), credit=(0.25 0.25 0.5), value=3, max-value=7, report-url="https://report-handler.example/foo"

次のキーが定義されており、 measureConversion() に渡される AttributionConversionOptions 辞書のメンバーに対応する。省略された 任意キーの既定値は、対応する AttributionConversionOptions フィールドと同じ方法で扱われる。不明な辞書キーは無視され、 不明なパラメーターも同様に無視される。

aggregation-service
aggregationService の値。 文字列である。このキーは必須である。
epsilon
epsilon の値。 正のdecimalまたはintegerである。 このキーは任意である。
histogram-size
histogramSize の値。 正の整数である。このキーは必須である。
lookback-days
lookbackDays の値。 正の整数である。このキーは任意である。
match-values
matchValues の値。 非負の整数を含む 内部リストである。 このキーは任意である。
impression-sites
impressionSites の値。 文字列を含む 内部リストである。 各文字列値は A-label のみを使用するドメイン名を含む。 したがって、国際化 ドメイン名punycodeを使用する必要がある。 このキーは任意である。
impression-callers
impressionCallers の値。 文字列を含む 内部リストである。 各文字列値は A-label のみを使用するドメイン名を含む。 したがって、国際化 ドメイン名punycodeを使用する必要がある。 このキーは任意である。
credit
credit の値。 正のdecimalまたは 正のintegerを含む 内部リストである。このキーは任意である。
value
value の値。 正の整数である。このキーは任意である。
max-value
maxValue の値。 正の整数である。このキーは任意である。
report-url
結果のレポートが、存在する場合に POST される先の 潜在的に信頼できる URLを含む 文字列。 URL はレスポンス URL に対して相対でもよい。そのスキームは "https" でなければならない。 このキーは必須である。
ヘッダー値 input およびURL baseUrlを与えられ、 Measure-Conversion ヘッダーを解析するには、次の手順を実行する。
  1. input_bytesinput に設定し、 field_type を "dictionary" に設定して structured fields を 解析する結果を dict とする。

  2. 解析が失敗した場合、エラーを返す。

  3. dict["aggregation-service"] を、undefined をデフォルトとして取得したものaggregationService とする。

  4. aggregationService文字列でない場合、 エラーを返す。

  5. dict["histogram-size"] を、undefined をデフォルトとして取得したものhistogramSize とする。

  6. histogramSize32 ビット符号なし整数範囲内の正の整数でない場合、 エラーを返す。

  7. dict["report-url"] を、undefined をデフォルトとして取得したものreportUrlString とする。

  8. reportUrlString文字列でない場合、 エラーを返す。

  9. baseUrl を伴って reportUrlStringURL パーサーを適用した結果を reportUrl とする。

  10. reportUrl が失敗の場合、エラーを返す。

  11. reportUrl潜在的に信頼できる URLでない場合、エラーを返す。

  12. reportUrlスキームが "https" でない場合、エラーを返す。

  13. 次の項目を持つ新しい AttributionConversionOptionsopts とする。

    aggregationService

    aggregationService

    histogramSize

    histogramSize

  14. dict["epsilon"] が存在する場合:

    1. そのepsilon とする。

    2. epsilondecimalまたは integerでない場合、エラーを返す。

    3. opts.epsilonepsilon に設定する。

  15. dict["lookback-days"] が存在する場合:

    1. そのlookbackDays とする。

    2. lookbackDays が正の整数でない場合、 エラーを返す。

    3. opts.lookbackDayslookbackDays に設定する。

  16. dict["match-values"] が存在する場合:

    1. そのmatchValues とする。

    2. matchValues内部 リストでない場合、または matchValues項目のいずれかが 32 ビット符号なし整数範囲内の整数でない場合、エラーを返す。

    3. opts.matchValuesmatchValues に設定する。

  17. dict["impression-sites"] が存在する場合:

    1. そのimpressionSites とする。

    2. impressionSites内部 リストでない場合、または impressionSites項目のいずれかが 文字列でない場合、 エラーを返す。

    3. opts.impressionSitesimpressionSites に設定する。

  18. dict["impression-callers"] が存在する場合:

    1. そのimpressionCallers とする。

    2. impressionCallers内部 リストでない場合、または impressionCallers項目のいずれかが 文字列でない場合、 エラーを返す。

    3. opts.impressionCallersimpressionCallers に設定する。

  19. dict["credit"] が存在する場合:

    1. そのcredit とする。

    2. credit内部 リストでない場合、または credit項目のいずれかが decimalまたは integerでない場合、エラーを返す。

    3. opts.creditcredit に設定する。

  20. dict["value"] が存在する場合:

    1. そのvalue とする。

    2. value32 ビット符号なし整数範囲内の正の整数でない場合、 エラーを返す。

    3. opts.valuevalue に設定する。

  21. dict["max-value"] が存在する場合:

    1. そのmaxValue とする。

    2. maxValue32 ビット符号なし整数範囲内の正の整数でない場合、 エラーを返す。

    3. opts.maxValuemaxValue に設定する。

  22. (opts, reportUrl) を返す。

バイト シーケンス reportURL url、および環境設定オブジェクト settings が与えられたとき、 レポートを送信するには:
  1. アサート: url潜在的に信頼できる URLである。

  2. アサート: urlスキームは "https" である。

  3. headers を、 "Content-Type" という名前を持ち、その値が "application/dap-report" であるヘッダーを含む、 新しいヘッダーリストとする。

    注: AttributionAggregationProtocoldap-18-histogram 以外の値を得ることがあれば、これは更新する必要がある。

  4. request を、次のプロパティを持つ新しいリクエストとする:

    メソッド

    "POST"

    URL

    url

    ヘッダーリスト

    headers

    本体

    report

    クライアント

    settings

    モード

    "cors"

    キャッシュモード

    "no-store"

    keepalive

    true

    資格情報モード

    "omit"

    リファラー

    url

  5. requestフェッチする。エラーが発生した場合は任意で再試行する。

5.3. Fetch monkey patch

リクエスト request およびレスポンス responseを与えられ、 Attribution ヘッダーを処理するには、次の手順を実行する。
  1. requestdestinationが次のいずれでもない場合、 戻る: "", "audio", "image", "script", "track", "video".

  2. requestclient安全なコンテキストでない場合、戻る。

  3. responseURL潜在的に信頼できる URLでない場合、戻る。

  4. responseURLスキームが "https" でない場合、戻る。

  5. requestclientから、 responseURLオリジンを伴って、 暗黙の API 入力を取得する結果を implicitInputs とする。

  6. implicitInputs が null の場合、戻る。

  7. responseヘッダーリストから `Save-Impression`取得する結果を saveImpressionHeader とする。

  8. saveImpressionHeader が null でない場合:

    1. saveImpressionHeader解析する結果を impressionOptions とする。

    2. impressionOptions がエラーでない場合、 implicitInputs とともに impressionOptions保存する

  9. responseヘッダーリストから `Measure-Conversion`取得する結果を measureConversionHeader とする。

  10. measureConversionHeader が null でない場合:

    1. measureConversionHeader解析する結果を parseConversionResult とする。

    2. parseConversionResult がエラーでない場合:

      1. parseConversionResult を (conversionOptions, reportUrl) とする。

      2. conversionOptions および implicitInputs を用いてコンバージョンを 測定するを実行した結果を reportPromise とする。

      3. 並列に:

        1. reportPromise履行時に、履行値を result とする。

        2. result.reportreportUrl、および requestclientを用いて レポートを送信する

HTTP-network fetch を次のように変更する:

次の手順の後に、

includeCredentials が true の場合、ユーザーエージェントは request および response を与えて、レスポンスの Set-Cookie ヘッダーを解析して保存すべきである。

次の手順を追加する

  1. request および response を用いて Attribution ヘッダーを処理する

6. 集約

An 集約 サービスは、複数のアトリビューション情報を受け取り、 集約メトリックを生成する。

ユーザーエージェント実装は、集約に関して異なる要件を持つことになる。 しかし、集約処理にはいくつかの共通要素がある。

まず、ユーザーエージェントは、 集約サービスに関する情報で構成されるか、 あるいはそれを取得する必要がある。 これには、サポートされる集約方式と、 必要な構成が含まれる。

各集約方式は、 ヒストグラムがどのように行われるかを定義する必要がある:

集約方式はまた、 集約結果がサイトによってどのように取得されるかを定義する必要がある。

6.1. マルチパーティ計算による集約

A マルチパーティ計算 (MPC) システムとは、 複数の独立した主体が関与し、 合意された関数を協調して計算するものである。

この仕様は、Prio [PRIO] および 分散集約プロトコル (DAP) [DAP] に基づく MPC システムを使用する。 これは、入力に対するクライアント提供の正当性証明に依存することを特徴とする 二者間 MPC システムである。 これにより、システムへの送信サイズが多少増加するという控えめなコストで、 非常に効率的な MPC 動作が可能になる。

MPC を使用する集約サービスは、 事前定義された関数を計算するために協力する 2 つ以上の独立したサービスから構成される。

MPC が提供する基本的な保証は、 関数の定義された出力のみが、 明確に定義された漏えいとともに、 任意の主体に明らかにされることである。

MPC の保証は、 参加する主体の部分集合が誠実である範囲でのみ成り立つ。 Prio で使用される二者間 MPC では、 プライバシー、すなわち入力の機密性は、 いずれか一方の MPC オペレーターが誠実であり続ける限り維持される。 この MPC 構成は、いずれかの MPC オペレーターによる 出力の改ざんに対しては保護しない。

6.1.1. Prio と DAP

dap-18-histogram 集約方式は、Prio [PRIO] および分散集約プロトコル (DAP) [DAP] を使用する。 具体的には、この集約方式は、 Prio3L1BoundSum [PRIO-L1] 検証可能分散集約関数 (VDAF) [VDAF] を使用する。

DAP と Prio3L1BoundSum インスタンス化は、レポートがどのように準備され、 暗号化され、集約のために送信されるかを定義する。 DAP はまた、集約値がどのように取得されるか、 およびユーザーエージェントが集約サービスについて取得する必要のある 構成を定義する。

Prio3L1BoundSum を使用する際、 レポートには、MPC に参加するノードが 送信されたヒストグラムの合計が設定値未満であることを 確認できるようにする分散ゼロ知識証明が含まれる。 Prio3L1BoundSum は、 ヒストグラム合計が 2 の累乗未満であることのみを検証できる。 つまり、証明は、 正の整数値 n について合計が 2n 未満であることを確認する。

レポートを構築するために、 証明は、maxValue より大きい次の 2 の累乗である値に基づいて生成される。 これは、集約サービス が、 maxValue と次の 2 の累乗との間のレポートを拒否できないことを意味する。 その結果、悪意のある ユーザーエージェント は、 maxValue の値の最大 2 倍を集約ヒストグラムに寄与するレポートを 生成する可能性がある。 この証明は、maxValue が 2n − 1 に等しい場合に、 過剰な寄与の機会がないことを保証する; このような攻撃の相対的な影響は、 maxValue を、他の制約が許す限り 2n − 1 に近く設定することで 低減できる。

6.1.2. DAP 拡張

DAP への拡張 [DAP-ATTRIBUTION] は、このアプリケーションに必要である:

ユーザーエージェントは、生成するレポートを構築するために これらの拡張を使用する。

6.1.3. DAP 向けレポート暗号化

DAP レポートを構築するには、 バイト列 report を生成し、 検証済みコンバージョンオプション optionsサイト topLevelSiteサイトまたは undefined intermediarySite時点 now、 およびリスト整数 histogram が与えられたとき、
  1. lengthhistogramサイズとする。

  2. maxValueoptions.max value とする。

  3. chunkLength を (Math.ceil(log2(maxValue + 1)) + 1) * length の平方根を 最も近い整数に丸めたものとする。

  4. vdaf を、新しい PrioL1BoundSum VDAF [PRIO-L1] インスタンスとし、 lengthmaxValue、および chunkLength を渡す。

  5. microEpsilon を、options.epsilon に 1,000,000 を乗じ、その後正の Infinity 方向に丸めたものとする。

  6. caller を、intermediarySiteundefined でない場合は intermediarySite とし、 そうでなければ topLevelSite とする。

  7. taskConfig を、[DAP]Section 4.2 で定義されるように、次の値で TaskConfiguration インスタンスを 符号化することによって生成されるバイト 列とする:

    1. 空の task_info

    2. leader_aggregator_endpoint は DAP Leader の直列化された URL に設定され、 options.Aggregation Service 内の、選択された集約サービス実装定義の定義から取得される。 符号化された値は、構成された URL と falseフラグメントを除外するため)を指定して URL 直列化器 を呼び出すことによって生成される。

    3. helper_aggregator_endpoint は DAP Helper の直列化された URL に設定され、 options.Aggregation Service 内の、選択された集約サービス実装定義の定義から取得され、 leader_aggregator_endpoint 値と同じプロセスを用いて生成される。

    4. time_precision 値は 5。

    5. min_batch_size 値は 20。

    6. batch_mode 値は TBD(Distributed Aggregation Protocol (DAP) Extensions for the Attribution API § batch-mode を参照)。

    7. 空の batch_config

    8. vdaf_type 値は 7(A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap を参照)。

    9. vdaf_configuration は、lengthmaxValue、および chunkLength を用いて、 PrioL1BoundSum A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap に従って符号化される。

    10. タスク拡張の集合 extensions は、 16 ビット符号なし整数からバイト列へのマップである:

  8. taskID を、taskConfig を渡して Task Binding and In-Band Provisioning for DAP § task-id で説明されるプロセスによって生成されるバイト 列とする。

  9. ctx を、文字列 dap-18符号化された値と taskID を連結して形成されるバイト 列とし、 これは [DAP]Section 4.4.2.1 で定義される。

  10. reportID を、暗号学的に安全なランダムソース [RFC4086] からサンプリングされた 16 バイトとする。

  11. rand を、暗号学的に安全なランダムソース [RFC4086] からサンプリングされた 128 バイトとする。

  12. publicShareinputShares を、 ctxhistogramreportID(VDAF の "nonce" パラメーターとして)、 および rand を指定して、[VDAF]Section 4.1 で定義されるように vdaf.shard() を呼び出した結果とする。

  13. time を、 Unix epoch から now までのduration fromを 5 秒のdurationで除算し、 負の Infinity 方向に丸めた結果の整数とする。

  14. extensions を、16 ビット符号なし整数からバイト列へのマップとし、 次から構成される:

    • プライバシー 予算の拡張コードポイントは、 microEpsilon の値に対応付けられ、 UINT32、 値 microEpsilon、 および falseisLittleEndian 用)を指定して NumericToRawBytes を呼び出すことによって符号化される。

  15. reportMetadata を、reportIDtime、および extensions から生成される、符号化された DAP ReportMetadata とする。

  16. encryptedInputSharesリストとする。

  17. inputShares の各 share について、 順にSection 4.4.2.1 で説明される share を暗号化する方法に従う:

    1. pkR を、options.Aggregation Service によって示される集約サービスについて取得された、 集約サービスHPKE 構成 からの対応するロールの公開鍵とする。

      "dap-18-histogram" の URL は DAP Leader ロールを識別することが期待される。 実装は、両方の Aggregator について HPKE 構成を静的に取得する必要がある。 § 9.4 未構成のブラウザーを参照。 HPKE 構成はオンデマンドで取得されてはならない。 その取得に要する時間が、 measureConversion() の呼び出し元に情報を漏えいするためである。

    2. serverRole を、最初の項目(Leader)では値 2、 2 番目(Helper)では値 3 を持つバイトとする。

    3. info を、次を連結して形成されるバイト 列とする: 文字列 dap-18 input share符号化された値、 値 0x01 を持つバイト、および serverRole

    4. inputShareAAD を、 taskIDreportMetadatapublicShare、および taskConfig から、InputShareAad の構造に従って構築する。

    5. plaintextShare を、 空の集合(private_extensions 用)および sharepayload 用) から、PlaintextInputShare の構造に従って構築する。

    6. hpke を、同じHPKE 構成に基づく HPKE [RFC9180] インスタンスとする。

    7. encryptedShare を、pkRinfoinputShareAAD、および plaintextShare を渡して hpke.Seal<mode_base>() を呼び出した結果とする。

    8. encryptedShareencryptedInputShares付加する

  18. report を、reportMetadatapublicShareencryptedInputShares (2 つの値はそれぞれ Leader および Helper の暗号化された input share である)、 および DAP aggregator から取得された集約サービスHPKE 構成 から生成される、符号化された DAP Report とする。

  19. report を返す。

このアルゴリズムは、DAP 関連仕様のいくつかの詳細を複製している。 この文書とそれらの仕様との間に相違がある場合、 それはこの文書における意図しない誤りである。 DAP とやり取りする場合は、常に参照先の仕様に従う。

6.2. アンチリプレイ要件

ブラウザーによって生成されるコンバージョンレポートは、 レポートを要求したサイトによって消費されたプライバシー バジェット の量に結び付けられる。

集約 サービスは、同じレポートを複数回受け入れないことを保証 MUST である。

7. 差分プライバシー

この設計は、そのプライバシー設計の基礎として 差分プライバシー の概念を使用する。 [PPA-DP]

差分プライバシー とは、システムによって明らかにされる 私的情報の量を保証できる プライバシーの数学的定義である。 [DP] 差分プライバシーは、このシステムにおいて プライバシーを保護する唯一の手段ではないが、 最も厳密に定義され分析されている。 そのため、最も強いプライバシー保証を提供する。

差分プライバシーは、ランダム化されたノイズを使用して、 集約されたデータセットへの 私的データの寄与を隠す。 ノイズの効果は、データセットへの 個々の寄与を隠しつつ、 あらゆる集約分析の有用性を保持することである。

差分プライバシーを適用するには、 どの情報が保護されるかを定義する必要がある。 このシステムでは、保護される情報は、 単一のユーザー プロファイルのインプレッションであり、 単一のユーザーエージェント上で、 単一のエポックにわたり、 コンバージョンを登録する単一のウェブサイトについてのものである。 § 7.1 プライバシー単位では、この設計の含意を より詳しく説明する。

このアトリビューション設計は、 個別差分プライバシー と呼ばれる差分プライバシーの一形態を使用する。 このモデルでは、各ユーザーエージェントが、 寄与される情報を制限することを それぞれ個別に責任を負う。

この API の個別差分プライバシー設計には、 3 つの主要な構成要素がある:

  1. ユーザーエージェントは、プライバシーバジェットを使用して、 コンバージョンレポートを通じてデバイスから出る インプレッションに関する情報量を制限する。 § 7.2 プライバシーバジェットでは、これをさらに詳しく扱う。

  2. 集約 サービスは、任意のコンバージョンレポートが、 ユーザーエージェントによってそのために計上された プライバシーバジェットに従ってのみ 使用されることを保証する。 § 6.2 アンチリプレイ要件では、集約サービスに対する要件を より詳しく説明する。

  3. ノイズは集約サービスによって追加される。 § 7.3 差分プライバシーメカニズムでは、使用される可能性のある メカニズムを詳述する。

これらの対策を合わせることで、 各プライバシー単位について公開される情報に 制限が課される。

7.1. プライバシー単位

差分プライバシーの実装には、 何が保護されるかについての明確な定義が必要である。 これはプライバシー 単位として知られ、 プライバシー保護を受ける主体を表す。

このシステムは、3 つの値の組み合わせである プライバシー単位 を採用する:

  1. ユーザーエージェントプロファイル。 つまり、単一の人物によって使用される ユーザーエージェントのインスタンス。

  2. サイトであり、 インプレッションに関する情報を要求するもの (コンバージョンサイト)。

    インプレッションを登録するサイト (インプレッションサイト) は考慮されない。 それらのサイトは、このシステムから直接情報を受け取らない。

  3. 現在のエポック

これらの値のいずれかが変化すると、新しいプライバシー単位が生成され、 その結果、別個のプライバシーバジェットが生じる。 人が訪問する各サイトは、各エポックごとに 有界な量の情報を受け取る。

理想的には、プライバシー単位は 単一の人物である。 理想的ではあるが、有用なシステムを開発しつつ 人物との完全な対応を保証することは不可能であり、 それにはいくつかの理由がある:

7.1.1. プライバシー特性とその制限の形式的分析

Attribution におけるプライバシー保護は多層的である:

  1. サイトごとのバジェットは、任意の 1 つのコンバージョンサイトがユーザーについて学習できる量を制限する。

  2. グローバルバジェットは、すべてのサイトによってユーザーについて学習できる量に対するバックストップ制限を提供する。

  3. インプレッションサイトのクォータは、コンバージョンサイトが任意の 1 つの インプレッションサイト上のユーザーの活動について学習できる量を制限する。

  4. 各ユーザー操作後に維持されるカウンターは、API にデータを保存したり API から学習したりできるサイト数を制限する。

この仕様における形式的なプライバシー分析は、2 つの論文に基づいている。 1 つ目の [PPA-DP] は、オンデバイス個別 DP 会計の理論を 確立する。2 つ目の [PPA-DP-2] は、サイトごとのバジェットおよびグローバルバジェットによって与えられる 数学的なプライバシー保証へ分析を拡張する。

サイトごとのバジェットは、主要なプライバシー保護と見なされるべきである。サイトごとのバジェットは、 意味のある DP 保証を提供するように構成されるべきである。 しかし、[PPA-DP-2] の分析では、これらの保証を制限する 2 つの仮定が特定された:

  1. データ生成におけるクロスサイト適応性がないこと。 サイトの照会可能なデータストリーム (インプレッションおよびコンバージョン)は、他サイトからの過去の DP アトリビューション 結果とは独立に生成される must

  2. クロスサイト共有制限を通じた漏えいがないこと。 あるサイトからの照会は、 他のサイトへどのレポートが発行されるかに影響しては must not

要するに、どちらの仮定も実際には成り立たない。

システムには、時間の経過とともに 同じユーザーと相互作用し得る複数のサイトが関与するため、 クロスサイト適応性がないという仮定が必要である。 サイトは、互いの DP 測定に基づいて、ユーザーに表示する広告を変更する。たとえば、ある 広告主がアトリビューション 結果から、より良い広告を作る方法を学習した場合、一部のユーザーは 競合他社のサイトではなくそのサイトでコンバージョンする可能性がある。この場合、あるサイトが学習したこと -- それ自身のサイトごとのバジェットにのみ計上される -- は、競合他社から見えるデータ (またはデータの欠如)を変化させるが、 これはそれらの競合他社のサイトごとのバジェットには計上されない。

継続的な測定を提供するあらゆるシステムはこの性質を持つため、唯一の結論は この制限を受け入れることである。その制限は、グローバル DP バジェットと共有クォータを持つことを 正当化する理由の一部であり、 それが 2 つ目の仮定につながる。

複数のサイトにまたがる共有制限がある場合、クロスサイト漏えいがないという仮定が必要である。 そのような共有制限の例として、 グローバル DP 保証を提供することを目的とするグローバル安全制限がある。 一部のサイトからの measureConversion() 要求によって 共有制限に到達した場合、 他のサイトへのレポートがフィルターされることがある。たとえば、インプレッションを持っていることを知るサイトは、 共有制限に到達したかどうかについて何かを学習する。この情報は集約されノイズが加えられているものの、 そのバジェットを使い尽くしたサイトに関する情報であり、 そのサイトのサイトごとのバジェットを超える情報である。

共有制限を通じた漏えいは、それらの制限を悪用の制限手段としてのみ使用する動機となる。 サイトごとのバジェットの大きな倍数として共有制限を設定することで、 共有制限を悪用しようとするには少なくともその数のサイトによる協調が必要になる。 倍数を大きくすると、共有制限はプライバシー保護の手段としては有用性が低下し、 サービス拒否や類似の悪用形態に対する保護手段としてより適したものになる。

対照的に、分析は、グローバルバジェットが、これらの制限なしに 健全なグローバル個別 DP 保証を提供するように実装できることを示している。しかし、多くのサイトによる API の使用を サポートするには、グローバルバジェットはサイトごとのバジェットのかなり大きな倍数として 構成される必要がある。これは、それが提供する DP 保証は、いかなる仮定にも依存しないものの、 それだけでは意味のある DP 保護を提供できないことを意味する。したがって、サイトごとのバジェットが 主要な DP 保証を提供する。グローバルバジェットは、悪意あるサイトによる協調攻撃の場合の フォールバックと見なすことができる。

グローバル DP バジェットはまた、多数のサイトにわたってユーザー識別子をリンクして サイトごとのバジェットを結合できるサイトに対する保護にもなる。サイトごとのモデルはこの可能性を 考慮していないが、一部のサイトがこの能力を持つことは一般的である。特に、これには ID プロバイダー、 ユーザー識別子(電子メールアドレスや電話番号など)を受け取るサイト、 ナビゲーショントラッキング [NAV-TRACKING-MITIGATIONS] の使用に成功するサイト、 および何らかの理由でクロスサイト Cookie を使用できるサイト [WEB-WITHOUT-3P-COOKIES] が含まれる。 複数のサイトにわたって Attribution を使用することは、このようなサイトにとって協調の課題を もたらし得るが、サイトが活動を単一の人物にリンクする能力を持つ可能性は、システムのプライバシーに関する 包括的分析において無視できない。

7.1.2. ブラウザーインスタンス

各ブラウザーインスタンスは、別個のプライバシーバジェットを管理する。

ブラウザーインスタンス間の調整は可能かもしれないが、 期待されてはいない。 その調整により、公開される情報の総量を減らすことで プライバシーを改善できる可能性がある。 また、あるブラウザーインスタンス上のインプレッションが 別のブラウザーインスタンス上でコンバージョンされることを可能にすることで、 アトリビューションの有用性を改善する可能性もある。

異なる実装間の調整は、 現在この作業の範囲外である。 実装は、同じ人物のものとして知られているインスタンス間で ある程度の調整を行うことができるが、 これは必須ではない。

7.1.3. サイトごとの制限

ウェブサイトに公開される情報は、サイト に基づいて行われる。 これは、他のプライバシー関連機能で使用される同じ境界と一致する。

オリジンのようなより細かいプライバシー単位は、 追加情報の取得を些細なものにしてしまう。 同じ人物に関する情報を 複数のオリジンから収集できる。 その情報は、その後、Cookie [COOKIES] などを使用して、 サイト内での情報の自由な流れを悪用することで結合できる。

§ 7.2.2 安全制限では、この制限を悪用する攻撃と、 それらの攻撃から保護するために ユーザーエージェントによって実装される可能性のある追加の 安全 制限について論じる。

7.1.4. プライバシーバジェットエポック

サイトは、各プライバシー バジェットエポック (またはエポック)に 記録されたインプレッション を照会するために使用される 別個の差分プライバシーバジェットを受け取る。

このバジェットは、インプレッションに適用される。 それらはユーザーエージェントに登録され、 後で照会されるものであり、 コンバージョンではない。

分析 [PPA-DP] の観点からは、インプレッションの各 エポックは 別個のデータベースを形成する。 有限のプライバシーバジェット が、各データベースに対して行われるすべての照会にわたって強制される。

複数のエポックにまたがるインプレッションから コンバージョン レポートが生成されることは、プライバシー上の帰結を持つ。 ウェブサイトへの単一の訪問が、そのサイトに多くのエポックにわたる活動についての情報を与える可能性がある。 これには、その全期間にわたって コンバージョンサイトインプレッションの宛先として 識別されていることだけが必要である。 照会できるエポックの数は、ユーザーエージェントによって制限される。

目標は、実現可能な限り大きなエポックを設定することである。 より長い期間は、プライバシーと有用性のより良いバランスを可能にする。 なぜなら、サイトには任意の時点で より大きな全体バジェットを割り当てることができ、 同時に全体的なプライバシー損失率を低く保てるからである。 しかし、より長い間隔は、 プライバシーバジェットを完全に使い尽くしやすくし、 次の更新まで情報が得られなくなることを意味する。

エポック期間を 1 週間に設定する決定は、 おおむね恣意的である。 1 週間は、サイトがプライバシーバジェットをどのように使うかについて、 将来数日または数週間に起こり得る変更を考慮する 綿密な計画なしに、ある程度柔軟に判断できるのに十分であると期待される。

§ 7.2 プライバシーバジェットでは、バジェット処理のプロセスをより詳しく説明する。

7.2. プライバシーバジェット

ブラウザーはプライバシー バジェットを維持する。 これは、プライバシー損失の量を制限する手段である。

この仕様は、その基礎として (ε, δ)-差分プライバシーの個別形式を使用する。 このモデルでは、プライバシー損失は値 ε を用いて測定される。 δ 値は、集約にノイズを追加する際に 集約サービスによって扱われる。

各ユーザーエージェントインスタンスは、 プライバシーバジェットの管理に責任を負う。

要求される各コンバージョンレポートは、 レポートが消費するプライバシーバジェットの量を表す ε 値と、コンバージョンレポートで返され得る値の最大値を指定する。

7.2.1. プライバシーバジェットの差し引き

コンバージョンレポートのためにインプレッションを 検索するとき、 ユーザーエージェントは、それらのインプレッションが保存された プライバシーバジェットエポックのバジェットから 指定された ε 値を差し引く。 そのエポックプライバシーバジェットが 十分でない場合、 そのエポックのインプレッションは使用されない。

コンバージョン サイトmeasureConversion() を呼び出すたびに、 アトリビューション ロジックインプレッションを選択した エポックについて、 プライバシーバジェットが差し引かれる

次の図では、 インプレッションがいくつかの異なるサイトから記録され、 円で示されている。
time `--. .--' `--. .--' `--. .--' `--. .--' ^ | | | | | week 1 week 2 week 3 week 4 now ]]> サイト A サイト B サイト C サイト D サイト E 時間 第 1 週 第 2 週 第 3 週 第 4 週 現在
時間の経過に伴うインプレッションのストアの例

コンバージョン レポートは、「現在」と印された時点で要求される可能性がある。 そのコンバージョンレポートは、黒い円で示されたインプレッションを選択し、 サイト B、C、および E からのインプレッションに対応する。

その結果、コンバージョンサイトプライバシー バジェットは、 エポック 1、3、4、および 5 から 差し引かれるエポック 2 にはインプレッションが記録されていないため、 そのエポックからバジェットは 差し引かれない。

ユーザー エージェントプライバシーバジェットの枯渇をどのように管理するかは、 選択されたアトリビューション ロジックに依存する。

7.2.2. 安全制限

基本的なプライバシー単位は、 複数のサイトにわたって同じ人物の活動を関連付けることができる攻撃者による 攻撃に対して脆弱である。

サイトのグループは、共有所有権や強い合意がある場合などに、 活動を調整できることがある。 特定の訪問者が同じ人物であることを、FedCM [FEDCM] のようなものを含む 任意の手段で確信できるサイトのグループは、この API から得られた情報を結合できる。

これは、協調が行われるサイト数に比例して、 サイトがアトリビューションから情報を得る速度を 増加させるために使用できる。 既定のプライバシー単位は、 このように公開される情報に制限を課さない。

この効果に対抗するために、ユーザーエージェントは 安全制限を実装できる。 これは、サイトを考慮しない追加のプライバシーバジェットである。 安全制限は、通常の閲覧活動の大部分では到達しないように、 サイトごとのバジェットよりもかなり高く設定される可能性がある。 目標は、それらが集中的な活動または攻撃を受けている場合にのみ 有効になることを保証することである。

サイトごとのプライバシーバジェットと同様に、 サイトがコンバージョンレポートの要求によって 安全制限を超えたかどうかを判定できないことが 重要である。

7.3. 差分プライバシーメカニズム

差分プライバシーメカニズム、すなわちノイズを追加する具体的な方法は、 集約 サービスによって選択できる。

ラプラスノイズを追加することは、 ノイズの全体的な大きさと 実装および分析の単純さとのバランスを取り、 良好な結果を生むことが期待される。 現在の設計は、L1 ノルムに基づく DP 感度を使用し、 これは集約で追加されるラプラスノイズをサポートする。 他のノイズメカニズムをサポートするには、感度の計算方法および通知方法に 追加の変更が必要になる場合がある。

これらの集約サービスのいずれについても定義されるように、 中央の場所でノイズを追加することにより、 レポート総数が増加しても ノイズの総量が増加しないことが保証される。 これは、レポートが生成される時点でノイズを適用する 差分プライバシー設計 (すなわちローカル差分プライバシーモデル)に比べて、 有用性の利点を提供する。 そのモデルでは、ノイズはレポート総数に比例して増加する。

8. セキュリティ上の考慮事項

8.1. インプレッションストア

Attribution API によって使用されるインプレッションストアは、 閲覧活動に関連する情報を保持し、 閲覧セッションをまたいで永続化する。 インプレッションストアを通じた情報の流れは 厳密に制御されているが、 それはオリジンをまたいで一定量の情報を運ぶ。

次の対策は、インプレッションストアを通じた 有害な情報の流れの可能性を制限する:

8.2. 実装におけるサイドチャネルリスク

Attribution API は、必要なセキュリティおよびプライバシー特性を維持するために 注意深く実装されなければならない。 API を呼び出すサイトは、次のことを知ることができない:

明示的な戻り値や送出された例外だけが、 サイトが Attribution API から学習できる方法ではないことに注意。 次のようなサイドチャネルから、 機密情報を推測できる可能性がある:

API 内の関数の実行時間のばらつきは、 保証を維持するための主要な考慮事項である。 実行時間に関して特に懸念される 2 つの要因がある:

グローバルプライバシーバジェットストアインプレッションサイトクォータストア、 およびエポック開始時刻 における共有グローバル状態は、 それらの値がアルゴリズムの実行時間に直接影響しないため、 リスクは比較的低い。 実装は、それでも任意のグローバル状態が フィンガープリント や他の情報漏えいに寄与しないことを保証する必要がある。

すべてのサイドチャネルを完全に排除することは非現実的であるが、 実装は、アトリビューション API からの機密情報の漏えいを防ぐために 合理的な努力を行わなければならない。 漏えいを防ぐ戦略には次のものが含まれる:

8.3. 集約サービス

ウェブプラットフォームの一部ではないものの、 集約サービスのセキュリティは、 Attribution メカニズム全体のセキュリティにとって非常に重要である。 measureConversion() によって生成されるコンバージョンレポートは、 集約サービスの暗号鍵を使用して暗号化される。 したがって、これらのレポートに含まれる情報の開示可能性の多くは、 集約サービスの詳細に依存する。

ユーザー エージェント開発者は、Attribution API のサポートサービスとして追加する前に、 集約サービスの設計と 集約サービス運用者の信頼性を慎重に検討すべきである。 これらの問題に関する追加の議論は、 § 6 集約および§ 9 プライバシー上の 考慮事項にある。

8.4. 複数サイトからのレポートの結合

Attribution API におけるプライバシーメカニズムは、 主にサイトの粒度で動作する。 悪意ある運用者は、 複数のサイトについてインプレッションを 登録しようとする可能性があり、 それにより、アトリビューションを通じて本来公開される情報量を 超過する。 § 7.2.2 安全制限では、この可能性を緩和するために 追加のクロスサイトプライバシーバジェットを確立することについて論じる。

8.5. クロスサイト参加の制御

集約ヒストグラムを生成するには、 複数のサイトが協力する必要がある。 各インプレッションサイトは、 保存するインプレッションについて 一貫した値を生成する必要がある。 コンバージョンサイトは、 正しい値を記録することについてインプレッションサイトを 信頼する必要がある。

API は、集約を汚染し得る望ましくないインプレッションのリスクを サイトが管理するのを助けるために、 多数のフィルタリングオプションを提供する。

フィルタリングオプションは、 アトリビューションに参加できるサイトを制限するうえで有用であり、 これにより集約結果を汚染できる主体の集合が減少する。 これらのオプションを効果的に使用することは、 望ましくないインプレッションの偶発的な包含を防ぐうえで特に有用である。

これらのフィルタリングオプションは、 結果を汚染しようとする悪意ある試みに対しては 効果が限定的である。 信頼は、これらの制御が想定するほど厳密に二値的であることは稀である。 一覧に含まれるインプレッションサイトは、 コンバージョンサイトの観点から真正なインプレッションと、 偽造または誤ったインプレッションを混在させる可能性がある。 誤ったインプレッションは、Invalid Traffic (IVT) とみなされるものを表し、 その一部は不正と見なされる可能性がある。

8.5.1. 広告不正

ウェブ上の広告は、 さまざまな種類の不正の対象となってきた。 サイトは、この API を使用してインプレッション不正を行い、 自分たちに配置された広告に価値が誤って帰属されたという印象を 作り出そうとする可能性がある。

インプレッションの不正登録は、この API において特に懸念される。 なぜなら、インプレッションはデバイス上にのみ保存されるからである。 不正なインプレッションを識別してアトリビューションから除外するために サーバー側の知能を適用することはできない。

悪意あるインプレッションに対する唯一の直接的な緩和策は、 サイトレベルのフィルタリングオプションである。 これにより、完全に信頼されていないサイト上のインプレッションが、 意図された候補インプレッション集合へのアトリビューションを妨害することを防ぐ。

逆に、コンバージョンレポートは暗号化されているにもかかわらず、 レポートはコンバージョンサイトに送信されるため、 コンバージョンサイトは、そのコンバージョンが不正である可能性が高いと判断し、 それを集約から除外できる。

9. プライバシー上の考慮事項

この API の主なプライバシー目標は、 サイトにアトリビューションを実行する能力を提供しても、 それらのサイトがクロスサイト認識を行う能力を 向上させないことを保証することである。

このセクションは、この目標を達成するために必要な保護について より多くの情報を提供する。 追加の議論では、同一サイト認識の防止など、 副次的なプライバシー目標について述べる。

9.1. Attribution API によって公開される情報

インプレッションストアプライバシーバジェット ストアは、 閲覧活動の横断的な情報を含む。 API の使用が増えるにつれて、 この情報の範囲も広がる。 しかし、これらのストアに書き込まれる情報のほとんどは 決して開示されない。 アトリビューションはデバイス上で実行されるため (オンデバイスアトリビューション)、 帰属されたコンバージョンに関する情報のみが Attribution API によって公開される。これは、 インプレッションとコンバージョンの両方に関する情報が オフデバイスアトリビューションのために 集約サービスへ送信される他の方式とは対照的である。 後者の方式では、集約サービスの侵害 (または集約サービスとの通信の侵害)によって 明らかになり得る情報量が 著しく大きい。

Attribution API がアトリビューションを行うとき、そのアトリビューションに関する情報は、 差分プライバシー制限が許す範囲でのみ デバイスから公開される。

Attribution API は、比較的まれなコンバージョンイベントと、 関連する限定されたインプレッション候補集合との関連を測定することを意図しているが、 より大規模なデータ収集のために API が悪用される可能性を 考慮することが重要である。 インプレッションが可能なコンバージョン サイトを列挙する(およびその逆)という要件は、 API の大量データ収集への悪用を防ぎ、 そのような悪用の試みをより可視化するうえで重要な役割を持つ。

9.2. Attribution API の無効化

ユーザーエージェントは、ユーザーが Attribution API を無効化するための制御を提供 must

Attribution API は、 集約情報のみを公開するように設計されている。 差分プライバシーの使用により、 特定のユーザーが集約出力に寄与したかどうかを判定できる可能性が 制限される。 しかし、一部のユーザーはそれでも、 アトリビューション測定に参加しないことを望む場合がある。

実装は、Attribution API 専用の制御を使用するか、 複数の機能に適用される統合プライバシー制御を通じて、 ユーザーにオプトアウトの選択肢を提供できる。

ユーザーエージェント開発者は、他のプライバシーモードと Attribution API との相互作用を考慮すべきである。 たとえば、アトリビューションはプライベートブラウジングモードで無効化されるかもしれず、 またはユーザーが診断データの収集からオプトアウトしている場合に 無効化されるかもしれない。

設計上、ユーザーがオプトアウトしたかどうかはウェブサイトから検出できない。

フィンガープリンティングのリスクを最小化し、 Attribution API を無効化することを選んだユーザーに対する差別を防ぐため、 サイトは API が無効であることを検出できては must not。 具体的には、その他の点で有効な Attribution API へのすべての呼び出しは、 API が無効であっても正常に完了する。 振る舞いの唯一の違いは、 API が無効な場合に返されるコンバージョン レポートが、 コンバージョン値を決して報告しないことである。 レポートは暗号化されているため、 この違いはコンバージョンレポートを受け取るサイトには検出できない。

9.3. 可視性

実装は、ユーザーがインプレッションストアの状態を表示し、 過去のレポート送信を確認する方法を提供する should

これらのインターフェイスは、 サイトによる Attribution API の集約的な使用を示す 要約情報に限定される場合がある。 インプレッションおよび送信されたレポートの詳細を調べるインターフェイスは、 ユーザーとウェブ開発者の双方による API の動作診断を可能にする可能性がある。

9.4. 未構成のブラウザー

この API は、ユーザーエージェントインスタンスが measureConversion() への要求に答えるために必要な すべての構成を持つことを前提としている。

measureConversion() を呼び出すために必要な 集約 サービス構成が 存在しない、または古くなっている場合、 それはサイトから観測可能である可能性がある。

構成の取得が measureConversion() への呼び出しの解決を 遅延させ得る場合、 これはタイミングサイドチャネルを作り出す。 代わりに偽の応答が生成される場合、 適切に構成されたユーザーエージェント からの応答と偽の応答との違いが 観測可能である可能性がある。 これは鍵識別子または 他の暗号化されていないメタデータの使用であるかもしれない。 暗号文長の違いも、暗号化される内容の変更や アルゴリズム選択の変更を明らかにする可能性がある。

古い構成または存在しない構成の検出は、 ユーザーエージェントフィンガープリントするために使用される可能性がある。

ユーザー エージェントはしたがって、 サイトから観測できない方法で 集約サービス構成の取得を優先する should。 これは、コンテンツの読み込みを開始する前に、 起動時に構成を取得することで達成されるかもしれない。

必要な構成を取得できない場合、 または明らかに古い場合、 実装は measureConversion() が呼び出されたときに ただちに拒否することを選択するかもしれない。 これは情報を漏えいするが、 偽の値を生成しようとするよりは漏えいが少ない可能性がある。

9.5. 保存されたインプレッションに識別情報を含めること

サイトは、 matchValue または他のフィールドを使用して、 インプレッション内に一定量のデータを符号化できる。 API は、サイトがこれらのフィールドにユーザー識別子を符号化することを 防止しない。 アトリビューションプロセスは、 コンバージョンレポートを構築する際に このデータを使用でき、 これは、その識別情報が そのレポートを受け取るサイトに利用可能になるリスクを含意する。 次の対策はこのリスクを緩和する:

9.6. 第三者コンテキストでの使用

Attribution API は第三者コンテキストでも利用可能である。 特に、第三者 iframe は saveImpression() を呼び出すことができる。 ただし、インプレッションは iframe の オリジンではなく、 トップレベルナビゲーションコンテキストのサイトで記録されることに注意。

第三者コンテキストで API が利用可能であることは、 プライバシーリスクをいくらか増加させるが、 iframe は広告を表示するために一般的に使用されるため、 このサポートは必要と見なされる。

9.7. API 状態の消去

ユーザー エージェントは、ストレージを消去するオプションを提示する場合がある。 これらは 2 つの理由で存在する:

プライバシーバジェット消費を追跡する状態を消去することは、 サイトに対するプライバシーに悪影響を及ぼす。 そうすると、サイトはアトリビューションから より多くの情報を得ることができるようになる。

ユーザー エージェントは、API が無効であるとき、 プライバシー バジェットストアおよびエポック開始時刻 からデータを消去してもよい。 その場合、API が再び有効化されたとしても、 API が無効であった以前にどのバジェットが消費されたかを 判断する方法はない。 その場合、ユーザーエージェントは、 プライバシー バジェットが意図せず超過されないように、 last browsing history clear の値を更新できる。

9.7.1. サイトデータの消去

ユーザーの要求により サイトデータを消去するが、 閲覧履歴は保持する場合、 ユーザー エージェントは、影響を受けるサイト集合、 false(forgetVisits 用)、 および操作が行われた時刻を与えて、 clear browsing history for attribution を呼び出す。 これはそのサイトのプライバシーバジェットをゼロに設定し、 そのサイトでのコンバージョン測定の使用を防止する。 これはインプレッションストアから保存されたインプレッションを削除しない; 論理的には、インプレッションは保存された時点で コンバージョンサイトへ転送される。

サイトの要求により、 `Clear-Site-Data` ヘッダーの使用を通じて サイトデータを消去する場合、 ユーザー エージェントは、プライバシーバジェットストア またはエポック開始 時刻のいずれも変更せず、 インプレッションを削除するだけである。

9.7.2. 閲覧履歴の消去

閲覧履歴を消去する場合、 プライバシー バジェットストアを更新するだけでは不十分である。 サイトに対するプライバシー損失を防ぐために必要な サイトごとの 情報を保持すると、 コンピューターの他のユーザーが発見できる サイト訪問に関する情報が残る。

閲覧履歴を消去するユーザーエージェントは、 影響を受けるサイト集合、 true(forgetVisits 用)、 および操作が開始された時刻を与えて、 clear browsing history for attribution を呼び出す。

閲覧履歴を消去するとき、 ユーザー エージェントは、 サイトごとのすべてのプライバシーバジェット情報を 削除する必要がある (つまり、プライバシーバジェットストアからエントリーを削除する)。 ユーザー エージェントはまた、 その情報を失った結果として、 その後の任意のプライバシー バジェット消費が 構成された制限を超えるプライバシー損失を引き起こせないようにする必要がある。

これは、閲覧履歴が破棄された エポック についてアトリビューションを無効化することで達成できる。 そうしない場合、履歴の消去の直前に そのバジェットを消費したサイトは、 状態の消去がなければ API を通じて学習できた量を超えて 学習できることになる。

これは、影響を受けるサイトについて、そのエポックの残りの期間 API を無効化する。 エポック開始 時刻は消去されないため、 エポック タイムラインは連続したままである。

ユーザー エージェントは、 last browsing history clear 値において 履歴が最後に消去された時刻を記憶する。 これは、サイトユーザー エージェントが選択した最大許可プライバシーバジェットを超過できないことが保証されるまで、 バジェット消費を防ぐために使用される。

get the starting epoch for attribution アルゴリズムは、 コンバージョン サイトが、 状態が消去された時点から 1 エポック 期間内に 開始する任意のエポックからの インプレッションを 照会できないことを保証する。

9.7.3. インプレッションの消去

インプレッションストアを消去するメカニズムが 提供されなければならない。 たとえば、インプレッションストアは、 Attribution API を無効化する制御の有効化時に 消去される可能性がある。

ユーザーエージェントが 保存データ(履歴、Cookie など)を消去するために提供する任意のメカニズムは、 インプレッションストアを対象に拡張されることが推奨される。 § 9.7 API 状態の消去は、 保存データの消去に関するより詳細な情報を提供する。

ユーザー エージェントサイトの状態を消去する場合、 影響を受ける期間中に保存され、 一致するインプレッションサイト またはコンバージョンサイトを持つ すべての保存された インプレッションを破棄しなければならない。 インプレッションサイトについては、 これらのインプレッションは 消去された活動に関連する。 状態が消去されたコンバージョンサイトは、 これらのインプレッションを使用できない。

インプレッションのうち、 一致する 仲介サイトを持つものは、 保持されてもよい。

9.8. 時計の選択

この API は、時刻の基礎として 壁時計を使用する。 これは主に、API が永続的な時間の概念に依存するためである。 単調時計は、 ユーザー エージェントの単一実行中にのみ定義されるため、 ユーザーエージェントが再起動された場合の 一貫性は保証されない。

壁時計は、 クロックドリフトにより蓄積する可能性のある誤差を補正するために調整できる。 したがって、壁時計は、 常に一定の速度で進むことを保証されず、 時には減少する可能性も含む。

壁時計の減少は、 この API が提供するプライバシー保証に影響しない。 時計の増加だけが、 プライバシーに悪影響を及ぼし得る。 通常の時間の進行を上回る増加は、 プライバシーバジェットが意図よりも早く 更新される結果をもたらす可能性がある。

エポック内で補正が行われる時計については、 時計調整はプライバシーに影響しない。 十分に大きな単一の補正は、 プライバシー バジェットが予定より早く更新され、 一回限りのプライバシー損失の増加をもたらす可能性がある。 継続的な大きな補正はプライバシーに最も深刻な影響を与える。 なぜなら、各エポック間の遷移ごとに 追加のプライバシーバジェットが公開されるためである。

時間が非常に大きく増加して エポック全体を飛び越える場合でも、 追加のプライバシー損失は生じない。 インプレッション保存できない限り、 プライバシー損失は起こり得ない。

もちろん、時計に対して大きな、または継続的な補正を必要とする 任意のユーザーエージェントは、 それが報告する時刻の結果として、 高度に識別可能である可能性が高い。 それだけで、望ましくないクロスサイト認識を可能にするには十分である可能性が高い。

10. 謝辞

この仕様は、多くの人々による多大な作業の結果である。 このレベルの API の大まかな形は、Luke Winstrom のアイデアに基づいている。 プライバシーアーキテクチャは、[PPA-DP] の著者たちによるものである。

適合性

文書 慣例

適合性要件は、 説明的な主張と RFC 2119 用語の組み合わせによって表現される。 この文書の規範的部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されているように解釈される。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限らない。

明示的に非規範的と標示されたセクション、例、および注を除き、 この仕様のすべてのテキストは規範的である。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 または次のように、 class="example" によって 規範的テキストから区別される:

これは参考的な例の一例である。

参考的な注は “Note” という語で始まり、 次のように、 class="note" によって 規範的テキストから区別される:

注:これは参考的な注である。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現される要件 ("strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されるキーワード ("must", "should", "may" など)の意味で 解釈される。

アルゴリズムまたは特定のステップとして表現される適合性要件は、 最終結果が同等である限り、 任意の方法で実装できる。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、 高性能であることを意図していない。 実装者には最適化が推奨される。

索引

この 仕様で定義される用語

参照により定義される用語

参考文献

規範参考文献

[CLEAR-SITE-DATA]
Mike West. Clear Site Data. 2017年11月30日. WD. URL: https://www.w3.org/TR/clear-site-data/
[CSS-2025]
Chris Lilley; ほか. CSS Snapshot 2025. 2025年9月18日. NOTE. URL: https://www.w3.org/TR/css-2025/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位 モジュール レベル 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; ほか. カスケーディングスタイルシート レベル 2 リビジョン 1(CSS 2.1)仕様. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[DAP]
Tim Geoghegan; ほか. プライバシー保護測定のための分散集約 プロトコル. 2024-04-29. URL: https://datatracker.ietf.org/doc/html/draft-ietf-ppm-dap-16
[DAP-ATTRIBUTION]
Martin Thomson. Attribution API のための分散 集約プロトコル(DAP)拡張. 2026-02-18. URL: https://datatracker.ietf.org/doc/html/draft-thomson-ppm-dap-attribution-01
[DAP-TASKPROV]
Shan Wang; Christopher Patton. DAP のためのタスクバインディングと インバンドプロビジョニング. 2025-09-05. URL: https://datatracker.ietf.org/doc/html/draft-ietf-ppm-dap-taskprov-03
[DOM]
Anne van Kesteren. DOM 標準. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch 標準. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高解像度時刻. 2026年3月24日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; ほか. HTML 標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 2026年6月18日. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[PRIO-L1]
Martin Thomson; David Cook. 寄与に L1 ノルム境界を持つ ベクトル和のための Prio インスタンス化. 2024-10-21. URL: https://datatracker.ietf.org/doc/draft-thomson-ppm-l1-bound-sum/
[RFC2119]
S. Bradner. 要求レベルを示すために RFC で 使用されるキーワード. 1997年3月. 最良現行慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SECURE-CONTEXTS]
Mike West. セキュアコンテキスト. 2023年11月10日. CRD. URL: https://www.w3.org/TR/secure-contexts/
[URL]
Anne van Kesteren. URL 標準. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. Living Standard. URL: https://webidl.spec.whatwg.org/

非規範参考文献

[COOKIES]
A. Barth. HTTP 状態管理メカニズム. 2011年4月. 提案標準. URL: https://httpwg.org/specs/rfc6265.html
[COPPACALYPSE]
Garrett Johnson; ほか. COPPAcalypse? YouTube 和解が子ども向けコンテンツに与えた影響. 2024-03-14. URL: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4430334
[DP]
Cynthia Dwork; Aaron Roth. 差分プライバシーの アルゴリズム的基礎. 2014. URL: https://doi.org/10.1561/0400000042
[EU-AD]
Niklas FOURBERG; ほか. オンライン 広告:ターゲティング広告が広告主、市場アクセス、および消費者の 選択に与える影響. 2021-06. URL: https://www.europarl.europa.eu/thinktank/en/document/IPOL_STU(2021)662913
[FEDCM]
Nicolas Pena Moreno. Federated Credential Management API. 2024年8月20日. FPWD. URL: https://www.w3.org/TR/fedcm-1/
[FREE-GDP]
Leonard Nakamura; Jon D. Samuels; Rachel Soloveichik. GDP および生産性勘定内での 「無料」デジタル経済の測定. 2017-10. URL: https://www.bea.gov/research/papers/2017/measuring-free-digital-economy-within-gdp-and-productivity-accounts
[NAV-TRACKING-MITIGATIONS]
ナビゲーション追跡の 緩和策. Editor's Draft. URL: https://privacycg.github.io/nav-tracking-mitigations/
[ONLINE-ADVERTISING]
Avi Goldfarb; Catherine Tucker. オンライン 広告. URL: https://doi.org/10.1016/B978-0-12-385514-5.00006-9
[PPA-DP]
Pierre Tholoniat; ほか. Cookie Monster:差分 プライバシー広告測定システムのための効率的なオンデバイス予算管理. URL: https://arxiv.org/abs/2405.16719
[PPA-DP-2]
Pierre Tholoniat; ほか. Big Bird:W3C のプライバシー保護 Attribution API のためのプライバシー予算管理. URL: https://arxiv.org/abs/2506.05290
[PRIO]
Henry Corrigan-Gibbs; Dan Boneh. Prio:集約統計の プライベートで堅牢かつスケーラブルな計算. 2017-03-14. URL: https://crypto.stanford.edu/prio/paper.pdf
[RFC3492]
A. Costello. Punycode:アプリケーションにおける 国際化ドメイン名(IDNA)のための Unicode の Bootstring 符号化. 2003年3月. 提案 標準. URL: https://www.rfc-editor.org/info/rfc3492/
[RFC4086]
D. Eastlake 3rd; J. Schiller; S. Crocker. セキュリティのためのランダム性要件. 2005年6月. 最良現行慣行. URL: https://www.rfc-editor.org/info/rfc4086/
[RFC5890]
J. Klensin. アプリケーションのための 国際化ドメイン名(IDNA):定義と文書フレームワーク. 2010年8月. 提案標準. URL: https://www.rfc-editor.org/info/rfc5890/
[RFC6761]
S. Cheshire; M. Krochmal. 特殊用途ドメイン 名. 2013年2月. 提案標準. URL: https://www.rfc-editor.org/info/rfc6761/
[RFC9180]
R. Barnes; ほか. ハイブリッド公開鍵 暗号化. 2022年2月. 情報提供. URL: https://www.rfc-editor.org/info/rfc9180/
[STORAGE]
Anne van Kesteren. Storage 標準. Living Standard. URL: https://storage.spec.whatwg.org/
[UNSANCTIONED-TRACKING]
Mark Nottingham. 認可されていない Web トラッキング. 2015年7月17日. TAG 所見. URL: https://www.w3.org/2001/tag/doc/unsanctioned-tracking/
[VDAF]
Richard L. Barnes; ほか. 検証可能な分散 集約関数. 2026-01-30. URL: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-18
[WEB-WITHOUT-3P-COOKIES]
サードパーティ Cookie のない Web. URL: https://www.w3.org/2001/tag/doc/web-without-3p-cookies/

IDL 索引

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Attribution attribution;
};

enum AttributionAggregationProtocol { "dap-18-histogram" };

dictionary AttributionAggregationService {
  required AttributionAggregationProtocol protocol;
};

[SecureContext, Exposed=Window]
interface AttributionAggregationServices {
  readonly maplike<USVString, AttributionAggregationService>;
};

[SecureContext, Exposed=Window]
interface Attribution {
  readonly attribute AttributionAggregationServices aggregationServices;
};

dictionary AttributionImpressionOptions {
  required unsigned long histogramIndex;
  unsigned long matchValue = 0;
  sequence<USVString> conversionSites = [];
  sequence<USVString> conversionCallers = [];
  unsigned long lifetimeDays = 30;
  long priority = 0;
};

dictionary AttributionImpressionResult {
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionImpressionResult> saveImpression(AttributionImpressionOptions options);
};

dictionary AttributionConversionOptions {
  required USVString aggregationService;
  double epsilon = 1.0;

  required unsigned long histogramSize;

  unsigned long lookbackDays;
  sequence<unsigned long> matchValues = [];
  sequence<USVString> impressionSites = [];
  sequence<USVString> impressionCallers = [];

  sequence<double> credit;
  unsigned long value = 1;
  unsigned long maxValue = 1;
};

dictionary AttributionConversionResult {
  required Uint8Array report;
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionConversionResult> measureConversion(AttributionConversionOptions options);
};