Panduan Memulai Penerapan Penyimpanan Bersama dan Agregasi Pribadi

Dokumen ini adalah panduan memulai untuk menggunakan Shared Storage dan Private Aggregation. Anda harus memahami kedua API ini karena Shared Storage menyimpan nilai dan Private Aggregation membuat laporan yang dapat diagregasi.

Target Audiens: Penyedia teknologi iklan dan pengukuran.

Shared Storage API

Untuk mencegah pelacakan lintas situs, browser telah mulai mempartisi semua bentuk penyimpanan, termasuk penyimpanan lokal, cookie, dan sebagainya. Namun, ada kasus penggunaan yang memerlukan penyimpanan yang tidak dipartisi. Shared Storage API menyediakan akses tulis tanpa batas di berbagai situs tingkat teratas dengan akses baca yang menjaga privasi.

Shared Storage dibatasi ke asal konteks (pemanggil sharedStorage).

Shared Storage memiliki batas kapasitas per origin, dengan setiap entri dibatasi hingga jumlah karakter maksimum. Jika batas tercapai, tidak ada lagi input yang disimpan. Batas penyimpanan data diuraikan dalam penjelasan Shared Storage.

Memanggil Shared Storage

Teknologi iklan dapat menulis ke Shared Storage menggunakan JavaScript atau header respons. Pembacaan dari Penyimpanan Bersama hanya terjadi dalam lingkungan JavaScript terisolasi yang disebut worklet.

  • Menggunakan JavaScript Teknologi iklan dapat menjalankan fungsi Shared Storage tertentu seperti menyetel, menambahkan, dan menghapus nilai di luar worklet JavaScript. Namun, fungsi seperti membaca Shared Storage dan melakukan Private Aggregation harus diselesaikan melalui worklet JavaScript. Metode yang dapat digunakan di luar worklet JavaScript dapat ditemukan di Proposed API Surface - Outside the worklet.

    Metode yang digunakan dalam worklet selama operasi dapat ditemukan di Proposed API Surface - In the worklet.

  • Menggunakan header respons

    Mirip dengan JavaScript, hanya fungsi tertentu seperti menyetel, menambahkan, dan menghapus nilai di Shared Storage yang dapat dilakukan menggunakan header respons. Untuk menggunakan Shared Storage di header respons, Shared-Storage-Writable: ?1 harus disertakan dalam header permintaan.

    Untuk memulai permintaan dari klien, jalankan kode berikut, bergantung pada metode yang Anda pilih:

    • Menggunakan fetch()

      fetch("https://a.example/path/for/updates", {sharedStorageWritable: true});
      
    • Menggunakan tag iframe atau img

      <iframe src="https://a.example/path/for/updates" sharedstoragewritable></iframe>
      
    • Menggunakan atribut IDL dengan tag iframe atau img

      let iframe = document.getElementById("my-iframe");
      iframe.sharedStorageWritable = true;
      iframe.src = "https://a.example/path/for/updates";
      

Informasi lebih lanjut dapat ditemukan di Shared Storage: Response Headers.

Menulis ke Shared Storage

Untuk menulis ke Shared Storage, panggil sharedStorage.set() dari dalam atau luar worklet JavaScript. Jika dipanggil dari luar worklet, data akan ditulis ke origin konteks penjelajahan tempat panggilan dilakukan. Jika dipanggil dari dalam worklet, data akan ditulis ke origin konteks penjelajahan yang memuat worklet. Kunci yang ditetapkan memiliki tanggal habis masa berlaku 30 hari sejak update terakhir.

Kolom ignoreIfPresent bersifat opsional. Jika ada dan ditetapkan ke true, kunci tidak diperbarui jika sudah ada. Masa berlaku kunci diperpanjang menjadi 30 hari dari panggilan set() meskipun kunci tidak diperbarui.

