實作共用儲存空間和私密匯總的快速入門導覽課程

本文件是快速入門指南,說明使用共用儲存空間與私人功能的方式 匯總。您必須瞭解這兩個 API,因為 Shared Storage 會儲存值,而 Private Aggregation 會建立可匯總的報表。

目標對象:廣告技術和評估服務供應商。

立即試用

歡迎體驗現場示範!請按照示範操作說明中的步驟啟用 Privacy Sandbox API。開啟 Chrome 開發人員工具,可協助您將不同用途的結果視覺化。用途 操作示範:

  • 私人匯總資料
    • Unique Reach 評估
    • 客層評估
    • K+ 頻率評估
  • 一般使用情況
    • 測量圍欄頁框內的遊標懸停事件
    • 頂層導覽
    • 控管第三方寫入權限

如何查看共用儲存空間

如要查看儲存在共用儲存空間中的內容,請使用 Chrome 開發人員工具。儲存的資料可在 Application -> Shared Storage 中找到。

使用 Chrome 開發人員工具查看共用儲存空間中的資料。

查看私密匯總報表

如要查看已傳送的可匯總報表,請前往 chrome://private-aggregation-internals。啟用偵錯模式後,系統就會 就會立即 (不會延遲) 傳送至 [[YOUR_ORIGIN]]/.well-known/private-aggregation/debug/report-shared-storage 以及要寄送的即時報表 [[YOUR_ORIGIN]]/.well-known/private-aggregation/report-shared-storage

如要啟用偵錯功能,請按照偵錯中的指示操作 專區。

在 chrome://private-aggregation-internals 中查看報表。

Shared Storage API

為了防止跨網站追蹤,瀏覽器已開始分割所有形式的儲存空間,包括本機儲存空間、Cookie 等。但有些用途需要使用未分割的儲存空間。Shared Storage API 提供 無限次寫入不同頂層網站的寫入權限,並保護隱私權 讀取權限

共用儲存空間僅限於內容來源 (sharedStorage 的呼叫端)。

共用儲存空間對每個來源有限制,每個來源的項目數量上限為 字元數上限。如果達到上限,系統就不會再儲存其他輸入內容。請參閱共用儲存空間說明,瞭解資料儲存空間限制。

叫用共用儲存空間

廣告技術人員可以使用 JavaScript 或回應標頭寫入共用儲存空間。只能在獨立的 JavaScript 中讀取共用儲存空間的資料 稱為 Worklet

  • 使用 JavaScript 廣告技術可以執行特定的共用儲存空間函式 例如在 JavaScript 以外的設定、附加和刪除值 Worklet。不過,讀取共用儲存空間和執行私人匯總等函式必須透過 JavaScript 工作區完成。如要瞭解可在 JavaScript 工作區外使用的各項方法,請參閱「建議的 API 途徑 - 工作區外」。

    您可以在「建議的 API 途徑 - 在 worklet 中」一節中,查看在作業期間在 worklet 中使用的各項方法。

  • 使用回應標頭

    與 JavaScript 類似,只有特定函式,例如設定、附加、 以及刪除共用儲存空間中的值。目的地: 適用於回應標頭中的共用儲存空間 (Shared-Storage-Writable: ?1) 都必須加到要求標頭中

    如要從用戶端啟動要求,請根據以下項目執行下列程式碼: 即可查看下列選項:

    • 使用fetch()

      fetch("https://a.example/path/for/updates", {sharedStorageWritable: true});
      
    • 使用 iframeimg 標記

      <iframe src="https://a.example/path/for/updates" sharedstoragewritable></iframe>
      
    • 搭配 iframeimg 標記使用 IDL 屬性

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

詳情請參閱「共用儲存空間:回應標頭」。

寫入共用儲存空間

如要寫入 Shared Storage,請從 JavaScript 工作區內或外呼叫 sharedStorage.set()。如果從工作程式外部呼叫,系統會將資料寫入 發出呼叫的瀏覽環境來源。如果不是透過 將資料寫入瀏覽背景的原始碼 載入了小程式所設定的金鑰到期日為 30 距離上次更新的天數。

