プライベート集計 API

非公式提案ドラフト,

この文書の詳細
このバージョン:
https://patcg-individual-drafts.github.io/private-aggregation-api
課題追跡:
GitHub
仕様内インライン
編集者:
(Google)

概要

プライバシーを保護する方法で、集約されたクロスサイトデータを測定するための汎用 API。 識別につながる可能性のあるクロスサイトデータは、 集約可能レポートにカプセル化される。漏えいを防ぐために、 このデータは暗号化され、集約サービスによってのみ処理できることが保証される。 処理中、このサービスはノイズを追加し、実行できるクエリ数に制限を課す。

この文書のステータス

この文書は個人によるドラフト提案である。これは Private Advertising Technology Community Group によって採択されていないが、その CG の会合で 議論される可能性がある。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されることに注意すること。 W3C Community and Business Groups についてさらに学ぶ。

1. はじめに

この節は非規範的である。

1.1. 動機

ブラウザーは現在、ストレージのパーティション化やサードパーティ Cookie の削除を含め、 クロスサイトでのユーザー追跡を防止するよう取り組んでいる。正当なユースケースを、 ユーザーのプライバシーを尊重する形で引き続きサポートするための API 提案は幅広く存在する。 これらの API の多くは、Shared Storage APIProtected Audience API を含め、 識別につながる可能性のあるクロスサイトデータを特殊なコンテキスト内に隔離し、 そのデータがユーザーエージェントの外へ漏れ出せないことを保証する。

個々のユーザーに由来するクロスサイトデータと比べると、ユーザー群についての集約データは より機微性が低く、それでいて広範なユースケースに十分であり得る。 ノイズ付きの集約されたクロスサイトデータのレポートを可能にするために、集約サービスが構築されている。 このサービスはもともと Attribution Reporting API で使用するために作成されたが、より汎用的な集約を可能にすることで追加の ユースケースをサポートする。特に、Protected Audience API と Shared Storage API はこの 機能が利用可能であることを想定している。

1.2. 概要

この文書は、クロスサイトデータにアクセスできる隔離されたコンテキスト (Shared Storage worklet など)から呼び出すことができる汎用 API の概要を示す。 これらのコンテキスト内では、識別につながる可能性のあるデータを "aggregatable reports" にカプセル化できる。漏えいを防ぐため、 これらのレポート内のクロスサイトデータは暗号化され、集約サービスによってのみ 処理できることが保証される。処理中、このサービスはノイズを追加し、実行できる クエリ数に制限を課す。

この API は、オリジンが aggregatable report を構築し、その暗号化ペイロードに埋め込む値 (後で集約サービスによって計算される)を指定できるようにする関数を提供する。 これらの呼び出しの結果、aggregatable report は、遅延の後にスクリプトのオリジンの レポート送信エンドポイントへ送信されるようキューに入れられる。エンドポイントが レポートを受信した後、それらをバッチ化し、処理のために集約サービスへ送信する。 その処理の出力は(近似)結果を含むサマリーレポートであり、スクリプトのオリジンへ 送り返される。

1.3. 検討された代替案

選択した API 形状の代わりに、fetch() にかなり近い設計に合わせることも検討した。 しかし、これを望ましくないものにする重要な違いがいくつかある:

したがって、以下で詳述する、より特化した API 形状を選択した。

2. 公開されるインターフェイス

[Exposed=(InterestGroupScriptRunnerGlobalScope,SharedStorageWorklet),
 SecureContext]
interface PrivateAggregation {
  undefined contributeToHistogram(PAHistogramContribution contribution);
  undefined contributeToHistogramOnEvent(DOMString event,
                                         record<DOMString, any> contribution);
  undefined enableDebugMode(optional PADebugModeOptions options = {});
};

dictionary PAHistogramContribution {
  required bigint bucket;
  required long value;
  bigint filteringId = 0;
};

dictionary PADebugModeOptions {
  required bigint debugKey;
};

Web Platform Design Principles に従い、 long[EnforceRange] long long に切り替えることを検討すべきである。

enableDebugMode(options) の 引数は既定値 {} を持つべきではない。あるいは、debugKeyPADebugModeOptions で必須であるべきではない。

PrivateAggregation オブジェクトは次のフィールドを持つ:

スコープ指定詳細 (既定値 null)

スコープ指定詳細または null

使用を許可されている (既定値 false)

boolean

既定の contributeToHistogramOnEvent() 処理を実行すべきか (既定値は常に true を返すアルゴリズム)

PrivateAggregationDOMString および(DOMString キーを持つ)mapを受け取り、boolean または exception のいずれかを返すアルゴリズム。

注: これにより、埋め込み API は すべての呼び出しまたは特定の呼び出しだけの処理をオーバーライドできる。 戻り値 true は、この呼び出しがこの仕様の既定の実装を用いて処理されることを示す。 戻り値が exception である場合、埋め込み API の処理が throw できるようにする。

注: 下記の グローバル スコープへの公開を参照。

contributeToHistogram(PAHistogramContribution contribution) メソッド手順 は次のとおりである:
  1. validationResult を、contributionthisスコープ指定詳細を与えて、ヒストグラムコントリビューションを検証する結果とする。

  2. validationResultexception である場合、validationResultthrow する。

  3. Assert: validationResultコントリビューションキャッシュ エントリである。

  4. validationResultコントリビューションキャッシュ追加する。