Jika Shared Storage diakses beberapa kali dalam pemuatan halaman yang sama dengan kunci yang sama, nilai untuk kunci tersebut akan ditimpa. Sebaiknya gunakan sharedStorage.append() jika kunci perlu mempertahankan nilai sebelumnya.

  • Menggunakan JavaScript

    Di luar worklet:

    window.sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.set('myKey', 'myValue2', { ignoreIfPresent: true });
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.set('myKey', 'myValue2', { ignoreIfPresent: false });
    // Shared Storage: {'myKey': 'myValue2'}
    

    Demikian pula, di dalam worklet:

    sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
    
  • Menggunakan header respons

    Anda juga dapat menulis ke Shared Storage menggunakan header respons. Untuk melakukannya, gunakan Shared-Storage-Write di header respons bersama dengan perintah berikut:

    Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present
    
    Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present=?0
    

    Beberapa item dapat dipisahkan dengan koma dan dapat menggabungkan set, append, delete, dan clear.

    Shared-Storage-Write :
    set;key="hello";value="world";ignore_if_present, set;key="good";value="bye"
    

Menambahkan nilai

Anda dapat menambahkan nilai ke kunci yang ada menggunakan metode append. Jika kunci tidak ada, append() akan membuat kunci dan menetapkan nilai saat dipanggil. Hal ini dapat dilakukan menggunakan JavaScript atau header respons.

  • Menggunakan JavaScript

    Untuk memperbarui nilai kunci yang ada, gunakan sharedStorage.append() dari dalam atau luar worklet.

    window.sharedStorage.append('myKey', 'myValue1');
    // Shared Storage: {'myKey': 'myValue1'}
    window.sharedStorage.append('myKey', 'myValue2');
    // Shared Storage: {'myKey': 'myValue1myValue2'}
    window.sharedStorage.append('anotherKey', 'hello');
    // Shared Storage: {'myKey': 'myValue1myValue2', 'anotherKey': 'hello'}
    

    Untuk menambahkan di dalam worklet:

    sharedStorage.append('myKey', 'myValue1');
    
  • Menggunakan header respons

    Mirip dengan menyetel nilai di Shared Storage, Anda dapat menggunakan Shared-Storage-Write di header respons untuk meneruskan pasangan nilai kunci.

    Shared-Storage-Write : append;key="myKey";value="myValue2"
    

Memperbarui nilai secara batch

Anda dapat memanggil sharedStorage.batchUpdate() dari dalam atau luar worklet JavaScript dan meneruskan array metode yang diurutkan yang menentukan operasi yang dipilih. Setiap konstruktor metode menerima parameter yang sama dengan metode individual yang sesuai untuk set, append, delete, dan clear.

Anda dapat memanggil batchUpdate() dari JavaScript, atau menggunakan header respons:

  • Menggunakan JavaScript

    Metode JavaScript yang dapat digunakan dengan batchUpdate() meliputi:

    • SharedStorageSetMethod(): Menulis pasangan nilai kunci ke Shared Storage.
    • SharedStorageAppendMethod(): Menambahkan nilai ke kunci yang ada di Shared Storage, atau menulis pasangan nilai kunci jika kunci belum ada.
    • SharedStorageDeleteMethod(): Menghapus pasangan nilai kunci dari Shared Storage.
    • SharedStorageClearMethod(): Menghapus semua kunci di Shared Storage.
    sharedStorage.batchUpdate([
    new SharedStorageSetMethod('keyOne', 'valueOne'),
    new SharedStorageAppendMethod('keyTwo', 'valueTwo'),
    new SharedStorageDeleteMethod('keyThree'),
    new SharedStorageClearMethod()
    ]);
    
  • Menggunakan header respons

    Shared-Storage-Write : set;key=keyOne;value=valueOne, append;key=keyTwo;value=valueTwo,delete;key=keyThree,clear
    

Menggunakan header respons akan melakukan batchUpdate() untuk semua metode di header.

Membaca dari Shared Storage

Anda hanya dapat membaca dari Penyimpanan Bersama dari dalam worklet.

await sharedStorage.get('mykey');

Asal konteks penjelajahan tempat modul worklet dimuat menentukan Penyimpanan Bersama milik siapa yang dibaca.

Menghapus dari Shared Storage