ignoreIfPresent 為選填欄位。如果鍵已存在且已設為 true,則系統不會更新該鍵。金鑰到期日為 30 天,自 set() 呼叫。

如果在同一個網頁載入中使用相同的鍵多次存取共用儲存空間,系統會覆寫該鍵的值。建議你使用 sharedStorage.append() 表示鍵需要維持先前的值。

  • 使用 JavaScript

    工作坊之外:

    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'}
    

    同樣地,在工作區塊中:

    sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
    
  • 使用回應標頭

    您也可以使用回應標頭寫入 Shared Storage。方法是使用 回應標頭中的 Shared-Storage-Write 以及以下項目 指令:

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

    多個項目可以以半形逗號分隔,並可以合併 setappenddeleteclear

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

附加值

您可以使用附加方法,將值附加至現有鍵。如果索引鍵 不存在,呼叫 append() 會建立鍵並設定值。這可以 可透過 JavaScript 或回應標頭完成。

  • 使用 JavaScript

    如要更新現有鍵的值,請使用 sharedStorage.append() 設計模型

    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'}
    

    在 Worklet 中附加以下內容:

    sharedStorage.append('myKey', 'myValue1');
    
  • 使用回應標頭

    與在 Shared Storage 中設定值類似,您可以在回應標頭中使用 Shared-Storage-Write 傳入鍵/值組合。

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

從共用儲存空間讀取

您只能在工作區中讀取共用儲存空間。

await sharedStorage.get('mykey');

從中載入工作模組的瀏覽內容來源,會決定要讀取哪個共用儲存空間。

從共用儲存空間刪除

您可以使用 JavaScript 從共用儲存空間中刪除 或在 Worklet 之外使用回應標頭搭配 delete()。如要刪除,請按照下列步驟操作: 一次使用所有金鑰的 clear()

  • 使用 JavaScript

    如要從工作區塊外部刪除共用儲存空間中的資料,請按照下列步驟操作:

    window.sharedStorage.delete('myKey');
    

    如何從小程式內部刪除共用儲存空間:

    sharedStorage.delete('myKey');
    

    如要從工作單元外部一次刪除所有鍵,請按照下列步驟操作:

    window.sharedStorage.clear();
    

    如要在工作單元內一次刪除所有鍵,請按照下列步驟操作:

    sharedStorage.clear();
    
  • 使用回應標頭

    如要使用回應標頭刪除值,您也可以在回應標頭中使用 Shared-Storage-Write,傳遞要刪除的鍵。

    delete;key="myKey"
    

    如何刪除使用回應標頭的所有金鑰:

    clear;
    

背景切換

