Konsep utama Private Aggregation API
Untuk siapa dokumen ini?
Private Aggregation API memungkinkan pengumpulan data gabungan dari worklet dengan akses ke data lintas situs. Konsep yang dibagikan di sini penting bagi developer yang membuat fungsi pelaporan dalam Shared Storage dan Protected Audience API.
- Jika Anda adalah developer yang membuat sistem pelaporan untuk pengukuran lintas situs.
- Jika Anda adalah pemasar, data scientist, atau pengguna laporan ringkasan lainnya, memahami mekanisme ini akan membantu Anda membuat keputusan desain untuk mengambil laporan ringkasan yang dioptimalkan.
Istilah utama
Sebelum membaca dokumen ini, sebaiknya Anda memahami istilah dan konsep utama. Setiap istilah ini akan dijelaskan secara mendalam di sini.
- Kunci agregasi (juga dikenal sebagai bucket) adalah kumpulan titik data yang telah ditentukan sebelumnya. Misalnya, Anda mungkin ingin mengumpulkan bucket data lokasi tempat browser melaporkan nama negara. Kunci agregasi dapat berisi lebih dari satu dimensi (misalnya, negara dan ID widget konten Anda).
- Nilai agregat adalah titik data individual
yang dikumpulkan ke dalam kunci agregasi. Jika Anda ingin mengukur jumlah pengguna
dari Prancis yang telah melihat konten Anda,
France
adalah dimensi dalam kunci agregasi, danviewCount
dari1
adalah nilai agregat. - Laporan agregat dibuat dan dienkripsi dalam browser. Untuk Private Aggregation API, data ini berisi data tentang satu peristiwa.
- Layanan Agregasi memproses data dari laporan gabungan untuk membuat laporan ringkasan.
- Laporan ringkasan adalah output akhir Layanan Agregasi, dan berisi data pengguna gabungan yang berisi derau dan data konversi mendetail.
- Worklet adalah bagian infrastruktur yang memungkinkan Anda menjalankan fungsi JavaScript tertentu dan menampilkan informasi kembali kepada pemohon. Dalam worklet, Anda dapat menjalankan JavaScript, tetapi tidak dapat berinteraksi atau berkomunikasi dengan halaman di luar.
Alur kerja Agregasi Pribadi
Saat Anda memanggil Private Aggregation API dengan kunci agregasi dan nilai agregat, browser akan membuat laporan agregat. Laporan dikirim ke server Anda yang mengelompokkan laporan. Laporan batch diproses nanti oleh Layanan Agregasi, dan laporan ringkasan akan dibuat.
- Saat Anda memanggil Private Aggregation API, klien (browser) akan membuat dan mengirim laporan agregat ke server Anda untuk dikumpulkan.
- Server Anda mengumpulkan laporan dari klien dan mengelompokkan laporan tersebut untuk dikirim ke Layanan Agregasi.
- Setelah mengumpulkan cukup laporan, Anda akan mengelompokkan dan mengirimkannya ke Layanan Agregasi, yang berjalan di trusted execution environment, untuk membuat laporan ringkasan.
Alur kerja yang dijelaskan di bagian ini mirip dengan Attribution Reporting API. Namun, Pelaporan Atribusi mengaitkan data yang dikumpulkan dari peristiwa tayangan dan peristiwa konversi, yang terjadi pada waktu yang berbeda. Agregasi Pribadi mengukur satu peristiwa lintas situs.
Kunci agregasi
Kunci agregasi ("kunci" untuk singkatnya) mewakili bucket tempat nilai agregat akan diakumulasikan. Satu atau beberapa dimensi dapat dienkode ke dalam kunci. Dimensi mewakili beberapa aspek yang ingin Anda peroleh insightnya secara lebih mendalam, seperti kelompok usia pengguna atau jumlah tayangan iklan kampanye.
Misalnya, Anda mungkin memiliki widget yang disematkan di beberapa situs dan ingin menganalisis negara pengguna yang telah melihat widget Anda. Anda ingin menjawab pertanyaan seperti "Berapa banyak pengguna yang telah melihat widget saya dari Negara X?" Untuk melaporkan pertanyaan ini, Anda dapat menyiapkan kunci agregasi yang mengenkode dua dimensi: ID widget dan ID negara.
Kunci yang disediakan ke Private Aggregation API adalah
BigInt,
yang terdiri dari beberapa dimensi. Dalam contoh ini, dimensinya adalah
ID widget dan ID negara. Misalnya, ID widget dapat memiliki panjang hingga 4 digit seperti 1234
, dan setiap negara dipetakan ke angka dalam urutan alfabet seperti Afghanistan adalah 1
, Prancis adalah 61
, dan Zimbabwe adalah 195
.
Oleh karena itu, kunci agregat akan memiliki panjang 7 digit, dengan 4 karakter pertama
disediakan untuk WidgetID
dan 3 karakter terakhir
disediakan untuk CountryID
.
Misalnya, kunci mewakili jumlah pengguna dari Prancis (ID negara 061
)
yang telah melihat ID widget 3276
. Kunci agregasi adalah 3276061
.
Kunci agregasi | |
ID Widget | ID Negara |
3276 | 061 |
Kunci agregasi juga dapat dibuat dengan mekanisme hashing, seperti
SHA-256. Misalnya, string
{"WidgetId":3276,"CountryID":67}
dapat di-hash, lalu dikonversi menjadi
nilai BigInt
dari
42943797454801331377966796057547478208888578253058197330928948081739249096287n
.
Jika nilai hash memiliki lebih dari 128 bit, Anda dapat memotongnya untuk memastikan nilai tersebut tidak akan melebihi nilai bucket maksimum yang diizinkan, yaitu 2^128−1
.
Dalam worklet Penyimpanan Bersama, Anda dapat mengakses modul
crypto
dan
TextEncoder
yang dapat membantu Anda membuat hash. Untuk mempelajari lebih lanjut cara membuat hash, lihat
SubtleCrypto.digest()
di
MDN.
Contoh berikut menjelaskan cara membuat kunci bucket dari nilai hashing:
async function convertToBucket(data) {
// Encode as UTF-8 Uint8Array
const encodedData = new TextEncoder().encode(data);
// Generate SHA-256 hash
const hashBuffer = await crypto.subtle.digest('SHA-256', encodedData);
// Truncate the hash
const truncatedHash = Array.from(new Uint8Array(hashBuffer, 0, 16));
// Convert the byte sequence to a decimal
return truncatedHash.reduce((acc, curr) => acc * 256n + BigInt(curr), 0n);
}
const data = {
WidgetId: 3276,
CountryID: 67
};
const dataString = JSON.stringify(data);
const bucket = await convertToBucket(dataString);
console.log(bucket); // 126200478277438733997751102134640640264n
Nilai agregat
Nilai agregat dijumlahkan per kunci di banyak pengguna untuk menghasilkan insight agregat dalam bentuk nilai ringkasan dalam laporan ringkasan.
Sekarang, kembali ke contoh pertanyaan yang diajukan sebelumnya: "Berapa banyak pengguna yang telah melihat widget saya berasal dari Prancis?" Jawaban atas pertanyaan ini akan terlihat seperti "Sekitar 4881 pengguna yang telah melihat ID Widget 3276 saya berasal dari Prancis". Nilai agregat adalah 1 untuk setiap pengguna, dan "4881 pengguna" adalah nilai gabungan yang merupakan jumlah dari semua nilai agregat untuk kunci agregasi tersebut.
Kunci agregasi | Nilai agregat | |
ID Widget | ID Negara | Jumlah Penayangan |
3276 | 061 | 1 |
Untuk contoh ini, kita menambahkan nilai sebesar 1 untuk setiap pengguna yang melihat widget. Dalam praktiknya, nilai agregat dapat diskalakan untuk meningkatkan rasio sinyal-ke-derau.
Anggaran kontribusi
Setiap panggilan ke Private Aggregation API disebut kontribusi. Untuk melindungi privasi pengguna, jumlah kontribusi yang dapat dikumpulkan dari individu dibatasi.
Saat Anda menjumlahkan semua nilai agregat di semua kunci agregasi, jumlah tersebut harus kurang dari anggaran kontribusi. Anggaran dicakup per origin worklet, per hari, dan terpisah untuk Protected Audience API dan worklet Penyimpanan Bersama. Periode bergulir sekitar 24 jam terakhir digunakan untuk hari tersebut. Jika laporan agregat baru akan menyebabkan anggaran terlampaui, laporan tersebut tidak akan dibuat.
Anggaran kontribusi diwakili oleh parameter L1, dan ditetapkan ke 216 (65.536) per sepuluh menit per hari dengan backstop 220 (1.048.576). Lihat penjelasan untuk mempelajari parameter ini lebih lanjut.
Nilai anggaran kontribusi bersifat arbitrer, tetapi derau diskalakan sesuai dengan nilai tersebut. Anda dapat menggunakan anggaran ini untuk memaksimalkan rasio sinyal-derau pada nilai ringkasan (dibahas lebih lanjut di bagian Derau dan penskalaan).
Untuk mempelajari anggaran kontribusi lebih lanjut, lihat penjelasan. Selain itu, lihat Anggaran Kontribusi untuk panduan selengkapnya.
Batas kontribusi per laporan
Bergantung pada pemanggil, batas kontribusi dapat berbeda. Saat ini, laporan yang dibuat untuk pemanggil Shared Storage API dibatasi hingga 20 kontribusi per laporan. Di sisi lain, pemanggil Protected Audience API dibatasi hingga 100 kontribusi per laporan. Batas ini dipilih untuk menyeimbangkan jumlah kontribusi yang dapat disematkan dengan ukuran payload.
Untuk Penyimpanan Bersama, kontribusi yang dibuat dalam satu operasi run()
atau selectURL()
digabungkan ke dalam satu laporan. Untuk Protected Audience, kontribusi yang dibuat
oleh satu origin dalam lelang akan dikelompokkan bersama.
Kontribusi dengan padding
Kontribusi diubah lebih lanjut dengan fitur padding. Tindakan padding
payload akan melindungi informasi tentang jumlah sebenarnya kontribusi yang disematkan dalam
laporan agregat. Padding menambah payload dengan kontribusi null
(yaitu dengan nilai 0) untuk mencapai panjang yang tetap.
Laporan agregat
Setelah pengguna memanggil Private Aggregation API, browser akan menghasilkan
laporan agregat yang akan diproses oleh Layanan Agregasi pada waktu
yang akan datang untuk menghasilkan laporan
ringkasan. Laporan
agregat berformat JSON dan berisi daftar kontribusi
terenkripsi, yang masing-masing merupakan pasangan {aggregation key, aggregatable value}
.
Laporan gabungan dikirim dengan penundaan acak hingga satu jam.
Kontribusi dienkripsi dan tidak dapat dibaca di luar Layanan Agregasi. Layanan Agregasi mendekripsi laporan dan membuat laporan ringkasan. Kunci enkripsi untuk browser dan kunci dekripsi untuk Layanan Agregasi dikeluarkan oleh koordinator, yang bertindak sebagai layanan pengelolaan kunci. Koordinator menyimpan daftar hash biner dari image layanan untuk memverifikasi bahwa pemanggil diizinkan untuk menerima kunci dekripsi.
Contoh laporan agregat dengan mode debug diaktifkan:
"aggregation_service_payloads": [
{
"debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAAgGZidWNrZXRQAAAAAAAAAAAAAAAAAAAE0mlvcGVyYXRpb25paGlzdG9ncmFt",
"key_id": "2cc72b6a-b92f-4b78-b929-e3048294f4d6",
"payload": "a9Mk3XxvnfX70FsKrzcLNZPy+00kWYnoXF23ZpNXPz/Htv1KCzl/exzplqVlM/wvXdKUXCCtiGrDEL7BQ6MCbQp1NxbWzdXfdsZHGkZaLS2eF+vXw2UmLFH+BUg/zYMu13CxHtlNSFcZQQTwnCHb"
}
],
"debug_key": "777",
"shared_info": "{\"api\":\"shared-storage\",\"debug_mode\":\"enabled\",\"report_id\":\"5bc74ea5-7656-43da-9d76-5ea3ebb5fca5\",\"reporting_origin\":\"https://localhost:4437\",\"scheduled_report_time\":\"1664907229\",\"version\":\"0.1\"}"
Laporan gabungan dapat diperiksa dari
halaman chrome://private-aggregation-internals
:
Untuk tujuan pengujian, tombol "Kirim Laporan yang Dipilih" dapat digunakan untuk langsung mengirim laporan ke server.
Mengumpulkan dan mengelompokkan laporan gabungan
Browser mengirim laporan agregat ke asal worklet yang berisi panggilan ke Private Aggregation API, menggunakan jalur umum yang tercantum:
- Untuk Shared Storage:
/.well-known/private-aggregation/report-shared-storage
- Untuk Protected Audience:
/.well-known/private-aggregation/report-protected-audience
Di endpoint ini, Anda harus mengoperasikan server — yang bertindak sebagai kolektor — yang menerima laporan gabungan yang dikirim dari klien.
Server kemudian harus mengelompokkan laporan dan mengirim batch ke Layanan Agregasi. Buat batch berdasarkan informasi yang tersedia dalam payload
yang tidak dienkripsi dari laporan agregat, seperti kolom shared_info
. Idealnya,
batch harus berisi 100 laporan atau lebih per batch.
Anda dapat memutuskan untuk membuat batch secara harian atau mingguan. Strategi ini fleksibel, dan Anda dapat mengubah strategi pengelompokan untuk peristiwa tertentu yang Anda harapkan memiliki volume lebih besar—misalnya, hari dalam setahun saat lebih banyak tayangan iklan diharapkan. Batch harus menyertakan laporan dari versi API yang sama, asal pelaporan, dan waktu laporan terjadwal.
Memfilter ID
Private Aggregation API & Aggregation Service memungkinkan penggunaan ID pemfilteran untuk memproses pengukuran di tingkat yang lebih terperinci seperti per kampanye iklan, bukan memproses hasil dalam kueri yang lebih besar.
Untuk mulai menggunakannya sekarang, berikut beberapa langkah umum yang dapat diterapkan ke penerapan Anda saat ini.
Langkah-langkah Penyimpanan Bersama
Jika Anda menggunakan Shared Storage API dalam alur:
Tentukan tempat Anda akan mendeklarasikan dan menjalankan modul Shared Storage baru. Dalam contoh berikut, kita telah memberi nama file modul
filtering-worklet.js
, yang terdaftar difiltering-example
.(async function runFilteringIdsExample () { await window.sharedStorage.worklet.addModule('filtering-worklet.js'); await window.sharedStorage.run('filtering-example', { keepAlive: true, privateAggregationConfig: { contextId: 'example-id', filteringIdMaxBytes: 8 // optional } }}); })();
Perhatikan bahwa
filteringIdMaxBytes
dapat dikonfigurasi per laporan dan, jika tidak ditetapkan, akan ditetapkan secara default ke 1. Nilai default ini untuk mencegah peningkatan ukuran payload yang tidak perlu sehingga mengurangi biaya penyimpanan dan pemrosesan. Baca selengkapnya di penjelasan kontribusi fleksibel.Dalam file yang Anda gunakan di atas, dalam hal ini
filtering-worklet.js
, saat meneruskan kontribusi keprivateAggregation.contributeToHistogram(...)
dalam worklet Shared Storage, Anda dapat menentukan ID pemfilteran.// Within filtering-worklet.js class FilterOperation { async run() { let contributions = [{ bucket: 1234n, value: 56, filteringId: 3n // defaults to 0n if not assigned, type bigint }]; for (const c of contributions) { privateAggregation.contributeToHistogram(c); } … } }); register('filtering-example', FilterOperation);
Laporan gabungan akan dikirim ke tempat Anda menentukan endpoint
/.well-known/private-aggregation/report-shared-storage
. Lanjutkan ke panduan pemfilteran ID untuk mempelajari perubahan yang diperlukan dalam parameter tugas Layanan Agregasi.
Setelah pengelompokan selesai dan dikirim ke Layanan Agregasi yang di-deploy, hasil yang difilter akan ditampilkan dalam laporan ringkasan akhir.
Langkah-langkah Protected Audience
Jika Anda menggunakan Protected Audience API dalam alur:
Dalam penerapan Protected Audience saat ini, Anda dapat menetapkan hal berikut untuk terhubung ke Agregasi Pribadi. Tidak seperti Penyimpanan Bersama, Anda belum dapat mengonfigurasi ukuran maksimum ID pemfilteran. Secara default, ukuran maksimum ID pemfilteran adalah 1 byte dan akan ditetapkan ke
0n
. Perhatikan bahwa ini akan ditetapkan di fungsi pelaporan Protected Audience (misalnyareportResult()
ataugenerateBid()
).const contribution = { ... filteringId: 0n }; privateAggregation.contributeToHistogram(contribution);
Laporan gabungan akan dikirim ke tempat Anda menentukan endpoint
/.well-known/private-aggregation/report-protected-audience
. Setelah pengelompokan selesai dan dikirim ke Layanan Agregasi yang di-deploy, hasil yang difilter akan ditampilkan dalam laporan ringkasan akhir. Penjelasan berikut untuk Attribution Reporting API dan Private Aggregation API tersedia, serta proposal awal.
Lanjutkan ke panduan pemfilteran ID di Layanan Agregasi atau buka bagian Attribution Reporting API untuk membaca penjelasan yang lebih mendetail.
Layanan Agregasi
Layanan Agregasi menerima laporan agregat terenkripsi dari pengumpulan dan menghasilkan laporan ringkasan. Untuk strategi lebih lanjut tentang cara membuat batch laporan agregat di kolektor, lihat panduan pembuatan batch kami.
Layanan ini berjalan di trusted execution environment (TEE), yang memberikan tingkat jaminan untuk integritas data, kerahasiaan data, dan integritas kode. Jika Anda ingin melihat lebih dekat cara koordinator digunakan bersama TEE, baca selengkapnya tentang peran dan tujuannya.
Laporan ringkasan
Laporan ringkasan memungkinkan Anda melihat data yang telah dikumpulkan dengan penambahan derau. Anda dapat meminta laporan ringkasan untuk kumpulan kunci tertentu.
Laporan ringkasan berisi kumpulan key-value pair bergaya kamus JSON. Setiap pasangan berisi:
bucket
: kunci agregasi sebagai string angka biner. Jika kunci agregasi yang digunakan adalah "123", bucket-nya adalah "1111011".value
: nilai ringkasan untuk sasaran pengukuran tertentu, yang dijumlahkan dari semua laporan agregat yang tersedia dengan penambahan derau.
Contoh:
[
{"bucket":` `"111001001",` `"value":` `"2558500"},
{"bucket":` `"111101001",` `"value":` `"3256211"},
{"bucket":` `"111101001",` `"value":` `"6536542"},
]
Derau dan penskalaan
Untuk menjaga privasi pengguna, Layanan Agregasi menambahkan derau sekali ke setiap nilai ringkasan setiap kali laporan ringkasan diminta. Nilai derau diambil secara acak dari distribusi probabilitas Laplace. Meskipun Anda tidak mengontrol langsung cara penambahan derau, Anda dapat memengaruhi dampak derau pada data pengukurannya.
Distribusi derau sama, terlepas dari jumlah semua nilai agregat. Oleh karena itu, semakin tinggi nilai agregat, semakin kecil kemungkinan derau akan berdampak.
Misalnya, distribusi derau memiliki deviasi standar 100 dan berpusat pada nol. Jika nilai laporan agregat yang dikumpulkan (atau "nilai agregat") hanya 200, simpangan baku derau akan menjadi 50% dari nilai gabungan. Namun, jika nilai agregatnya adalah 20.000,deviasi standar derau hanya akan sebesar 0, 5% dari nilai gabungan. Jadi, nilai agregat sebesar 20.000 akan memiliki rasio sinyal-derau yang jauh lebih tinggi.
Oleh karena itu, mengalikan nilai agregat dengan faktor penskalaan dapat membantu mengurangi derau. Faktor penskalaan menunjukkan seberapa besar Anda ingin menskalakan nilai agregat tertentu.
Menskalakan nilai dengan memilih faktor penskalaan yang lebih besar akan mengurangi derau relatif. Namun, hal ini juga menyebabkan jumlah semua kontribusi di semua bucket mencapai batas anggaran kontribusi lebih cepat. Menskalakan nilai ke bawah dengan memilih konstanta faktor penskalaan yang lebih kecil akan meningkatkan derau relatif, tetapi mengurangi risiko mencapai batas anggaran.
Untuk menghitung faktor penskalaan yang sesuai, bagi anggaran kontribusi dengan jumlah maksimum nilai agregat di semua kunci.
Lihat Dokumentasi anggaran kontribusi untuk mempelajari lebih lanjut.
Berinteraksi dan memberikan masukan
Private Aggregation API sedang dalam diskusi aktif dan dapat berubah di masa mendatang. Jika Anda mencoba API ini dan memiliki masukan, kami ingin mendengarnya.
- GitHub: Baca penjelasan, ajukan pertanyaan, dan berpartisipasi dalam diskusi.
- Dukungan developer: Ajukan pertanyaan dan bergabunglah dalam diskusi di repo Dukungan Developer Privacy Sandbox.
- Bergabunglah dengan grup Shared Storage API dan grup Protected Audience API untuk mendapatkan pengumuman terbaru terkait Private Aggregation.