Anda dapat melakukan penghapusan dari Shared Storage menggunakan JavaScript dari dalam atau luar worklet atau dengan menggunakan header respons dengan delete(). Untuk menghapus semua kunci sekaligus, gunakan clear() dari salah satu kunci.

  • Menggunakan JavaScript

    Untuk menghapus dari Penyimpanan Bersama dari luar worklet:

    window.sharedStorage.delete('myKey');
    

    Untuk menghapus dari Penyimpanan Bersama dari dalam worklet:

    sharedStorage.delete('myKey');
    

    Untuk menghapus semua kunci sekaligus dari luar worklet:

    window.sharedStorage.clear();
    

    Untuk menghapus semua kunci sekaligus dari dalam worklet:

    sharedStorage.clear();
    
  • Menggunakan header respons

    Untuk menghapus nilai menggunakan header respons, Anda juga dapat menggunakan Shared-Storage-Write di header respons untuk meneruskan kunci yang akan dihapus.

    delete;key="myKey"
    

    Untuk menghapus semua kunci menggunakan header respons:

    clear;
    

Membaca grup minat Protected Audience dari Shared Storage

Anda dapat membaca grup minat Protected Audience dari worklet Shared Storage. Metode interestGroups() menampilkan array objek StorageInterestGroup, termasuk atribut AuctionInterestGroup dan GenerateBidInterestGroup.

Contoh berikut menunjukkan cara membaca grup minat konteks penjelajahan dan beberapa kemungkinan operasi yang dapat dilakukan pada grup minat yang diambil. Dua kemungkinan operasi yang digunakan adalah menemukan jumlah grup minat dan menemukan grup minat dengan jumlah bid tertinggi.

async function analyzeInterestGroups() {
  const interestGroups = await interestGroups();
  numIGs = interestGroups.length;
  maxBidCountIG = interestGroups.reduce((max, cur) => { return cur.bidCount > max.bidCount ? cur : max; }, interestGroups[0]);
  console.log("The IG that bid the most has name " + maxBidCountIG.name);
}

Asal konteks penjelajahan tempat modul worklet dimuat menentukan asal grup minat yang dibaca secara default. Untuk mempelajari lebih lanjut asal worklet default dan cara mengubahnya, tinjau bagian Mengeksekusi Shared Storage dan Private Aggregation di Panduan Shared Storage API.

Opsi

Semua metode pengubah Shared Storage mendukung objek opsi opsional sebagai argumen terakhir.

withLock

Opsi withLock bersifat opsional. Jika ditentukan, opsi ini menginstruksikan metode untuk mendapatkan kunci bagi resource yang ditentukan menggunakan Web Locks API sebelum melanjutkan. Nama kunci diteruskan saat meminta kunci. Nama ini mewakili resource yang penggunaannya dikoordinasikan di beberapa tab, pekerja, atau kode dalam origin.

Opsi withLock dapat digunakan dengan metode pengubah Shared Storage berikut:

  • tetapkan
  • tambahkan
  • hapus
  • hapus
  • kumpulan update

Anda dapat menyetel kunci menggunakan JavaScript atau header respons:

  • Menggunakan JavaScript

    sharedStorage.set('myKey', 'myValue', { withLock: 'myResource' });
    
  • Menggunakan header respons

    Shared-Storage-Write : set;key="myKey";value="myValue",options;with_lock="myResource"
    

Kunci Shared Storage dipartisi berdasarkan asal data. Kunci tidak bergantung pada kunci apa pun yang diperoleh menggunakan metode LockManager request(), terlepas dari apakah kunci tersebut berada dalam konteks window atau worker. Namun, keduanya memiliki cakupan yang sama dengan kunci yang diperoleh menggunakan request() dalam konteks SharedStorageWorklet.

Meskipun metode request() memungkinkan berbagai opsi konfigurasi, kunci yang diperoleh dalam Shared Storage selalu mematuhi setelan default berikut:

  • mode: "exclusive": Tidak ada kunci lain dengan nama yang sama yang dapat ditahan secara bersamaan.
  • steal: false: Kunci yang ada dengan nama yang sama tidak dilepaskan untuk mengakomodasi permintaan lain.
  • ifAvailable: false: Permintaan menunggu tanpa batas hingga kunci tersedia.
Kapan menggunakan withLock

Penguncian berguna dalam skenario ketika ada beberapa worklet yang berjalan secara bersamaan (misalnya, beberapa worklet di satu halaman, atau beberapa worklet di tab yang berbeda), yang masing-masing melihat data yang sama. Dalam skenario tersebut, sebaiknya bungkus kode worklet yang relevan dengan kunci untuk memastikan hanya ada satu worklet yang memproses laporan dalam satu waktu.