コントリビューションの 配列を受け入れることを検討する。[Issue #44]

contributeToHistogramOnEvent(event, contribution) メソッド手順は次のとおりである:
  1. defaultProcessingResult を、this既定の contributeToHistogramOnEvent() 処理を実行すべきかを、thisevent および contribution を与えて実行した結果とする。

  2. defaultProcessingResultexception である場合、defaultProcessingResultthrow する。

  3. defaultProcessingResult が false の場合、return する。

  4. contribution を、contributionJavaScript 値を IDL 型 PAHistogramContribution変換した結果に設定する。

    注: contribution に互換性がない場合、 これは TypeError を throw する。

  5. validationResult を、contributionthisスコープ指定詳細を与えて、ヒストグラムコントリビューションを検証する結果とする。

  6. validationResultexception である場合、validationResultthrow する。

  7. Assert: validationResultコントリビューションキャッシュ エントリである。

  8. event が "reserved." で始まらない場合、TypeErrorthrow する。

  9. unprefixedEvent を、event 内で "reserved." の長さから event長さまでのコード単位部分文字列とする。

  10. unprefixedEventいずれかの 内部エラー イベントである場合:

    1. maybeContributionCacheEntryエラーイベントunprefixedEvent とする。

    2. maybeContributionCacheEntryコントリビューションキャッシュ追加する。

注: 将来互換性のため、"reserved." で始まる認識されない イベントに対してはエラーを throw しない。

enableDebugMode(optional PADebugModeOptions options) メソッド手順は次のとおりである:
  1. scopingDetailsthisスコープ指定詳細とする。

  2. debugScope を、scopingDetailsデバッグスコープ取得手順を実行した結果とする。

  3. デバッグスコープ マップ[debugScope] が存在する場合、"DataError" DOMExceptionthrow する。

    注: これは、このデバッグスコープについて enableDebugMode() が既に実行されている場合に発生する。

  4. debugKey を null とする。

  5. options が与えられた場合:

    1. options["debugKey"] が 0 から 264 までの範囲(両端を除く)に含まれない場合、"DataError" DOMExceptionthrow する。

    2. debugKeyoptions["debugKey"] に設定する。

  6. debugDetails を、次の項目を持つ新しいデバッグ詳細とする:

    有効

    true

    キー

    debugKey

  7. 任意で、debugDetails を新しいデバッグ詳細に設定する。

    注: これにより、ユーザーエージェントは デバッグモードを全体的に、または特定の呼び出し元についてのみ利用不可にできる。

  8. Set デバッグスコープマップ[debugScope] を debugDetails にする。

エラーが適切な型であることを確認する。 たとえば InvalidAccessError は 非推奨である。

3. グローバルスコープへの公開

この API をグローバルスコープへ公開するには、型 PrivateAggregationprivateAggregation 属性読み取り専用として グローバルスコープ上に公開すべきである。そのgetter 手順は、privateAggregation を取得する 手順に this を与えたものに設定すべきである。

各グローバルスコープは、関連するdocumentが "private-aggregation" ポリシー制御機能使用を許可されているかどうかに基づいて、公開する PrivateAggregation オブジェクトの使用を許可されているを設定すべきである。

加えて、各グローバルスコープは、公開する PrivateAggregation オブジェクトのスコープ指定 詳細を null でない値に設定すべきである。 グローバルスコープは、API が利用可能であることが意図されるまで、そのフィールドの設定を待つべきである。

Shared Storage は、操作が 呼び出されている間に限り Private Aggregation を許可し、トップレベルコンテキストでは許可しない:
class ExampleOperation {
  async run(data) {
    privateAggregation.contributeToHistogram(...)  // これは許可される。
  }
}
register('example-operation', ExampleOperation);

privateAggregation.contributeToHistogram(...)  // これはエラーを引き起こす。

したがって、Shared Storage はモジュールスクリプトの初期実行が完了した直後にスコープ指定詳細を設定する。

バッチ処理スコープ取得手順によって返される任意の バッチ処理スコープについて、 同じバッチ処理スコープ、グローバルスコープの関連設定オブジェクトオリジン、何らかの コンテキスト型、およびタイムアウト(または null)を与えて、バッチ処理スコープについてコントリビューションを処理する 手順を後で実行すべきである。

注: この最後の要件は、異なるオリジンを持つ グローバルスコープが同じバッチ処理スコープを共有できないことを意味する。 同一オリジンポリシーの議論を参照。

デバッグスコープ取得手順によって返される任意の デバッグスコープについて、同じ デバッグスコープを与えて、 デバッグスコープを完了としてマークする 手順を後で実行すべきである。

注: 後続のアルゴリズムは、コントリビューションキャッシュ内の任意のコントリビューションキャッシュエントリについて、そのエントリのバッチ処理スコープを与えてバッチ処理スコープについてコントリビューションを処理する 手順が実行される前に、そのエントリのデバッグスコープを与えてデバッグスコープを完了としてマークする手順が 実行済みであることをassert する。

3.1. contributeToHistogramOnEvent() 処理のオーバーライド

各 API はまた、それが公開する PrivateAggregation オブジェクトについて、既定の contributeToHistogramOnEvent() 処理を実行すべきかアルゴリズムを設定してもよい。 このフックにより、埋め込み API は必要な任意の contributeToHistogramOnEvent() 呼び出しについて処理をオーバーライドできる。

このアルゴリズムは、この仕様で定義された通常の処理が(その呼び出しについて) 行われることを示すために true を返すべきである。埋め込み API の処理でエラーが発生したことを 示すために exception を返すべきである。 あるいは、埋め込み API がその呼び出しを処理するが、exceptionthrow されるべきではないことを示すために false を返すべきである。

埋め込み API がある呼び出しの処理をオーバーライドする場合(すなわち、アルゴリズムが true を 返さない場合)、errorEvent内部エラーイベントであるとき、« "reserved.", errorEvent » の連結である任意の event を受け入れるべきであり、 IDL 型 PAHistogramContribution変換可能JavaScript 値を持つ任意の contribution を受け入れるべきである。つまり、そのような場合に exception を返すべきではない。ただし、埋め込み API は この仕様で定義される既定の処理では受け入れられない追加の eventcontribution を受け入れてもよい。

埋め込み API が内部エラーイベントを条件とするコントリビューションを指定する 呼び出しの処理をオーバーライドする場合、埋め込み API は、そのコントリビューションを破棄する意図がない限り、 適切なエントリを用いて コントリビューションキャッシュにエントリを追加する を呼び出すべきである。

埋め込み API が追加のエラーイベントをサポートするために呼び出しの処理をオーバーライドする場合、 関連する条件が発生したかどうかが判定されるまで待たなければならない。カスタムエラーイベントが トリガーされた場合、関連するコントリビューションのエラーイベントとして already triggered external error を使用すべきである。カスタムエラーイベントがトリガーされなかった場合、コントリビューションは破棄されるべきであり、 それらのコントリビューションについて コントリビューションキャッシュにエントリを追加する の呼び出しは行われるべきではない。

また、埋め込み API が処理をオーバーライドする場合、コントリビューションキャッシュにエントリを追加するを 呼び出せるようになる前に、contribution を IDL 型 PAHistogramContribution へ変換しなければならないことにも注意すること。 これは、contribution が IDL 型へ自動的に変換可能JavaScript 値を持つかどうかにかかわらず適用される。

3.2. Private Aggregation を公開する API

この節は非規範的である。

この API は現在、2 つの API の仕様で定義されるグローバルスコープで公開されている:

  1. Shared Storage および

  2. Protected Audience

4. 構造

4.1. バッチ処理 スコープ

バッチ処理スコープは、一意な内部値であり、デバッグ詳細が 異ならない限り、どの PAHistogramContribution が 同じ aggregatable report で送信されるべきかを識別する。

一意な内部値は エクスポートされた定義ではない。infra/583 を参照。

4.2. デバッグスコープ

デバッグスコープは、同じ実行期間内の enableDebugMode() 呼び出しの有無によって、どの PAHistogramContributionデバッグ詳細が影響を受けるべきかを識別する 一意な内部値である。

4.3. スコープ指定 詳細

スコープ指定詳細は、次の項目を持つ struct である:
バッチ処理スコープ取得手順

バッチ処理スコープを返すアルゴリズム

デバッグスコープ取得手順

デバッグ スコープを返すアルゴリズム

4.4. デバッグ 詳細

デバッグ詳細は、次の項目を持つ struct である:
有効 (既定値 false)

boolean

キー (既定値 null)

符号なし 64 ビット整数または null。有効が false の場合、 キーは null でなければならない。

4.5. エラーイベント

内部エラーイベントは 次のいずれかである:
"report-success"

レポートがスケジュールされ、コントリビューションは破棄されなかった。

"too-many-contributions"

レポートはスケジュールされたが、レポートごとの制限により一部のコントリビューションが破棄された。

"empty-report-dropped"

コントリビューションがなかったため、レポートはスケジュールされなかった。

"pending-report-limit-reached"

レポートはスケジュールされたが、保留中レポートの上限に達した。 つまり、さらに 1 つレポートをスケジュールしようとすると、この上限により失敗する。

"insufficient-budget"

十分なコントリビューション予算がなかったため、レポート内の 1 つ以上のコントリビューション (またはレポート全体)が破棄された。

"contribution-timeout-reached"

コントリビューションのタイムアウトが発生した時点で、レポートに関連付けられたコンテキストが まだ実行中であった。

エラーイベントは、内部エラー イベントまたは特別な値 already triggered external error である。

注: この特別な値は、既に発生した任意の外部エラーイベントを 表す。外部エラーイベントは埋め込み API によって定義され、内部エラーイベントとは異なる。詳細は contributeToHistogramOnEvent() を参照。

すべてのエラーイベントは、 上で定義された順序のすべての内部 エラーイベントに続いて already triggered external error から構成される、listエラーイベントである。

4.6. コントリビューションキャッシュエントリ

コントリビューションキャッシュエントリは、次の項目を持つ struct である:
コントリビューション

PAHistogramContribution

エラーイベント (既定値 null)

エラーイベントまたは null。

注: これは、コントリビューションがどのエラーイベントを 条件としているか、またはコントリビューションが無条件である場合は null であることを示す。

バッチ処理スコープ

バッチ処理スコープ

デバッグスコープ

デバッグスコープ

デバッグ詳細 (既定値 null)

デバッグ詳細または null

4.7. 保留中の コントリビューション

保留中のコントリビューションは、次の項目を持つ struct である:

無条件コントリビューション (既定値: 新しい list)

PAHistogramContributionlist

条件付きコントリビューション (既定値: 新しい map)

map。そのキーエラーイベントであり、PAHistogramContributionlistである

トリガー済みエラーイベント (既定値: 新しい set)

内部エラーイベントset

4.8. 集約可能 レポート

集約可能レポートは、次の項目を持つ struct である:

レポート送信元オリジン

origin

元のレポート時刻

moment

レポート時刻

moment

コントリビューション

PAHistogramContributionlist

api

コンテキスト型

レポート ID

string

デバッグ詳細

デバッグ詳細

集約コーディネーター

集約コーディネーター

コンテキスト ID

string または null

filtering ID 最大バイト数

正の整数

最大コントリビューション数

正の整数

キュー済み

boolean

4.9. 集約コーディネーター

集約 コーディネーターは、許可された 集約コーディネーター集合含む originである。

ここや他の箇所で、 Attribution Reporting API が使用する suitable origin 概念へ切り替えることを検討する。

他の構造を、 見出し経由ではなくインラインで定義するよう移動する。 すべての小見出しを削除することも検討する。

4.10. コンテキスト型

コンテキスト型は、PrivateAggregation オブジェクトがどの種類のグローバルスコープで公開されたかを示す string である。Private Aggregation を公開する各 API は、これについて一意な文字列(または複数)を選ぶべきである。

4.11. 事前指定レポートパラメーター

事前指定 レポートパラメーターは、次の項目を持つ struct である:

コンテキスト ID (既定値: null)

string または null

filtering ID 最大バイト数 (既定値: 既定の filtering ID 最大バイト数)

正の整数

最大コントリビューション数 (既定値: null)

正の整数または null

5. ストレージ

ユーザー エージェントは、集約可能レポートlistである 集約可能レポートキャッシュを保持する。

ユーザー エージェントは、バッチ処理スコープから 集約 コーディネーターへの mapである 集約コーディネーターマップを保持する。

ユーザー エージェントは、バッチ処理スコープから 事前指定 レポートパラメーターへの mapである 事前指定レポートパラメーターマップを保持する。

ユーザー エージェントは、コントリビューションキャッシュエントリlistである コントリビューションキャッシュを保持する。

ユーザー エージェントは、デバッグスコープから デバッグ詳細への mapである デバッグ スコープマップを保持する。

他の箇所では、 ユーザーエージェントを使用するときに定義へリンクする。

5.1. ストレージの消去

ユーザーエージェントは、ユーザーが集約可能レポートキャッシュからデータを削除できるようにする制御と、 予算を問い合わせる アルゴリズムのために保存されたあらゆるコントリビューション履歴データを削除できるようにする制御を公開しなければならない。

ユーザーエージェントは、ユーザーがコントリビューションキャッシュデバッグスコープマップ、 および 事前指定レポートパラメーターマップからデータを削除できるようにする制御を 公開してもよい。

6. 定数

既定の filtering ID 最大バイト数は、明示的に選択されていない場合に使用される最大バイト数を制御する正の整数である。 その値は 1 である。

有効な filtering ID 最大バイト数範囲は、最大バイト数の許容値を制御する正の整数の setである。 その値は、1 から 8 までの範囲(両端を含む)である。

定数の追加を検討する。

7. 実装定義

許可された 集約コーディネーター集合は、有効な集約コーディネーターである originを制御する、originssetである。 この set内の各項目は、potentially trustworthy originでなければならない。

既定の 集約コーディネーターは、明示的に選択されていない場合にレポートでどれが使用されるかを制御する 集約コーディネーターである。

最大 maxContributionsは、集約可能レポートごとのコントリビューション数の上限を定義する正の整数である。

API ごとの既定 maxContributionsは、コンテキスト型から正の整数への mapである。 意味論的には、Shared Storage など、呼び出しコンテキストの種類ごとのレポートあたりの既定の コントリビューション数を定義する。この map 内の値は、呼び出し元が別の値を特に要求しない場合に使用される。 この map 内の各値は、最大 maxContributions 以下でなければならない。

最小レポート 遅延は、集約可能レポートを配信するための最小遅延を制御する、非負の duration である。

ランダム化レポート 遅延は、集約可能レポートを配信するためのランダムな遅延を制御する、正の duration である。この遅延は 最小レポート 遅延に追加される。

8. Permissions Policy 統合

この仕様は、文字列 "private-aggregation" によって識別されるポリシー制御機能を定義する。 その既定の許可リストは "*" である。

注: 使用を 許可されているフィールドは、この ポリシー制御機能に従って、この API と統合する他の仕様によって設定される。

9. アルゴリズム

整数をシリアライズするには、 可能な最短の 10 進数の string として表現する。

これは理想的には、 Infra のより記述的なアルゴリズムに置き換えられるべきである。 infra/201 を参照。

9.1. エクスポートされるアルゴリズム

注: これらのアルゴリズムにより、他の仕様はこの API と統合できる。

PrivateAggregation this を与えて privateAggregation を 取得するには:
  1. scopingDetailsthisスコープ指定詳細とする。

  2. scopingDetails が null の場合、"NotAllowedError" DOMExceptionthrow する。

    注: これは、たとえば読み込み後のスクリプトの 初期実行が完了していないために、API がまだ利用可能ではないことを示す。

    ここでの 開発者体験の改善を検討する(例: この場合を検出する方法)。

  3. this使用を許可されているが false の場合、 "InvalidAccessError" DOMExceptionthrow する。

  4. this を返す。

エラーが適切な型であることを確認する。 たとえば InvalidAccessError は 非推奨である。

コントリビューション キャッシュエントリ entry を与えて コントリビューションキャッシュにエントリを追加するには:
  1. entryコントリビューションキャッシュ追加する。

デバッグ スコープ debugScope を与えて デバッグ 詳細を取得するには、次の手順を実行する。これらは デバッグ詳細を返す。
  1. デバッグスコープ マップ[debugScope] が存在する場合、 デバッグスコープ マップ[debugScope] を返す。

  2. そうでなければ、新しいデバッグ詳細を返す。

デバッグ スコープ debugScope と、省略可能な デバッグ詳細または null の debugDetailsOverride(既定値 null)を与えて デバッグスコープを完了としてマークするには:
  1. debugDetailsdebugDetailsOverride とする。

  2. デバッグスコープ マップ[debugScope] が存在する場合:

    1. Assert: debugDetailsOverride は null である。

      注: オーバーライドは、デバッグ詳細が 他の方法で設定されていない場合に提供できる。

    2. debugDetailsデバッグスコープマップ[debugScope] に設定する。

    3. デバッグスコープマップ[debugScope] を削除する。

    4. debugDetailsキーが null でない場合、assert: debugDetails有効は true である。

  3. debugDetails が null の場合、debugDetails を新しいデバッグ詳細に設定する。

  4. コントリビューションキャッシュentry それぞれについて:

    1. entryデバッグスコープdebugScope である場合、 entryデバッグ詳細debugDetails に設定する。

事前指定レポートパラメーター preSpecifiedParamsコンテキスト型 api を与えて レポートを決定論的に送信すべきかを判定するには、 次の手順を実行する。これらは boolean を返す:
  1. preSpecifiedParamsコンテキスト IDが null でない場合、true を返す。

  2. preSpecifiedParamsfiltering ID 最大 バイト数既定の filtering ID 最大バイト数でない場合、true を返す。

  3. effectiveMaxContributions を、apipreSpecifiedParams最大コントリビューション数を用いて 最大コントリビューション数を判定する結果とする。

  4. defaultMaxContributionsAPI ごとの既定 maxContributions[api] とする。

  5. effectiveMaxContributionsdefaultMaxContributions でない場合、true を返す。

  6. false を返す。

注: コントリビューションがなかったという事実を隠すために 'null report' を送信する必要がある場合がある。たとえば、それ自体がクロスサイトデータである 予算が、要求されたコントリビューションに対して不足していた可能性がある。あるいは、呼び出し元が クロスサイトデータを読み取った後、コントリビューションを行わないことを選んだ可能性がある。 このようなシナリオでは、レポートが存在しないことにより、レポート送信エンドポイントへクロスサイトデータが 明らかになる可能性がある。レポート数を通じた漏えいからの保護を参照。

バッチ処理スコープ batchingScopeorigin reportingOriginコンテキスト型 contextType、 および moment または null の timeout を与えて バッチ処理スコープについてコントリビューションを処理するには:

注: 埋め込み API は、レポートが決定論的でない場合、 またはタイムアウトに既に達していた場合、すなわちそれがこの呼び出しをトリガーした場合、 timeout を null に設定することが期待される。(決定論的レポートでは、常にタイムアウトを設定しなければならない。)

  1. batchEntries を新しい list とする。

  2. コントリビューションキャッシュentry それぞれについて:

    1. entryバッチ処理スコープbatchingScope である場合:

      1. Assert: entryデバッグ詳細は null ではない。

        注: これは、バッチ処理スコープについて コントリビューションを処理する手順の前に、デバッグスコープを完了としてマークする 手順が実行されたことを assert する。

      2. entrybatchEntries追加する。

  3. aggregationCoordinator既定の 集約コーディネーターとする。

  4. 集約コーディネーター マップ[batchingScope] が存在する場合:

    1. aggregationCoordinator集約コーディネーター マップ[batchingScope] に設定する。

    2. 集約コーディネーター マップ[batchingScope] を削除する。

  5. preSpecifiedParams を新しい事前指定レポートパラメーターとする。

  6. 事前指定レポートパラメーター マップ[batchingScope] が存在する場合:

    1. preSpecifiedParams事前指定レポートパラメーター マップ[batchingScope] に設定する。

    2. 事前指定レポートパラメーター マップ[batchingScope] を削除する。

  7. isDeterministicReport を、preSpecifiedParamscontextType を与えてレポートを 決定論的に送信すべきかを判定する結果とする。

  8. isDeterministicReport が false の場合、assert: timeout は null である。

    注: タイムアウトは決定論的レポートにのみ使用できる。

  9. batchEntries空でありisDeterministicReport が false の場合、 return する。

  10. batchedContributions を新しい ordered map とする。

  11. batchEntriesentry それぞれについて:

    1. entryコントリビューションキャッシュから削除する。

    2. debugDetailsentryデバッグ詳細とする。

    3. batchedContributions[debugDetails] が存在しない場合、 batchedContributions[debugDetails] を新しい保留中のコントリビューション設定する。

    4. entryエラーイベントが null の場合:

      1. entryコントリビューションbatchedContributions[debugDetails] の無条件 コントリビューション追加する。

    5. そうでなければ:

      1. conditionalContributionsbatchedContributions[debugDetails] の条件付き コントリビューションとする。

      2. conditionalContributions[errorEvent] が存在しない場合、 conditionalContributions[errorEvent] を新しいlist設定する。

      3. entryコントリビューションconditionalContributions[errorEvent] に追加する。

  12. batchedContributions空である場合:

    1. debugDetails を新しいデバッグ詳細とする。

    2. batchedContributions[debugDetails] を新しい保留中のコントリビューションに設定する。

  13. batchedContributionsdebugDetailspendingContributions それぞれについて:

    1. reportingOrigincontextTypependingContributionsdebugDetailsaggregationCoordinatorpreSpecifiedParams および timeout を用いて、 レポート作成およびスケジュール手順を実行する。

注: これらの手順は、各レポートが 1 セットのメタデータしか 持てないため、デバッグ詳細に基づいて コントリビューションを分割する。

origin origin を与えて オリジンが集約コーディネーターであるかを判定するには、 次の手順を実行する。これらは boolean を返す。
  1. origin集約コーディネーターであるかどうかを返す。

USVString originString を与えて Private Aggregation コーディネーターを取得するには、 次の手順を実行する。これらは 集約コーディネーターまたは DOMException を返す。
  1. url を、originString に対してURL パーサーを実行した結果とする。

  2. url が failure または null の場合、名前 "SyntaxError" の新しい DOMException を返す。

    パスが空でない場合に エラーを throw することを検討する。

  3. originurloriginとする。

  4. origin を与えてオリジンが集約コーディネーターであるかを判定する 結果が false の場合、名前 "DataError" の新しい DOMException を返す。

  5. origin を返す。

origin originバッチ処理スコープ batchingScope を与えて バッチ処理スコープの集約コーディネーターを設定するには:
  1. Assert: origin集約 コーディネーターである。

  2. 集約コーディネーター マップ[batchingScope] を origin設定する。

他の箇所では、 一致させるためにアルゴリズムを <div algorithm> ブロックで囲み、 bikeshed/1472 に従ってすべてのアルゴリズムのスタイルを追加する。

事前指定レポートパラメーター paramsバッチ処理スコープ batchingScope を与えて バッチ処理スコープの事前指定レポート パラメーターを設定するには:
  1. contextIdparamsコンテキスト IDとする。

  2. Assert: contextId は null である、または contextId長さは 64 より大きくない。

  3. filteringIdMaxBytesparamsfiltering ID 最大 バイト数とする。

  4. Assert: filteringIdMaxBytes有効な filtering ID 最大バイト数範囲含まれる

  5. maxContributionsparams最大コントリビューション数とする。

  6. Assert: maxContributions は null である、または 0 より大きい。

  7. 事前指定レポートパラメーター マップ[batchingScope] を params設定する。

PAHistogramContribution contributionスコープ指定詳細 scopingDetails を与えて ヒストグラムコントリビューションを検証するには、 次の手順を実行する。これらは コントリビューションキャッシュエントリまたは exception を返す。
  1. contribution["bucket"] が 0 から 2128 までの範囲(両端を除く)に含まれない場合、 RangeError を返す。

  2. contribution["value"] が負である場合、RangeError を返す。

  3. batchingScope を、scopingDetailsバッチ処理スコープ取得手順を実行した結果とする。

  4. filteringIdMaxBytes既定の filtering ID 最大バイト数とする。

  5. 事前指定レポートパラメーター マップ[batchingScope] が存在する場合:

    1. filteringIdMaxBytes事前指定レポートパラメーター マップ[batchingScope] のfiltering ID 最大バイト数に設定する。

  6. contribution["filteringId"] が 0 から 256filteringIdMaxBytes までの範囲(両端を除く)に含まれない場合、RangeError を返す。

  7. 次の項目を持つ新しいコントリビューションキャッシュエントリを返す:

    コントリビューション

    contribution

    バッチ処理スコープ

    batchingScope

    デバッグスコープ

    scopingDetailsデバッグスコープ取得手順を実行した結果。

エラーが適切な型であることを確認する。 たとえば InvalidAccessError は 非推奨である。

9.2. レポートのスケジュール

origin reportingOriginコンテキスト型 api保留中の コントリビューション pendingContributionsデバッグ詳細 debugDetails集約コーディネーター aggregationCoordinator事前指定レポートパラメーター preSpecifiedParams および moment または null の timeout を用いて、レポート作成およびスケジュール手順を実行するには:
  1. Assert: reportingOriginpotentially trustworthy origin である。

  2. 任意で、return する。

    注: この 実装定義の条件は、 ユーザーエージェントが、たとえばユーザーの オプトアウト、オリジンが 登録されていないこと、 または保留中レポートの上限に達したことなど、さまざまな理由でレポートを破棄できるようにすることを意図している。

  3. currentWallTime現在の壁時計時刻とする。

  4. allUnmergedContributions を、reportingOriginapipendingContributionspreSpecifiedParamstimeout および currentWallTime を与えて、マージされていないすべてのコントリビューションをコンパイルする結果とする。

  5. isDeterministicReport を、preSpecifiedParamsapi を与えて レポートを 決定論的に送信すべきかを判定する結果とする。

  6. effectiveMaxContributions を、apipreSpecifiedParams最大コントリビューション数を用いて、 最大コントリビューション数を判定する結果とする。

  7. keptMergeKeys を新しい set とする。

  8. allUnmergedContributionscontribution それぞれについて:

    1. mergeKeycontributionマージキーとする。

    2. keptMergeKeysサイズeffectiveMaxContributions であり、かつ keptMergeKeysmergeKey含まない場合、continue する。

    3. そうでなければ、mergeKeykeptMergeKeys追加する。

  9. allUnmergedContributions から、keptMergeKeys含まれない マージキーを持つすべての項目を削除する。

  10. finalBudgetResults を、allUnmergedContributionsreportingOriginapicurrentWallTime および true を与えて 予算を問い合わせる結果とする。

  11. Assert: finalBudgetResultsサイズallUnmergedContributionsサイズに等しい。

  12. 0 から finalBudgetResultsサイズまでの範囲(上端を除く)の i それぞれについて:

    1. finalBudgetResults[i] が false の場合、 allUnmergedContributions[i] の value を 0 に設定する。

  13. allUnmergedContributions から、value が 0 であるすべての項目を削除する。

  14. mergedContributionsMap を新しい ordered map とする。

  15. allUnmergedContributionscontribution それぞれについて:

    1. mergeKeycontributionマージキーとする。

    2. mergedContributionsMap[mergeKey] が存在する場合、contributionvaluemergedContributionsMap[mergeKey] の value に加算する。

    3. そうでなければ、mergedContributionsMap[mergeKey] を contribution設定する。

  16. mergedContributionsmergedContributionsMapとする。

  17. Assert: mergedContributionsサイズeffectiveMaxContributions 以下である。

  18. mergedContributions空でありisDeterministicReport が false である場合、return する。

  19. report を、reportingOriginapimergedContributionsdebugDetailsaggregationCoordinatorpreSpecifiedParamstimeout および currentWallTime を与えて 集約可能レポートを取得する結果とする。

  20. report をユーザーエージェントの 集約可能レポートキャッシュ追加する。

origin reportingOriginコンテキスト型 api保留中の コントリビューション pendingContributions事前指定 レポートパラメーター preSpecifiedParamsmoment または null の timeout、および moment currentWallTime を与えて、 マージされていないすべてのコントリビューションをコンパイルするには、次の手順を実行する。これらは PAHistogramContributionlistを返す。
  1. wasTimeoutReached を、isDeterministicReport が true であり、かつ timeout が null であるかどうかを示すbooleanとする。

    Shared Storage から送信される timeout を更新して整合させる。

  2. pendingContributions、 "contribution-timeout-reached" および wasTimeoutReached を与えて、内部エラーイベント結果を記録する

  3. provisionalBudgetResults を、pendingContributions無条件 コントリビューションreportingOriginapicurrentWallTime および false を与えて 予算を問い合わせる結果とする。

  4. Assert: provisionalBudgetResultsサイズは、pendingContributions無条件 コントリビューションサイズに等しい。

  5. 0 から provisionalBudgetResultsサイズまでの範囲(上端を除く)の i それぞれについて:

    1. provisionalBudgetResults[i] が false の場合、 pendingContributions無条件 コントリビューション[i] の value を 0 に設定する。

  6. pendingContributions無条件 コントリビューションから、value が 0 であるすべての項目を削除する。

  7. insufficientBudget を、provisionalBudgetResults 内のいずれかの値が false であるかどうかを示す booleanとする。

  8. pendingContributions、 "insufficient-budget" および insufficientBudget を与えて、内部エラーイベント結果を記録する

  9. pendingReportLimitReached を、実装定義アルゴリズムによって判定される booleanとする。

    注: これは、予算問い合わせにおいて同時に保留中の レポート数の上限に達した(ただし超過していない)時点を示すことを意図している。

  10. pendingContributions、 "pending-report-limit-reached" および pendingReportLimitReached を与えて、内部エラーイベント結果を記録する

  11. isEmptyAndWouldBeDropped を、isDeterministicReport が false であり、かつ pendingContributions無条件 コントリビューション空であるかどうかを示す booleanとする。

  12. pendingContributions、 "empty-report-dropped" および isEmptyAndWouldBeDropped を与えて、内部エラーイベント結果を記録する

  13. effectiveMaxContributions を、apipreSpecifiedParams最大コントリビューション数を用いて 最大コントリビューション数を判定する結果とする。

  14. tooManyContributions を false とする。

  15. provisionallyApprovedMergeKeys を新しい set とする。

  16. pendingContributions無条件 コントリビューションcontribution それぞれについて:

    1. mergeKeycontributionマージキーとする。

    2. provisionallyApprovedMergeKeysサイズeffectiveMaxContributions であり、かつ provisionallyApprovedMergeKeysmergeKey含まない場合、 tooManyContributions を true に設定する。

    3. そうでなければ、mergeKeyprovisionallyApprovedMergeKeys追加する。

  17. pendingContributions、 "too-many-contributions" および tooManyContributions を与えて、内部エラーイベント結果を記録する

  18. pendingContributions無条件 コントリビューションから、provisionallyApprovedMergeKeys含まれない マージキーを持つすべての項目を削除する。

  19. reportSuccess を、次のいずれも true でないかどうかを示すbooleanとする: isEmptyAndWouldBeDroppedtooManyContributionsinsufficientBudgetpendingReportLimitReached

  20. pendingContributions、 "report-success" および reportSuccess を与えて、内部エラーイベント結果を記録する

  21. allUnmergedContributions を新しい list とする。

  22. すべてのエラーイベントerrorEvent それぞれについて:

    1. pendingContributions条件付き コントリビューション[errorEvent] が存在しない場合、 continue する。

    2. Assert: pendingContributionsトリガー済みエラーイベントerrorEvent含む、または errorEvent は "already triggered external error" である。

      注: 内部エラーイベントがトリガーされていないと 判定された場合、その条件付きコントリビューションは 内部エラーイベント結果を記録するにより削除される。

    3. allUnmergedContributionspendingContributions条件付き コントリビューション[errorEvent] で拡張する。

  23. allUnmergedContributionspendingContributions無条件 コントリビューション拡張する。

    注: エラーの測定成功を優先するため、無条件コントリビューションは 最後に置かれる。

  24. allUnmergedContributions を返す。

PAHistogramContribution contribution は、次の tuple である マージキーを持つ: (contributionbucket, contributionfilteringId)。

注: 同じレポートに対する 2 つの PAHistogramContribution は、 そのマージキーが同じである場合に、かつその場合に限り、マージできる。

PAHistogramContributionlist contributionsorigin originコンテキスト型 apimoment currentTime および boolean consumeIfPermitted を与えて、予算を問い合わせるには、 次の手順を実行する。これらは contributions と同じサイズを持つ booleanslistを返す。
  1. resultForEachContribution を新しい booleanslistとする。

  2. approvedValueSum を 0 とする。

  3. contributionscontribution それぞれについて:

    1. valueToRequestapprovedValueSum + contributionvalueとする。

      注: これにより、各コントリビューションの結果が、 この呼び出しから以前に承認されたコントリビューションを考慮することが保証される( consumeIfPermitted が false の場合であっても)。

    2. sufficientBudget を、valueToRequestoriginapi および currentTime を与えた実装定義アルゴリズムによって判定される booleanとする。 このアルゴリズムは、たとえば直近 24 時間のコントリビューション合計のように、 時間にわたる使用量に予算を制限すべきである。

    3. sufficientBudget である場合、contributionvalueapprovedValueSum に加算する。

    4. sufficientBudgetresultForEachContribution追加する。

      注: 戻り値の i 番目の要素は、 contributions[i] の valueを 送信するのに十分な予算が残っているかどうかを示す。

  4. consumeIfPermitted である場合、approvedValueSumoriginapi および currentTime を与えて、実装定義アルゴリズムにより予算を消費する。

  5. resultForEachContribution を返す。

保留中の コントリビューション pendingContributions内部エラーイベント errorEvent および boolean wasTriggered を与えて、 内部エラーイベント結果を記録するには、次の手順を実行する:
  1. wasTriggered である場合、errorEventpendingContributionsトリガー済みエラーイベント追加する。

  2. そうでなければ、pendingContributions条件付き コントリビューション[errorEvent] を削除する。

origin reportingOriginコンテキスト型 apiPAHistogramContributionlist contributionsデバッグ 詳細 debugDetails集約コーディネーター aggregationCoordinator事前指定レポートパラメーター preSpecifiedParamsmoment または null の timeout、および moment currentTime を与えて、集約可能 レポートを取得するには、次の手順を実行する。これらは 集約可能レポートを返す。
  1. Assert: reportingOriginpotentially trustworthy origin である。

  2. reportTime を、currentTimetimeout を与えて レポート配信時刻を取得する結果とする。

  3. report を、次の項目を持つ新しい集約可能レポートとする:

    レポート送信元オリジン

    reportingOrigin

    元のレポート時刻

    reportTime

    レポート時刻

    reportTime

    コントリビューション

    contributions

    api

    api

    レポート ID

    ランダム UUID を生成する結果。

    デバッグ詳細

    debugDetails

    集約コーディネーター

    aggregationCoordinator

    コンテキスト ID

    preSpecifiedParamsコンテキスト ID

    filtering ID 最大バイト数

    preSpecifiedParamsfiltering ID 最大バイト数

    最大コントリビューション数

    apipreSpecifiedParams最大 コントリビューション数を用いて、最大コントリビューション数を判定する結果。

    キュー済み

    false

  4. report を返す。

moment currentTimemoment または null の timeout を与えて、 レポート 配信時刻を取得するには、次の手順を実行する。 これらは moment を返す。
  1. timeout が null でない場合:

    1. timeout を返す。

  2. 自動化ローカルテストモード有効が true の場合、currentTime を返す。

  3. r を、0(含む)から 1(含まない)までの、一様確率のランダムな double とする。

  4. currentTime + 最小レポート遅延 + r * ランダム化レポート遅延 を返す。

コンテキスト型 api と 正の整数または null の maxContributions を与えて、最大 コントリビューション数を判定するには、次の手順を実行する。これらは 正の整数を返す。
  1. maxContributions が null の場合、API ごとの既定 maxContributions[api] を返す。

  2. maxContributions最大 maxContributions より大きい場合、最大 maxContributions を返す。

  3. maxContributions を返す。

9.3. レポートの送信

注: この節は主に Attribution Reporting API 仕様からコピーし、必要に応じて適合させたものである。

ここで タスクをキューに入れるアルゴリズムを使用する必要があるか?

ユーザーエージェントは、その集約可能レポートキャッシュを与えて、 定期的に送信のためにレポートをキューに入れることを試みる必要がある。

list集約可能 レポート reports を与えて、送信のためにレポートをキューに入れることを試みるには:
  1. reportsreport それぞれについて、これらの手順を並列に実行する:

    1. これらの手順を実行する。ただし、ユーザー エージェントがシャットダウンしたときに中止する:

      1. reportキュー済み値が true の場合、return する。

      2. reportキュー済み値を true に設定する。

      3. currentWallTime現在の壁時計時刻とする。

      4. reportレポート時刻currentWallTime より前である場合、reportレポート時刻currentWallTime実装定義のランダムな非負の durationを加えたものに設定する。

        注: 起動時に、ユーザーエージェントは、 ブラウザーが閉じている間にレポート時刻を過ぎた多数のレポートを送信する必要がある可能性がある。 ランダムな遅延を追加することで、レポートの時間的な結合を防ぐ。

      5. 現在の壁時計時刻reportレポート時刻以降になるまで待つ。

      6. 任意で、さらに実装定義の非負の durationだけ待つ。

        注: これは、ユーザーエージェントが デバイスリソースの使用を最適化し、ユーザーエージェントがオンラインになるのを待てるようにすることを意図している。

      7. report を用いて レポートの配信を試みるを実行する。

    2. 中止された場合reportキュー済み値を false に設定する。

      注: ユーザーエージェントが次に起動したときに この手順を実行する方が実用的である可能性がある。

集約可能レポート report を与えて、レポートの 配信を試みるには:
  1. url を、reportレポート送信元オリジンreportapiを与えて、レポート送信エンドポイントを取得する結果とする。

  2. data を、report を与えて集約可能レポートをシリアライズする結果とする。

  3. data がエラーである場合、report集約可能レポートキャッシュから削除する。

    このタスクをキューに入れる必要があるか?

  4. request を、urldata を与えてレポートリクエストを作成する結果とする。

  5. request を、次の手順を processResponse として、fetch するタスクをキューに入れる:

    1. shouldRetry実装定義boolean とする。その値は エラーが発生しなかった場合 false であるべきである。

    2. shouldRetry が true の場合:

      1. reportレポート時刻を、現在の壁時計時刻実装定義の非負の durationを加えたものに設定する。

      2. reportキュー済み値を false に設定する。

    3. そうでなければ、report集約可能レポートキャッシュから削除する。

origin reportingOriginコンテキスト型 api を与えて、レポート送信 エンドポイントを取得するには、次の手順を実行する。これらは URL を返す。
  1. Assert: reportingOriginpotentially trustworthy origin である。

  2. path を «".well-known/private-aggregation/report-", api» の連結とする。

    この well-known ディレクトリを登録する。[Issue #67]

  3. base を、reportingOriginシリアライズに対して URL パーサーを実行した結果とする。

  4. Assert: base は failure ではない。

  5. result を、path に対して base を用いてURL パーサーを実行した結果とする。

  6. Assert: result は failure ではない。

  7. result を返す。

URL urlバイト列 body を与えて、レポート リクエストを作成するには:
  1. request を、次のプロパティを持つ新しいrequestとする:

    method

    "POST"

    URL

    url

    header list

    «("Content-Type", "application/json")»

    unsafe-request flag

    set

    body

    body

    client

    null

    service-workers mode

    "none"

    initiator

    ""

    referrer

    "no-referrer"

    mode

    "cors"

    credentials mode

    "omit"

    cache mode

    "no-store"

  2. request を返す。

9.4. レポートのシリアライズ

注: この節は主に Attribution Reporting API 仕様からコピーし、必要に応じて適合させたものである。

集約可能 レポート report を与えて、集約可能レポートをシリアライズするには、次の手順を実行する。これらは バイト列またはエラーを返す。
  1. aggregationServicePayloads を、report を与えて集約サービスペイロードを取得する結果とする。

  2. aggregationServicePayloads がエラーである場合、 aggregationServicePayloads を返す。

  3. data を、次のキー/値ペアのordered map とする:

    "aggregation_coordinator_origin"

    report集約 コーディネーターシリアライズしたもの。

    "aggregation_service_payloads"

    aggregationServicePayloads

    "shared_info"

    report を与えて レポートの共有情報を取得する結果。

  4. debugKeyreportデバッグ詳細キーとする。

  5. debugKey が null でない場合、 data["debug_key"] を debugKey設定する。

  6. contextIdreportコンテキスト IDとする。

  7. contextId が null でない場合、 data["context_id"] を contextId設定する。

  8. data に対してinfra 値を JSON バイトにシリアライズするを実行した結果のバイト列を返す。

集約可能 レポート report を与えて、集約サービスペイロードを取得するには、次の手順を実行する。これらは mapslistまたはエラーを返す。
  1. publicKeyTuple を、report集約コーディネーターを与えて 暗号化用の公開鍵を取得する結果とする。

  2. publicKeyTuple がエラーである場合、publicKeyTuple を返す。

  3. (pkR, keyId) を publicKeyTuple とする。

  4. plaintextPayload を、report を与えて平文ペイロードを取得する結果とする。

  5. sharedInfo を、report を与えてレポートの 共有情報を取得する結果とする。

  6. encryptedPayload を、plaintextPayloadpkR および sharedInfo を与えてペイロードを暗号化する結果とする。

  7. encryptedPayload がエラーである場合、encryptedPayload を返す。

  8. aggregationServicePayloads を新しい list とする。

  9. aggregationServicePayload を、次の キー/値ペアの ordered map とする:

    "key_id"

    keyId

    "payload"

    encryptedPayloadbase64 エンコードしたもの

  10. reportデバッグ詳細有効フィールドが true の場合:

    1. aggregationServicePayload[debug_cleartext_payload] を plaintextPayloadbase64 エンコード設定する。

  11. aggregationServicePayloadaggregationServicePayloads追加する。

  12. aggregationServicePayloads を返す。

集約 コーディネーター aggregationCoordinator を与えて、 暗号化用の公開鍵を取得するには、次の手順を実行する。これらは 公開鍵と string からなる tuple、 またはエラーを返す。
  1. url を新しい URL record とする。

  2. urlschemeaggregationCoordinatorschemeに設定する。

  3. urlhostaggregationCoordinatorhostに設定する。

  4. urlportaggregationCoordinatorportに設定する。

  5. urlpathを «".well-known", "aggregation-service", "v1", "public-keys"» に設定する。

  6. url からの公開鍵と、その公開鍵を一意に識別すべき stringからなる、実装定義tupleを返す。 または、ユーザーエージェントが url から公開鍵を取得できなかった場合は、 エラーを返す。この手順は非同期であってもよい。

これを fetch の観点で指定する。使用する暗号化 標準、長さ要件などの詳細を追加する。

注: ユーザーエージェントには、 定期的な鍵ローテーションを強制することが推奨される。複数の鍵がある場合、 ユーザーエージェントは各暗号化操作について独立に一様ランダムで鍵を選択できる。

集約可能レポート report を与えて、平文 ペイロードを取得するには、次の手順を実行する。これらは バイト列を返す。
  1. payloadData を新しい list とする。

  2. contributionsreportコントリビューションとする。

  3. maxContributionsreport最大コントリビューション数とする。

  4. Assert: contributionsサイズmaxContributions より大きくない。

  5. contributionsサイズmaxContributions より小さい:

    1. nullContribution を、次の項目を持つ新しい PAHistogramContribution とする:

      bucket

      0

      value

      0

      filteringId

      0

    2. nullContributioncontributions追加する。

    注: このパディングは、暗号化されたペイロードサイズを通じて コントリビューション数が漏えいすることを防ぐ。下記の議論を参照。

  6. reportコントリビューションcontribution それぞれについて:

    1. filteringIdMaxBytesreportfiltering id 最大バイト数とする。

    2. Assert: contribution["filteringId"] は 0 から 256filteringIdMaxBytes までの範囲(両端を除く)に含まれる

    3. contributionData を、次のキー/値 ペアのordered mapとする:

      "bucket"

      contribution["bucket"] と 16 を与えて ペイロード用に整数をエンコードする結果。

      "value"

      contribution["value"] と 4 を与えて ペイロード用に整数をエンコードする結果。

      "id"

      contribution["filteringId"] と filteringIdMaxBytes を与えて ペイロード用に整数をエンコードする結果。

    4. contributionDatapayloadData追加する。

  7. payload を、次のキー/値ペアのordered map とする:

    "data"

    payloadData

    "operation"

    "histogram"

  8. payloadCBOR エンコード した結果のバイト列を返す。

バイト列 plaintextPayload、 公開鍵 pkR および string sharedInfo を与えて、ペイロードを 暗号化するには、次の手順を実行する。 これらは バイト列またはエラーを返す。
  1. info を、« "aggregation_service", sharedInfo » の連結UTF-8 エンコードした結果とする。

  2. (kem_id, kdf_id, aead_id) を (0x0020, 0x0001, 0x0003) とする。

    注: 上記の暗号スイートの三つ組は、 HPKE アルゴリズム 識別子で構成されており、 KEM を DHKEM(X25519, HKDF-SHA256)、KDF 関数を HKDF-SHA256、AEAD 関数を ChaCha20Poly1305 として指定する。

  3. (enc, hpkeContext) を、公開鍵 pkR、アプリケーション提供情報 info、KEM kem_id、KDF kdf_id、および AEAD aead_id を用いて SetupBaseS() を呼び出すことにより、 HPKE送信者 コンテキストをセットアップした結果とする。この操作が 失敗した場合、エラーを返す。

    注: 明確さのために、上記では KEM、KDF、AEAD 識別子を SetupBaseS() に明示的に渡しているが、RFC9180 の 擬似コードではこれらのパラメーターは省略されている。

  4. aad を ``(空のバイト 列)とする。

  5. ciphertext を、追加認証データ aad と平文 plaintextPayload を用いて hpkeContext オブジェクト上で ContextS.Seal() を呼び出して ペイロードをシールした結果とする。 この操作が失敗した場合、エラーを返す。

  6. encryptedPayload を、バイト 列 « enc, ciphertext » の連結とする。

    注: 選択した KEM によって生成されるカプセル化された 対称鍵 enc の長さは、RFC9180 の KEM ID 表に示されているように、正確に 32 バイトである。

  7. バイト列 encryptedPayload を返す。

整数 intToEncode と整数 byteLength を与えて、 ペイロード用に整数を エンコードするには、必要に応じて左をゼロでパディングし、intToEncode を長さ byteLength のビッグエンディアンバイト列として表現したものを返す。
集約可能レポート report を与えて、レポートの 共有情報を取得するには、次の手順を実行する。これらは string を返す。
  1. scheduledReportTime を、UNIX epoch から report元のレポート時刻までのduration from とする。

  2. sharedInfo を、次のキー/値ペアのordered map とする:

    "api"

    reportapi

    "report_id"

    reportレポート ID

    "reporting_origin"

    reportレポート送信元オリジンシリアライズ

    "scheduled_report_time"

    scheduledReportTime 内の秒数を、最も近い整数秒へ切り捨てて シリアライズしたもの

    "version"

    "1.0"

  3. sharedInfo を与えてinfra 値を json string にシリアライズする結果を返す。

10. ユーザーエージェント自動化

ユーザーエージェントは、boolean の 自動化ローカルテストモード有効(既定値 false)を保持する。

ユーザーエージェント自動化およびウェブサイトテストの目的で、この文書は、 API 設定を制御するための以下の [WebDriver] 拡張コマンドを定義する。

10.1. ローカルテストモードを設定

HTTP メソッド URI テンプレート
POST /session/{session id}/private-aggregation/localtestingmode
sessionURL variables および parameters を与えた リモートエンド手順は次のとおりである:
  1. parameters が JSON 形式の Object でない場合、 エラー コード invalid argument を持つ WebDriver エラーを返す。

  2. enabled を、parameters から "enabled" という名前のプロパティを 取得する結果とする。

  3. enabledundefined であるか、boolean でない場合、エラー コード invalid argument を持つ WebDriver エラーを返す。

  4. 自動化ローカルテストモード 有効enabled に設定する。

  5. データ null を伴うsuccess を返す。

注: これがないと、集約可能レポートは 遅延の対象となり、テストが困難になる。

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

この節は非規範的である。

11.1. クロスサイト情報の開示

この API により、クロスサイトデータにアクセスできる隔離されたコンテキスト(すなわち Shared Storage worklet/Protected Audience script runner)は、 集約可能レポートをネットワーク経由で送信できる。

集約可能レポートには、キー値ペア(すなわちヒストグラムへのコントリビューション)の形式で、 暗号化された高エントロピーのクロスサイト情報が含まれる。 コントリビューションに埋め込まれる情報は任意であるが、閲覧履歴やその他の クロスサイト活動などを含み得る。この API は、この情報があるサイトから別のサイトへ渡されることを 防ぐことを目的とする。

11.1.1. 制限されたコントリビューション処理

ヒストグラムコントリビューションは直接公開されない。代わりに、それらは信頼された集約サービスによってのみ 処理できるよう暗号化される。この信頼された集約サービスは、各キーについてレポート全体の値を合計し、 それぞれの値にノイズを追加して「サマリーレポート」を生成する。

その処理の出力は、集約されノイズが付加されたヒストグラムとなる。 サービスは、どのレポートも複数回処理できないことを保証する。さらに、 情報の露出はユーザーエージェント上のコントリビューション予算によって制限される。 原則として、この枠組みは差分プライバシーを満たすノイズパラメーターの指定をサポートできる。

11.1.2. 暗号化されていないメタデータ

これらのレポートは、クロスサイトデータに基づかない限定的な量のメタデータも公開する。 レポートの受信者は、レポートが送信された時刻や送信者の IP アドレスなどの サイドチャネル情報も観測できる可能性がある。

11.1.3. レポート数を通じた漏えいからの保護

しかし、与えられたメタデータを持つレポート数は、一部のクロスサイト情報を露出させる可能性がある。 これを防ぐため、この API はレポートの送信をランダムな時間だけ遅延させ、 特定のイベントからレポートが送信されたかどうかを判定しにくくする。コンテキスト ID が提供される場合、 非既定の filtering ID 最大バイト数が 指定される場合、または非既定の 最大コントリビューション数が指定される場合、 API は送信されるレポート数を決定論的にする(必要であれば 'null reports' を送信する — 各 null report はペイロード内に値 0 のコントリビューションのみを含む)。将来的には、 レポート数にノイズを追加するなど、追加の緩和策も可能であり得る。

11.1.4. ペイロードサイズを通じた漏えいからの保護

暗号化されたペイロードの長さも、平文ペイロードに存在するコントリビューション数という 一部のクロスサイト情報を露出させる可能性がある。このサイドチャネルを排除するため、 Private Aggregation は、暗号化前にペイロードが所定の数のコントリビューションを含むことを保証し、 必要に応じて切り捨てたり null コントリビューションでパディングしたりして目標に合わせる。

最大コントリビューション数が非 null の場合、 Private Aggregation はそれを使用してコントリビューションの目標数を決定する。そうでなければ、 目標数は呼び出し元のコンテキスト型に基づいて API ごとの既定 maxContributionsから取得される。

11.1.5. 一時的なデバッグ機構

enableDebugMode() メソッドは、テストおよび統合を容易にするために、この API の多くの保護を 迂回できるようにする。具体的には、デバッグモードが有効になっている場合、 ペイロードの内容、すなわちヒストグラムコントリビューションは平文で公開される。 任意で、レポートを呼び出しコンテキストに関連付けるためにデバッグキーを設定することもできる。 将来的には、この機構はサードパーティ Cookie を設定する資格がある呼び出し元にのみ 利用可能になる。その場合、API 呼び出し元は既にクロスサイトで情報を通信する能力を持っている。

enableDebugMode() をサードパーティ Cookie の 適格性に結び付ける。[Issue #57]

11.1.6. プライバシーパラメーター

この API によって露出される情報量は、使用されるプライバシーパラメーター (たとえばコントリビューション制限や集約サービスで使用されるノイズ分布)の積である。 我々は露出される情報量を最小化することを目指す一方で、幅広いユースケースのサポートも目指す。 情報の露出と有用性のトレードオフにおいて、異なる選択や進化する選択を可能にするため、 プライバシーパラメーターは実装定義のままとされる。

11.2. サイトデータの消去

集約可能レポートキャッシュおよび 予算を問い合わせる アルゴリズムのために保存された任意のコントリビューション履歴データには、ユーザーのウェブ 活動に関するデータが含まれる。そのため、このデータを削除するためのユーザー制御が必要である。 ストレージの消去を参照。

一方で、コントリビューションキャッシュデバッグスコープマップ、および 事前指定レポートパラメーターマップには、 特定のバッチ処理スコープ および デバッグスコープに結び付いた 短命なデータのみが含まれるため、制御は必要とされない。

11.3. レポート遅延に関する懸念

API 呼び出し後にレポート送信を遅延させると、状況によってはサイドチャネル漏えいが可能になる。

11.3.1. クロスネットワークのレポート送信元漏えい

レポートは、ブラウザーがあるネットワークに接続されている間に保存され、 別のネットワークに接続されている間に送信される可能性があり、これにより レポート送信元オリジンのクロスネットワーク漏えいが可能になる場合がある。

例: ユーザーが自宅ネットワーク上で特定の閲覧プロファイルを用いてブラウザーを実行する。 特定のレポート送信元オリジンを持つ集約可能レポートが、将来のレポート時刻とともに保存される。 レポート時刻に達した後、ユーザーが雇用主のネットワーク上で同じ閲覧プロファイルを用いて ブラウザーを実行し、その時点でブラウザーがレポートをレポート送信元オリジンへ送信する。 レポート自体は HTTPS 経由で送信される可能性があるが、レポート送信元オリジンは DNS または TLS client hello(ECH によって緩和可能)を通じてネットワーク管理者に見える可能性がある。 一部のレポート送信元オリジンは、機微なサイト上でのみ、または主に機微なサイト上で運用されていることが 知られている可能性があるため、これはユーザーの知識や同意なしに、ユーザーの閲覧活動に関する情報を ユーザーの雇用主へ漏えいさせる可能性がある。

可能な緩和策には次が含まれる:

  1. ブラウザーが同じネットワーク上でそのオリジンへ既にリクエストを行っている場合に限り、 与えられたレポート送信元オリジンを持つレポートを送信する: これにより、ネットワーク管理者が Private Aggregation API から追加情報を得ることを防ぐ。しかし、レポート損失と レポート遅延が増加し、レポート送信元オリジンにとっての API の有用性が低下する。 また、レポートの解放を可能にしたユーザーのリクエストとレポートを、オリジンがより適切に 関連付けられる可能性があるため、タイミング攻撃の有効性を高める可能性もある。

  2. レポートを即時送信する: これにより、レポートが異なるネットワークで保存・送信される可能性が 低下する。しかし、レポート送信元オリジンが元の API 呼び出しと送信されたレポートを 関連付けられる可能性が高まり、API のプライバシー制御が弱まる。 レポート数を通じた漏えいからの保護を参照。

  3. 信頼されたプロキシサーバーを使用してレポートを送信する: これによりレポート送信元オリジンは 実質的にレポート本文へ移動されるため、ネットワーク管理者にはプロキシサーバーのみが見える。

  4. DNS over HTTPS を要求する: これによりレポート送信元 オリジンは実質的にネットワーク管理者から隠されるが、強制することは現実的でない可能性が高く、 たとえば代わりに IP アドレスを監視することで、ネットワーク管理者に回避され得る。

11.3.2. ユーザー存在の追跡

ブラウザーは、実行中でありインターネット接続がある間にのみレポートの送信を試みる (接続性の明示的なチェックがなくても、接続がなければ当然レポートの送信は失敗する)ため、 元のレポート時刻において、レポート送信元で (シリアライズされた集約可能レポートを受信するかどうかは、 ユーザーの存在に関する情報を漏えいさせる。さらに、レポートリクエストには本質的に IP アドレスが含まれるため、これによりユーザーの IP に由来する位置情報がレポート送信元オリジンへ 明らかになる可能性があり、自宅対職場、またはおおよその現実世界の地理位置情報を含む可能性がある。 また、ユーザーの閲覧活動のパターンを明らかにする可能性もある。

可能な緩和策には次が含まれる:

  1. レポートを即時送信する: これは、レポート送信元オリジンに対して行われた元のリクエストが レポートリクエストと時間的に近接しているため、存在追跡を実質的に排除する。 しかし、レポート送信元オリジンが元の API 呼び出しと送信されたレポートを関連付けられる可能性が高まり、 API のプライバシー制御が弱まる。レポート数を通じた漏えいからの保護を参照。

  2. レポートを信頼されたプロキシサーバーへ即時送信し、そのプロキシサーバー自身が追加の遅延を適用する: これにより、ユーザーの IP アドレスとオンライン・オフラインの存在の両方を、レポート送信元オリジンから 実質的に隠すことができる。

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

この節は非規範的である。

12.1. 同一オリジンポリシー

集約可能レポートキャッシュコントリビューションキャッシュデバッグスコープマップ、および 事前指定レポートパラメーターマップへの書き込みは、 レポート送信originに帰属し、与えられたレポート送信originを持つレポートに含まれるデータは、その originからのデータのみを用いて生成される。

注目すべき例外の 1 つは、予算を問い合わせるアルゴリズムであり、これは実装定義であり、他のoriginsからのコントリビューション履歴を考慮できる。 たとえば、このアルゴリズムは特定のsiteからのすべての履歴を考慮できる。これは、複数のオリジンが API の挙動に 影響できるようになるため、同一オリジンポリシーの明示的な緩和となる。 この種の共有制限に特有のリスクの 1 つは、サービス拒否攻撃の導入である。 そこでは、オリジンのグループが共謀して利用可能なすべての予算を意図的に消費し、 後続のオリジンが API にアクセスできなくなる可能性がある。 これはセキュリティとプライバシーのトレードオフであり、制限は、多数のオリジンが共謀して プライバシーを侵害する有効性を下げるために存在する。しかし、制限されるオリジンの集合がすべて same siteである場合、このセキュリティリスクは軽減される。ユーザーエージェントは、予算を問い合わせる アルゴリズムを選ぶ際に、これらのトレードオフを考慮すべきである。

12.2. ヒストグラムコントリビューションの保護

上記で議論したように、 ヒストグラムコントリビューションの処理はプライバシーを保護するために制限される。 この制限は、信頼された集約サービスだけが暗号化されていないヒストグラムコントリビューションへ アクセスできることに依存している。

これを保証するため、この API は現代的な暗号化仕様である HPKE を使用する。さらに、各ユーザーエージェントには、集約サービスによる 定期的な鍵ローテーションを要求することが推奨される。これにより、同じ鍵で暗号化されるデータ量が制限され、 鍵が危殆化した場合の脆弱なデータ量も制限される。

ここでは指定していないが、各ユーザーエージェントには、暗号化用の公開鍵を取得するによって公開鍵が返されることを 許可する前に、あらゆる集約サービス設計のセキュリティを検討することが強く推奨される。

適合性

文書の 規約

適合性要件は、 記述的なアサーションと 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" によって 規範的テキストから分離される。 次のように:

注、これは参考注である。

索引

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

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

参考文献

規範的参考文献

[ATTRIBUTION-REPORTING-API]
Attribution Reporting. ドラフト Community Group レポート. URL: https://wicg.github.io/attribution-reporting-api/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8949]
C. Bormann; P. Hoffman. Concise Binary Object Representation (CBOR). 2020年12月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc8949
[RFC9180]
R. Barnes; et al. Hybrid Public Key Encryption. 2022年2月. Informational. URL: https://www.rfc-editor.org/rfc/rfc9180
[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2. URL: https://w3c.github.io/webcrypto/
[WebDriver]
Simon Stewart; David Burns. WebDriver. URL: https://w3c.github.io/webdriver/
[WEBDRIVER2]
Simon Stewart; David Burns. WebDriver. URL: https://w3c.github.io/webdriver/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報としての参考文献

[RFC8484]
P. Hoffman; P. McManus. DNS Queries over HTTPS (DoH). 2018年10月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8484
[RFC8615]
M. Nottingham. Well-Known Uniform Resource Identifiers (URIs). 2019年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8615

IDL 索引

[Exposed=(InterestGroupScriptRunnerGlobalScope,SharedStorageWorklet),
 SecureContext]
interface PrivateAggregation {
  undefined contributeToHistogram(PAHistogramContribution contribution);
  undefined contributeToHistogramOnEvent(DOMString event,
                                         record<DOMString, any> contribution);
  undefined enableDebugMode(optional PADebugModeOptions options = {});
};

dictionary PAHistogramContribution {
  required bigint bucket;
  required long value;
  bigint filteringId = 0;
};

dictionary PADebugModeOptions {
  required bigint debugKey;
};

課題索引

Web Platform Design Principles に従い、long[EnforceRange] long long に切り替えることを検討すべきである。
enableDebugMode(options) の 引数は {} という既定値を持つべきではない。あるいは、debugKeyPADebugModeOptions で必須であるべきではない。
コントリビューションの配列を受け入れることを検討する。 [Issue #44]
エラーが適切な型であることを確認する。たとえば InvalidAccessError は 非推奨である。
一意な内部値はエクスポートされた定義ではない。infra/583 を参照。
ここや他の箇所で、Attribution Reporting API が使用する suitable origin 概念へ切り替えることを検討する。
他の構造を、見出し経由ではなくインラインで定義するよう移動する。 すべての小見出しを削除することも検討する。
他の箇所では、user agent を使用するときに定義へリンクする。
定数の追加を検討する。
これは理想的には、Infra のより記述的なアルゴリズムに置き換えられるべきである。 infra/201 を参照。
ここでの開発者体験の改善を検討する(例: この場合を検出する方法)。
エラーが適切な型であることを確認する。たとえば InvalidAccessError は 非推奨である。
パスが空でない場合にエラーを throw することを検討する。
他の箇所では、一致させるためにアルゴリズムを <div algorithm> ブロックで囲み、 bikeshed/1472 に従ってすべてのアルゴリズムのスタイルを追加する。
エラーが適切な型であることを確認する。たとえば InvalidAccessError は 非推奨である。
Shared Storage から送信される timeout を更新して整合させる。
ここで タスクをキューに入れるアルゴリズムを 使用する必要があるか?
このタスクをキューに入れる必要があるか?
この well-known ディレクトリを登録する。 [Issue #67]
これを fetch の観点で指定する。使用する暗号化 標準、長さ要件などの詳細を追加する。
enableDebugMode() をサードパーティ Cookie の 適格性に結び付ける。 [Issue #57]