共用儲存空間資料會寫入 來源 (例如 https://example.adtech.com) 其流量

使用 <script> 標記載入第三方程式碼時,程式碼會在內嵌程式的瀏覽內容中執行。因此,當第三方程式碼 呼叫 sharedStorage.set(),則會將資料寫入嵌入器的 Shared 儲存空間:當您在 iframe 中載入第三方程式碼時,程式碼會收到新的瀏覽內容,其來源為 iframe 的來源。因此,從 iframe 發出的 sharedStorage.set() 呼叫會將資料儲存至 iframe 來源的 Shared Storage。

第一方情境

如果第一方網頁嵌入了會呼叫的第三方 JavaScript 程式碼, sharedStorage.set()sharedStorage.delete(),系統會儲存鍵/值組合 都一樣

資料儲存在含有內嵌第三方 JavaScript 的第一方網頁上。

第三方情境

您可以建立 iframe,並在 iframe 內的 JavaScript 程式碼中呼叫 set()delete(),將鍵/值組合儲存在廣告技術或第三方內容中。

儲存在廣告技術或第三方內容中的資料。

私密匯總 API

如要測量儲存在共用儲存空間中的可匯總資料,您可以使用「私人」 匯總 API。

如要建立報表,請在工作程式中呼叫 contributeToHistogram(),並加上 值區和值這個區塊會以不帶正負號的 128 位元整數表示,且必須以 BigInt 的形式傳遞至函式。值為正整數。

為保護隱私,報表酬載,其中包含值區和值; 且只有在傳輸過程中加密及匯總時,才能使用 匯總服務。

瀏覽器也會限制網站可對輸出查詢做出的貢獻。具體而言,使用者接受度 預算 限制某個瀏覽器在特定瀏覽器中從單一網站產生的所有報表總數 所有值區的指定時間範圍如果超出目前的預算, 不會產生報表

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

執行共用儲存空間和私密匯總

您必須建立工作物件,才能存取共用儲存空間中的資料。方法是呼叫 createWorklet() 為工作程式的網址。在預設情況下,當您使用共用項目時 儲存空間為 createWorklet(),資料分區來源會是叫用 瀏覽情境 而不是 Worklet 指令碼本身的來源

如要變更預設行為,請在呼叫 createWorklet 時設定 dataOrigin 屬性。

  • dataOrigin: "context-origin":(預設) 資料會儲存在叫用瀏覽內容的來源共用儲存空間中。
  • dataOrigin: "script-origin":資料會儲存在 Worklet 指令碼的來源。請注意,您必須選擇採用才能啟用這個模式。
sharedStorage.createWorklet(scriptUrl, {dataOrigin: "script-origin"});

如要選擇加入,請在使用 "script-origin" 時,指令碼端點必須以標頭 Shared-Storage-Cross-Origin-Worklet-Allowed 回應。請注意,應為跨來源要求啟用 CORS

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

使用跨來源 iframe

必須使用 iframe 即可叫用共用儲存空間工作程式。

在廣告的 iframe 中,呼叫 addModule() 以載入 worklet 模組。如要在同一個廣告 iframe JavaScript 中,執行 sharedStorageWorklet.js 工作區塊檔案中註冊的方法,請呼叫 sharedStorage.run()

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

在 worklet 指令碼中,您需要使用非同步 run 方法建立類別,並將其 register 執行在廣告的 iframe 中。內部實景 sharedStorageWorklet.js:

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

使用跨來源要求

共用儲存空間與私人匯總功能可讓您建立跨來源 Worklet 也不需要跨來源 iframe

第一方網頁也可以對跨來源 JavaScript 端點叫用 createWorklet()。您必須設定資料分區來源 也就是建立 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();

跨來源 JavaScript 端點必須使用標頭 Shared-Storage-Cross-Origin-Worklet-Allowed 回應,並註明已為要求啟用 CORS。

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

使用 createWorklet() 建立的工作項會包含 selectURLrun()addModule() 無法用於此用途。

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

偵錯

如要啟用偵錯功能,請在使用共用儲存空間和私人匯總功能的相同情境中呼叫 enableDebugMode() JavaScript 方法。這將是 以及用於日後的報表

privateAggregation.enableDebugMode();

如要將報表與觸發事件的情境建立關聯,您可以設定 64 位元無正負號整數偵錯金鑰,並傳遞至 JavaScript 呼叫。debugKeyBigInt

privateAggregation.enableDebugMode({debugKey: 1234});

共用儲存空間偵錯

Shared Storage 會傳回一般錯誤訊息:

Promise is rejected without and explicit error message

您可以偵錯共用儲存空間,只要將呼叫包裝成 try-catch 方塊。

try {
  privateAggregation.contributeToHistogram({bucket, value});
} catch (e){
  console.log(e);
}

私密匯總偵錯

系統會將報表傳送至 /.well-known/private-aggregation/report-shared-storage/.well-known/private-aggregation/debug/report-shared-storage。偵錯報表 接收類似下列 JSON 的酬載。此酬載定義了 api 當做「shared-storage」欄位

{
   "aggregation_coordinator_origin": "https://publickeyservice.msmt.gcp.privacysandboxservices.com",
   "aggregation_service_payloads": [ {
      "debug_cleartext_payload": "omRkYXRhlKJldmFsdWVEAAAAgGZidWNrZXRQAAAAAAAAAAAAAAAAB1vNFaJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAKJldmFsdWVEAAAAAGZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAGlvcGVyYXRpb25paGlzdG9ncmFt",
      "key_id": "1569ab37-da44-4a26-80d9-5ed6524ab2a7",
      "payload": "/9nHrWn1MnJWRxFvanbubciWE9mPyIij6uYLi5k351eQCd3/TZpe2knaatUNcniq4a4e61tmKebv50OmMRZFnnCfcAwIdIgLHu1a3en97PojqWJBfO52RiVMIcP7KQTLzMxq2LhvPSdV4zjXo1Teu/JuIK3LIyis3vUMpS+tUAX0QV+I6X5SVmZFiNW9aMb8DwLOtqrBy5JJ/EkOIY0G+1Fi1/3R7UtKsqM1o71A/OzdmlNkwO7EV/VUNinGvWnd19FvDHe/kqkNdTHKbhAnMmbZzHW9bsEQS81leElCla6BTdbdbeeFU/jbTj0AOaoNOIe5r7FU5NG6nW4ULXTCbLLjTQ1mtl3id3IP41Zin1JvABCDC/HUSgLFz8EUqkmbMIOlMfNYA79aURq6FqE0GO0HtICYf0GPNdVv7p4jY3FNn6+JS4l5F3t+3lP9ceo4IpCE+31jzMtYJ+19xFh6C5ufteBR/iknZFcc1w3caQBhgRl5jt8DbaOzYcW4690H8Ul4Oh2wRO+6/njifk+pExLay/O5swLi2lUUph5OUEaaztwwzh2mnhwIBxMkPnfsGihiF+5KDEajVfMZ3NLsIDoZO+l4RTZrkqE+jVkAqaZGBiCIx42Edp/JV0DXfrryypCdQBZr8iEbSzCM9hKsMfLN7S/VkPe5rDwOZbhKCn5XXgfGz5tSx/KbZgsQf4OCEhwAyNPHAh3MHU7xmkQ3pKg4EIUC/WOtKAlVDOtDMmPPoQY1eAwJhw9SxZaYF1kHjUkTm3EnGhgXgOwCRWqeboNenSFaCyp6DbFNI3+ImONMi2oswrrZO+54Tyhca5mnLIiInI+C3SlP4Sv1jFECIUdf/mifJRM5hMj6OChzHf4sEifjqtD4A30c4OzGexWarie2xakdQej9Go4Lm0GZEDBfcAdWLT9HwmpeI2u4HDAblXDvLN8jYFDOOtzOl90oU7AwdhkumUCFLRadXAccXW9SvLfDswRkXMffMJLFqkRKVE1GPonFFtlzaRqp7IgE8L6AOtz6NDcxAjHnEuzDPPMcWMl1AFH0gq7h"
   } ],
   "debug_key": "1234",
   "shared_info": "{\"api\":\"shared-storage\",\"debug_mode\":\"enabled\",\"report_id\":\"80d93c0a-a94e-4ab7-aeb5-a4ecd4bfc598\",\"reporting_origin\":\"https://privacy-sandbox-demos-dsp.dev\",\"scheduled_report_time\":\"1717784740\",\"version\":\"0.1\"}"
}

偵錯明文酬載

debug_cleartext_payload 採用 CBORBase64 編碼。您可以查看值區 透過解碼器指定值 「共用儲存空間」中的 JavaScript 程式碼 解碼器

後續步驟

以下頁面說明「共用儲存空間」與「私人」的重要事項 匯總 API。

當您熟悉 API 後,即可開始收集報表 並以 POST 要求的形式傳送至下列端點 要求主體

  • 偵錯報表 - context-origin/.well-known/private-aggregation/debug/report-shared-storage
  • 報告 - context-origin/.well-known/private-aggregation/report-shared-storage

收集報表後,您可以使用本機測試工具進行測試,或設定匯總服務的受信任執行環境,以便取得匯總報表。

提供意見

歡迎在 GitHub 上分享您對 API 和說明文件的意見。