Situasi lain saat kunci berguna adalah jika ada beberapa kunci yang perlu dibaca bersama dalam worklet, dan statusnya harus disinkronkan. Dalam hal ini, panggilan get harus di-wrap dengan kunci, dan pastikan untuk mendapatkan kunci yang sama saat menulis ke kunci tersebut.

Urutan kunci

Karena sifat kunci web, metode pengubah mungkin tidak dijalankan sesuai urutan yang Anda tentukan. Jika operasi pertama memerlukan kunci dan tertunda, operasi kedua dapat dimulai sebelum operasi pertama selesai.

Misalnya:

// This line might pause until the lock is available.
sharedStorage.set('keyOne', 'valueOne', { withLock: 'resource-lock' });

// This line will run right away, even if the first one is still waiting.
sharedStorage.set('keyOne', 'valueTwo');
Contoh mengubah beberapa kunci

Opsi withLock dengan batchUpdate() memastikan pengecualian bersama dengan operasi serentak lainnya yang mendapatkan kunci yang sama. Anda hanya dapat menerapkan opsi withLock untuk batchUpdate() ke seluruh batch. Menerapkan withLock ke setiap objek metode individual dalam batch akan memunculkan pengecualian.

Contoh ini menggunakan kunci untuk memastikan bahwa operasi baca dan hapus dalam worklet terjadi bersamaan, sehingga mencegah gangguan dari luar worklet.

Contoh modify-multiple-keys.js berikut menetapkan nilai baru untuk keyOne dan keyTwo dengan modify-lock, lalu menjalankan operasi modify-multiple-keys dari worklet:

// modify-multiple-keys.js
sharedStorage.batchUpdate([
    new SharedStorageSetMethod('keyOne', calculateValueFor('keyOne')),
    new SharedStorageSetMethod('keyTwo', calculateValueFor('keyTwo'))
], { withLock: 'modify-lock' });

const modifyWorklet = await sharedStorage.createWorklet('modify-multiple-keys-worklet.js');
await modifyWorklet.run('modify-multiple-keys');

Kemudian, dalam modify-multiple-keys-worklet.js, Anda dapat meminta kunci menggunakan navigator.locks.request() untuk membaca dan mengubah kunci sesuai kebutuhan

// modify-multiple-keys-worklet.js
class ModifyMultipleKeysOperation {
  async run(data) {
    await navigator.locks.request('modify-lock', async (lock) => {
      const value1 = await sharedStorage.get('keyOne');
      const value2 = await sharedStorage.get('keyTwo');

      // Do something with `value1` and `value2` here.

      await sharedStorage.delete('keyOne');
      await sharedStorage.delete('keyTwo');
    });
  }
}
register('modify-multiple-keys', ModifyMultipleKeysOperation);

Pengalihan konteks

