Este documento é um guia de início rápido para usar o armazenamento compartilhado e a agregação privada. Você precisa entender as duas APIs, porque o Shared Storage armazena os valores e a Private Aggregation cria os relatórios agregáveis.
Público-alvo:provedores de medição e adtechs.
API Shared Storage
Para evitar o rastreamento entre sites, os navegadores começaram a particionar todas as formas de armazenamento, incluindo armazenamento local, cookies e assim por diante. No entanto, há casos de uso em que o armazenamento não particionado é necessário. A API Shared Storage oferece acesso de gravação ilimitado a diferentes sites de nível superior com acesso de leitura que preserva a privacidade.
O Shared Storage é restrito à origem do contexto (o autor da chamada de
sharedStorage
).
O armazenamento compartilhado tem um limite de capacidade por origem. Cada entrada tem um número máximo de caracteres. Se o limite for atingido, nenhuma outra entrada será armazenada. Os limites de armazenamento de dados são descritos no explicador de armazenamento compartilhado.
Como invocar armazenamento compartilhado
As adtechs podem gravar no armazenamento compartilhado usando JavaScript ou cabeçalhos de resposta. A leitura do armazenamento compartilhado só ocorre em um ambiente JavaScript isolado chamado worklet.
Usar JavaScript: as adtechs podem executar funções específicas de armazenamento compartilhado, como definir, anexar e excluir valores fora de um worklet do JavaScript. No entanto, funções como a leitura do armazenamento compartilhado e a execução da agregação privada precisam ser concluídas usando um worklet JavaScript. Os métodos que podem ser usados fora de um worklet do JavaScript podem ser encontrados em Proposed API Surface - Outside the worklet.
Os métodos usados no worklet durante uma operação podem ser encontrados em Proposed API Surface - In the worklet.
Como usar cabeçalhos de resposta
Assim como no JavaScript, somente funções específicas como definir, anexar e excluir valores no armazenamento compartilhado podem ser feitas usando cabeçalhos de resposta. Para trabalhar com o Shared Storage em um cabeçalho de resposta,
Shared-Storage-Writable: ?1
precisa ser incluído no cabeçalho da solicitação.Para iniciar uma solicitação do cliente, execute o código abaixo, dependendo do método escolhido:
Como usar o
fetch()
fetch("https://a.example/path/for/updates", {sharedStorageWritable: true});
Usar uma tag
iframe
ouimg
<iframe src="https://a.example/path/for/updates" sharedstoragewritable></iframe>
Como usar um atributo IDL com uma tag
iframe
ouimg
let iframe = document.getElementById("my-iframe"); iframe.sharedStorageWritable = true; iframe.src = "https://a.example/path/for/updates";
Confira mais informações em Armazenamento compartilhado: cabeçalhos de resposta.
Como gravar no armazenamento compartilhado
Para gravar no armazenamento compartilhado, chame sharedStorage.set()
de dentro ou fora de um
worklet JavaScript. Se for chamado de fora do worklet, os dados serão gravados na
origem do contexto de navegação em que a chamada foi feita. Se chamados de
dentro do worklet, os dados são gravados na origem do contexto de navegação
que carregou o worklet. As chaves definidas têm uma data de validade de 30 dias a partir da última atualização.
O campo ignoreIfPresent
é opcional. Se estiver presente e definido como true
, a chave
não será atualizada se já existir. A validade da chave é renovada para 30 dias a partir
da chamada set()
, mesmo que a chave não seja atualizada.
Se o armazenamento compartilhado for acessado várias vezes na mesma carga de página com a mesma
chave, o valor dela será substituído. É recomendável usar
sharedStorage.append()
se a chave precisar manter o valor anterior.
Usando JavaScript
Fora do 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'}
Da mesma forma, dentro do worklet:
sharedStorage.set('myKey', 'myValue1', { ignoreIfPresent: true });
Como usar cabeçalhos de resposta
Também é possível gravar no armazenamento compartilhado usando cabeçalhos de resposta. Para fazer isso, use
Shared-Storage-Write
no cabeçalho de resposta com os seguintes comandos:Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present
Shared-Storage-Write : set;key="myKey";value="myValue";ignore_if_present=?0
Vários itens podem ser separados por vírgulas e podem combinar
set
,append
,delete
eclear
.Shared-Storage-Write : set;key="hello";value="world";ignore_if_present, set;key="good";value="bye"
Como anexar um valor
É possível anexar um valor a uma chave usando o método de anexação. Se a chave
não existir, a chamada append()
vai criar a chave e definir o valor. Isso pode ser feito usando JavaScript ou cabeçalhos de resposta.
Usando JavaScript
Para atualizar os valores das chaves atuais, use
sharedStorage.append()
dentro ou fora do 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'}
Para anexar dentro do worklet:
sharedStorage.append('myKey', 'myValue1');
Como usar cabeçalhos de resposta
Assim como ao definir um valor no Armazenamento compartilhado, você pode usar o
Shared-Storage-Write
no cabeçalho de resposta para transmitir o par de chave-valor.Shared-Storage-Write : append;key="myKey";value="myValue2"
Como ler do armazenamento compartilhado
Só é possível ler do armazenamento compartilhado em um worklet.
await sharedStorage.get('mykey');
A origem do contexto de navegação de onde o módulo do worklet foi carregado determina de quem é o Armazenamento compartilhado que será lido.
Como excluir do armazenamento compartilhado
É possível realizar exclusões do armazenamento compartilhado usando JavaScript dentro
ou fora do worklet ou usando cabeçalhos de resposta com delete()
. Para excluir
todas as chaves de uma vez, use clear()
em qualquer uma delas.
Usando JavaScript
Para excluir do armazenamento compartilhado de fora do worklet:
window.sharedStorage.delete('myKey');
Para excluir do armazenamento compartilhado dentro do worklet:
sharedStorage.delete('myKey');
Para excluir todas as chaves de uma só vez fora do worklet:
window.sharedStorage.clear();
Para excluir todas as chaves de uma vez dentro do worklet:
sharedStorage.clear();
Como usar cabeçalhos de resposta
Para excluir valores usando cabeçalhos de resposta, você também pode usar
Shared-Storage-Write
no cabeçalho de resposta para transmitir a chave a ser excluída.delete;key="myKey"
Para excluir todas as chaves usando cabeçalhos de resposta:
clear;
Troca de contexto
Os dados do Shared Storage são gravados na origem (por exemplo, https://example.adtech.com) do contexto de navegação de onde a chamada originou.
Quando você carrega o código de terceiros usando uma tag <script>
, ele é executado
no contexto de navegação do incorporador. Portanto, quando o código de terceiros
chama sharedStorage.set()
, os dados são gravados no armazenamento
compartilhado do incorporador. Quando você carrega o código de terceiros em um iframe, ele recebe
um novo contexto de navegação, e a origem dele é a origem do iframe. Portanto,
a chamada sharedStorage.set()
feita pelo iframe armazena os dados no
armazenamento compartilhado da origem do iframe.
Contexto próprio
Se uma página própria tiver um código JavaScript de terceiros incorporado que chame
sharedStorage.set()
ou sharedStorage.delete()
, o par de chave-valor será armazenado
no contexto próprio.
Contexto de terceiros
O par de chave-valor pode ser armazenado na adtech ou no contexto de terceiros criando um iframe e chamando set()
ou delete()
no código JavaScript dentro do iframe.
API Private Aggregation
Para medir os dados agregáveis armazenados no armazenamento compartilhado, use a API Private Aggregate.
Para criar um relatório, chame contributeToHistogram()
dentro de um worklet com um
bucket e um valor. O bucket é representado por um número inteiro de 128 bits sem assinatura, que
precisa ser transmitido para a função como um BigInt
. O valor é um número inteiro positivo.
Para proteger a privacidade, o payload do relatório, que contém o bucket e o valor, é criptografado em trânsito e só pode ser descriptografado e agregado usando o serviço de agregação.
O navegador também limitará as contribuições que um site pode fazer em uma consulta de saída. Especificamente, o orçamento de contribuição limita o total de todos os relatórios de um único site para determinado navegador em um determinado período em todos os buckets. Se o orçamento atual for excedido, um relatório não será gerado.
privateAggregation.contributeToHistogram({
bucket: BigInt(myBucket),
value: parseInt(myBucketValue)
});
Como executar o armazenamento compartilhado e a agregação particular
Você precisa criar um worklet para acessar dados do armazenamento compartilhado. Para fazer isso, chame
createWorklet()
com o URL do worklet. Por padrão, ao usar o armazenamento
compartilhado com createWorklet()
, a origem da partição de dados será a origem
do contexto de navegação
de invocação, não a origem do próprio script do worklet.
Para mudar o comportamento padrão, defina a propriedade dataOrigin
ao chamar
createWorklet
.
dataOrigin: "context-origin"
: (padrão) os dados são armazenados no armazenamento compartilhado da origem do contexto de navegação de invocação.dataOrigin: "script-origin"
: os dados são armazenados no armazenamento compartilhado da origem do script do worklet. É necessário ativar o modo.
sharedStorage.createWorklet(scriptUrl, {dataOrigin: "script-origin"});
Para ativar, ao usar "script-origin"
, o endpoint do script precisará
responder com o cabeçalho Shared-Storage-Cross-Origin-Worklet-Allowed
. O
CORS precisa estar ativado para
solicitações entre origens.
Shared-Storage-Cross-Origin-Worklet-Allowed : ?1
Como usar iframes entre origens
Um iframe é necessário para invocar o worklet de armazenamento compartilhado.
No iframe do anúncio, chame addModule()
para carregar o módulo do worklet. Para executar o
método registrado no arquivo de worklet sharedStorageWorklet.js
, chame sharedStorage.run()
no
mesmo iframe de anúncio JavaScript.
const sharedStorageWorklet = await window.sharedStorage.createWorklet(
'https://any-origin.example/modules/sharedStorageWorklet.js'
);
await sharedStorageWorklet.run('shared-storage-report', {
data: { campaignId: '1234' },
});
No script do worklet, você precisa criar uma classe com um método run
assíncrono
e register
para que ele seja executado no iframe do anúncio. Dentro de
sharedStorageWorklet.js
:
class SharedStorageReportOperation {
async run(data) {
// Other code goes here.
bucket = getBucket(...);
value = getValue(...);
privateAggregation.contributeToHistogram({
bucket,
value
});
}
}
register('shared-storage-report', SharedStorageReportOperation);
Como usar solicitação de origem cruzada
O armazenamento compartilhado e a agregação privada permitem a criação de worklets de origem cruzada sem a necessidade de iframes de origem cruzada.
A página própria também pode invocar uma chamada createWorklet()
para o endpoint de JavaScript entre origens. Ao criar o worklet, defina a origem da partição de dados
do worklet como a mesma da origem do script.
async function crossOriginCall() {
const privateAggregationWorklet = await sharedStorage.createWorklet(
'https://cross-origin.example/js/worklet.js',
{ dataOrigin: 'script-origin' }
);
await privateAggregationWorklet.run('pa-worklet');
}
crossOriginCall();
O endpoint de JavaScript entre origens terá que responder com os cabeçalhos
Shared-Storage-Cross-Origin-Worklet-Allowed
e observar que o CORS está ativado para
a solicitação.
Shared-Storage-Cross-Origin-Worklet-Allowed : ?1
Os Worklets criados usando createWorklet()
terão selectURL
e run()
.
O addModule()
não está disponível para isso.
class CrossOriginWorklet {
async run(data){
// Other code goes here.
bucket = getBucket(...);
value = getValue(...);
privateAggregation.contributeToHistogram({
bucket,
value
});
}
}
Próximas etapas
As páginas a seguir explicam aspectos importantes das APIs Shared Storage e Private Aggregation.
- Introdução ao armazenamento compartilhado (Chrome para desenvolvedores)
- Casos de uso de armazenamento compartilhado (Chrome para desenvolvedores)
- Introdução à agregação particular (Chrome para desenvolvedores)
- Explicação do armazenamento compartilhado (GitHub)
- Explicação sobre agregação privada (GitHub)
- Demonstração de armazenamento compartilhado e agregação privada
Depois de conhecer as APIs, você pode começar a coletar os relatórios, que são enviados como uma solicitação POST para os endpoints a seguir como JSON no corpo da solicitação.
- Relatórios de depuração:
context-origin/.well-known/private-aggregation/debug/report-shared-storage
- Relatórios:
context-origin/.well-known/private-aggregation/report-shared-storage
Depois que os relatórios forem coletados, você poderá testar usando a ferramenta de teste local ou configurar o Ambiente de execução confiável para o serviço de agregação para receber os relatórios agregados.
Envie feedback
Compartilhe seu feedback sobre as APIs e a documentação no GitHub.