Data Shared Storage ditulis ke origin (misalnya, https://example.adtech.com) dari konteks penjelajahan tempat panggilan berasal.

Saat Anda memuat kode pihak ketiga menggunakan tag <script>, kode tersebut akan dieksekusi dalam konteks penjelajahan penyemat. Oleh karena itu, saat kode pihak ketiga memanggil sharedStorage.set(), data akan ditulis ke Shared Storage penanam. Saat Anda memuat kode pihak ketiga dalam iframe, kode tersebut menerima konteks penjelajahan baru, dan asalnya adalah asal iframe. Oleh karena itu, panggilan sharedStorage.set() yang dilakukan dari iframe menyimpan data ke Shared Storage asal iframe.

Konteks pihak pertama

Jika halaman pihak pertama memiliki kode JavaScript pihak ketiga tersemat yang memanggil sharedStorage.set() atau sharedStorage.delete(), pasangan nilai kunci akan disimpan dalam konteks pihak pertama.

Data yang disimpan di halaman pihak pertama dengan JavaScript pihak ketiga yang disematkan.
Diagram ini menggambarkan data yang disimpan di halaman pihak pertama dengan JavaScript pihak ketiga yang disematkan.

Konteks pihak ketiga

Pasangan nilai kunci dapat disimpan dalam konteks teknologi iklan atau pihak ketiga dengan membuat iframe dan memanggil set() atau delete() dalam kode JavaScript dari dalam iframe.

Data yang disimpan dalam konteks teknologi iklan atau pihak ketiga.
Diagram menggambarkan data yang disimpan dalam konteks teknologi iklan atau pihak ketiga.

Private Aggregation API

Untuk mengukur data yang dapat diagregasi yang disimpan di Shared Storage, Anda dapat menggunakan Private Aggregation API.

Untuk membuat laporan, panggil contributeToHistogram() di dalam worklet dengan bucket dan nilai. Bucket diwakili oleh bilangan bulat 128-bit tanpa tanda yang harus diteruskan ke fungsi sebagai BigInt. Nilainya adalah bilangan bulat positif.

Untuk melindungi privasi, payload laporan, yang berisi bucket dan nilai, dienkripsi dalam pengiriman, dan hanya dapat didekripsi dan diagregasi menggunakan Layanan Agregasi.

Browser juga akan membatasi kontribusi yang dapat dilakukan situs terhadap kueri output. Secara khusus, anggaran kontribusi membatasi total semua laporan dari satu situs untuk browser tertentu dalam jangka waktu tertentu di semua bucket. Jika anggaran saat ini terlampaui, laporan tidak akan dibuat.

privateAggregation.contributeToHistogram({
  bucket: BigInt(myBucket),
  value: parseInt(myBucketValue)
});

Mengeksekusi Shared Storage dan Private Aggregation

Secara default, saat menggunakan penyimpanan bersama dengan createWorklet(), asal partisi data akan menjadi asal konteks penjelajahan yang memanggil, bukan asal skrip worklet itu sendiri.

Untuk mengubah perilaku default, tetapkan properti dataOrigin saat memanggil createWorklet.

  • dataOrigin: "context-origin": (Default) Data disimpan di penyimpanan bersama asal konteks penjelajahan yang memanggil.
  • dataOrigin: "script-origin": Data disimpan di penyimpanan bersama asal skrip worklet. Anda harus mengaktifkan mode ini.
  • dataOrigin: "https://custom-data-origin.example": Data disimpan di penyimpanan bersama asal data kustom. Pengaktifan diperlukan untuk mengaktifkan mode ini dan persetujuan dari pemilik asal data kustom diperlukan, seperti yang dijelaskan dalam Asal data kustom.
sharedStorage.createWorklet(scriptUrl, {dataOrigin: "script-origin"});

Untuk mengaktifkan, saat menggunakan "script-origin" atau asal kustom, endpoint skrip harus merespons dengan header Shared-Storage-Cross-Origin-Worklet-Allowed. Untuk permintaan lintas origin, CORS juga harus diaktifkan.

Shared-Storage-Cross-Origin-Worklet-Allowed : ?1
Access-Control-Allow-Origin: *

Anda juga dapat menjalankan skrip lintas origin menggunakan iframe pihak ketiga. Dalam hal ini, tindakan Shared Storage akan berada dalam konteks penjelajahan pihak ketiga.

Menggunakan iframe lintas origin

Iframe diperlukan untuk memanggil worklet penyimpanan bersama.

Di iframe iklan, muat modul worklet dengan memanggil addModule(). Untuk menjalankan metode yang terdaftar dalam file worklet sharedStorageWorklet.js, di JavaScript iframe iklan yang sama, panggil sharedStorage.run().

const sharedStorageWorklet = await window.sharedStorage.createWorklet(
  'https://any-origin.example/modules/sharedStorageWorklet.js'
);
await sharedStorageWorklet.run('shared-storage-report', {
  data: { campaignId: '1234' },
});

Dalam skrip worklet, Anda harus membuat class dengan metode run async dan register untuk dijalankan di iframe iklan. Di dalam sharedStorageWorklet.js:

class SharedStorageReportOperation {
  async run(data) {
    // Other code goes here.
    bucket = getBucket(...);
    value = getValue(...);
    privateAggregation.contributeToHistogram({
      bucket,
      value
    });
  }
}
register('shared-storage-report', SharedStorageReportOperation);

Menggunakan permintaan lintas origin

Shared Storage dan Private Aggregation memungkinkan pembuatan worklet lintas origin tanpa memerlukan iframe lintas origin.

Halaman pihak pertama juga dapat memanggil createWorklet() ke endpoint JavaScript lintas asal. Anda harus menetapkan asal partisi data worklet agar sama dengan asal skrip saat membuat worklet.

async function crossOriginCall() {
  const privateAggregationWorklet = await sharedStorage.createWorklet(
    'https://cross-origin.example/js/worklet.js',
    { dataOrigin: 'script-origin' }
  );
  await privateAggregationWorklet.run('pa-worklet');
}
crossOriginCall();

Endpoint JavaScript lintas asal harus merespons dengan header Shared-Storage-Cross-Origin-Worklet-Allowed dan mencatat bahwa CORS diaktifkan untuk permintaan tersebut.

Shared-Storage-Cross-Origin-Worklet-Allowed : ?1

Worklet yang dibuat menggunakan createWorklet() akan memiliki selectURL dan run(). addModule() tidak tersedia untuk hal ini.

class CrossOriginWorklet {
  async run(data){
    // Other code goes here.
    bucket = getBucket(...);
    value = getValue(...);
    privateAggregation.contributeToHistogram({
      bucket,
      value
    });
  }
}

Asal data kustom

Jika dataOrigin ditetapkan ke origin yang valid, pemilik dataOrigin harus menyetujui pemrosesan Shared Storage untuk dataOrigin tersebut dengan menghosting file JSON yang mencantumkan origin skrip worklet di jalur /.well-known/shared-storage/trusted-origins. File harus berupa array objek dengan kunci scriptOrigin dan contextOrigin. Nilai untuk kunci ini dapat berupa string atau array string.

Buat file trusted-origins menggunakan informasi berikut:

  • Konteks penelepon
  • Origin dan URL skrip worklet
  • Asal dan pemilik data

Tabel berikut menunjukkan cara membuat file trusted-origins berdasarkan informasi ini:

Konteks penelepon URL skrip worklet Asal data Pemilik data File JSON trusted-origins pemilik asal data
https://publisher.example https://publisher.example/script.js context-origin https://publisher.example JSON tidak diperlukan
https://publisher.example https://ad.example/script.js script-origin https://ad.example JSON tidak diperlukan
https://publisher.example https://cdn-ad.example/script.js https://ad.example https://ad.example
[{
  "scriptOrigin": "https://cdn-ad.example",
  "contextOrigin": "https://publisher.example"
}]
      
Penelepon mana saja https://cdn-ad.example/script.js https://ad.example https://ad.example
[{
  "scriptOrigin": "https://cdn-ad.example",
  "contextOrigin": "*"
}]
      
https://publisher-a.example, OR https://publisher-b.example https://cdn-ad.example/script.js https://ad.example https://ad.example
[{
  "scriptOrigin": "https://cdn-ad.example",
  "contextOrigin": [
      "https://publisher-a.example",
      "https://publisher-b.example"
  ]
}]
      
https://publisher.example https://cdn-a-ad.example/script.js, OR https://cdn-b-ad.example/script.js https://ad.example https://ad.example
[{
  "scriptOrigin": [
    "https://cdn-a-ad.example",
    "https://cdn-b-ad.example"
  ],
  "contextOrigin": "https://publisher.example"
}]
      

Misalnya, JSON berikut dapat dihosting di https://custom-data-origin.example/.well-known/shared-storage/trusted-origins dan menggabungkan semua pemroses data Penyimpanan Bersama yang diizinkan untuk origin https://custom-data-origin.example.

[
  {
    "scriptOrigin": "https://script-origin.a.example",
    "contextOrigin": "https://context-origin.a.example"
  },
  {
    "scriptOrigin": "https://script-origin.b.example",
    "contextOrigin": [
      "https://context-origin.a.example",
      "https://context-origin.b.example"
    ]
}]

Langkah berikutnya

Halaman berikut menjelaskan aspek penting dari API Shared Storage dan Private Aggregation.

Setelah memahami API, Anda dapat mulai mengumpulkan laporan, yang dikirim sebagai permintaan POST ke endpoint berikut sebagai JSON di isi permintaan.

  • Laporan Debug - context-origin/.well-known/private-aggregation/debug/report-shared-storage
  • Laporan - context-origin/.well-known/private-aggregation/report-shared-storage

Setelah laporan dikumpulkan, Anda dapat melakukan pengujian menggunakan alat pengujian lokal atau menyiapkan Trusted Execution Environment for Aggregation Service untuk mendapatkan laporan gabungan.

Beri masukan

Anda dapat membagikan masukan tentang API dan dokumentasi di GitHub.