Introdução aos tokens de confiança

Os tokens de confiança são uma nova API que permite que um site transmita uma quantidade limitada de informações de um contexto de navegação para outro (por exemplo, entre sites) com o objetivo de combater fraudes sem rastreamento passivo.



Resumo

Os tokens de confiança permitem que uma origem emita tokens criptográficos para um usuário de confiança. Os tokens são armazenados pelo navegador do usuário. O navegador pode então usar os tokens em outros contextos para avaliar a autenticidade do usuário.

A API Trust Token permite que a confiança de um usuário em um contexto seja transmitida para outro contexto sem identificar o usuário ou vincular as duas identidades.

Teste a API com nossa demonstração e inspecione tokens nas guias Rede e Aplicativo do Chrome DevTools.

Captura de tela mostrando os tokens de confiança na guia "Rede" do Chrome DevTools.
Tokens de confiança na guia Rede do Chrome DevTools.
Captura de tela mostrando os tokens de confiança na guia "Application" do Chrome DevTools.
Tokens de confiança na guia Aplicativo do Chrome DevTools.

Por que precisamos de tokens de confiança?

A Web precisa de meios para estabelecer sinais de confiança que mostrem que um usuário é quem diz ser, e não um bot fingindo ser um ser humano ou um terceiro mal-intencionado que está enganando uma pessoa ou serviço real. A proteção contra fraudes é especialmente importante para anunciantes, provedores de anúncios e CDNs.

Infelizmente, muitos mecanismos existentes para avaliar e propagar a confiabilidade (por exemplo, para descobrir se a interação com um site é realizada por uma pessoa real) aproveitam técnicas que também podem ser usadas para técnicas de impressão digital.

A API precisa preservar a privacidade, permitindo que a confiança seja propagada em sites sem o rastreamento individual de um usuário.

O que está incluído na proposta de tokens de confiança?

A Web precisa criar indicadores de confiança para detectar fraudes e spamming. Uma maneira de fazer isso é rastrear a navegação com identificadores globais por usuário entre sites. Para uma API que preserva a privacidade, isso não é aceitável.

Na explicação da proposta:

Essa API propõe uma nova área de armazenamento por origem para tokens criptográficos no estilo "Cartão de privacidade", que podem ser acessados em contextos de terceiros. Esses tokens não são personalizados e não podem ser usados para rastrear usuários, mas são assinados criptograficamente para que não possam ser forjados.

Quando uma origem está em um contexto em que confia no usuário, ela pode emitir para o navegador um lote de tokens, que podem ser "gastos" mais tarde em um contexto em que o usuário seria desconhecido ou menos confiável. É crucial que os tokens sejam indistinguíveis uns dos outros, impedindo que os sites rastreiem os usuários por eles.

Propomos ainda um mecanismo de extensão para o navegador assinar solicitações enviadas com chaves vinculadas a um resgate de token específico.

Exemplo de uso da API

O código a seguir é adaptado do exemplo de código na explicação da API.

Imagine que um usuário acessa um site de notícias (publisher.example) que incorpora publicidade de uma rede de publicidade de terceiros (foo.example). O usuário já usou um site de mídia social que emite tokens de confiança (issuer.example).

A sequência abaixo mostra como os tokens de confiança funcionam.

1.O usuário acessa issuer.example e realiza ações que levam o site a acreditar que ele é um ser humano real, como uma atividade da conta ou a transmissão de um desafio CAPTCHA.

2.O issuer.example verifica se o usuário é humano e executa o seguinte JavaScript para emitir um token de confiança ao navegador do usuário:

fetch('https://issuer.example/trust-token', {
  trustToken: {
    type: 'token-request',
    issuer: 'https://issuer.example'
  }
}).then(...)

3.O navegador do usuário armazena o token de confiança, associando-o a issuer.example.

4.Algum tempo depois, o usuário visita publisher.example.

5.publisher.example quer saber se o usuário é uma pessoa real. publisher.example confia em issuer.example, então ele verifica se o navegador do usuário tem tokens válidos dessa origem:

document.hasTrustToken('https://issuer.example');

6.Se retornar uma promessa que é resolvida como true, isso significa que o usuário tem tokens de issuer.example. Portanto, publisher.example pode tentar resgatar um token:

fetch('https://issuer.example/trust-token', {
trustToken: {
  type: 'token-redemption',
  issuer: 'https://issuer.example',
  refreshPolicy: {none, refresh}
}
}).then(...)

Por este:

  1. O usuário que fez o resgate (publisher.example) solicita um resgate.
  2. Se o resgate for bem-sucedido, o emissor issuer.example retornará um registro de resgate que indica que, em algum momento, ele emitiu um token válido para esse navegador.

    7.Quando a promessa retornada por fetch() for resolvida, o registro de resgate poderá ser usado em solicitações de recursos subsequentes:

fetch('https://foo.example/get-content', {
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['https://issuer.example', ...]
  }
});

Por este:

  1. Os registros de resgate são incluídos como um cabeçalho de solicitação Sec-Redemption-Record.
  2. foo.example recebe o registro de resgate e pode analisar o registro para determinar se issuer.example acreditava que esse usuário era humano.
  3. foo.example responde da maneira adequada.
Como um site pode determinar se confia em você?

Você pode ter um histórico de compras com um site de e-commerce, check-ins em uma plataforma de localização ou histórico de conta em um banco. Os emissores também podem analisar outros fatores, como há quanto tempo você tem uma conta ou outras interações (como CAPTCHAs ou envio de formulário) que aumentam a confiança do emissor na probabilidade de você ser um ser humano real.

Emissão de token de confiança

Se o usuário for considerado confiável por um emissor de token de confiança, como issuer.example, o emissor poderá buscar tokens de confiança para o usuário fazendo uma solicitação fetch() com um parâmetro trustToken:

fetch('issuer.example/trust-token', {
  trustToken: {
    type: 'token-request'
  }
}).then(...)

Isso invoca uma extensão do protocolo de emissão do cartão de privacidade usando um novo primitivo criptográfico:

  1. Gere um conjunto de números pseudoaleatórios conhecidos como valores de uso único.

  2. Oculte os valores de uso único (codifique-os para que o emissor não possa ver o conteúdo deles) e anexe-os à solicitação em um cabeçalho Sec-Trust-Token.

  3. Envie uma solicitação POST para o endpoint fornecido.

O endpoint responde com tokens mascarados (assinaturas nos valores de uso único cegos). Em seguida, os tokens são removidos e armazenados internamente com os valores de uso único associados pelo navegador como tokens de confiança.

Resgate de token de confiança

Um site de editor (como publisher.example no exemplo acima) pode verificar se há tokens de confiança disponíveis para o usuário:

const userHasTokens = await document.hasTrustToken('issuer.example/trust-token');

Se houver tokens disponíveis, o site do editor poderá resgatá-los para obter um registro de resgate:

fetch('issuer.example/trust-token', {
  ...
  trustToken: {
    type: 'token-redemption',
    refreshPolicy: 'none'
  }
  ...
}).then(...)

O editor pode incluir registros de resgate em solicitações que exigem um token de confiança, como postar um comentário, marcar uma página como "Gostei" ou votar em uma enquete, usando uma chamada fetch() como esta:

fetch('https://foo.example/post-comment', {
  ...
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['issuer.example/trust-token', ...]
  }
  ...
}).then(...);

Os registros de resgate são incluídos como um cabeçalho de solicitação Sec-Redemption-Record.

Considerações sobre privacidade

Os tokens são projetados para serem "não vinculáveis". Um emissor pode aprender informações agregadas sobre os sites que os usuários dele acessam, mas não pode vincular a emissão com o resgate: quando um usuário resgata um token, o emissor não consegue diferenciar o token de outros que criou. No entanto, os tokens de confiança não existem no vácuo: há outras maneiras, em teoria, de que um emissor pode, em teoria, associar a identidade de um usuário em sites, como cookies de terceiros e técnicas de rastreamento oculto. É importante que os sites entendam essa transição do ecossistema enquanto planejam o suporte. Esse é um aspecto geral da transição de muitas APIs do Sandbox de privacidade e não será discutido mais adiante.

Considerações sobre segurança

Esgotamento do token de confiança:um site malicioso pode esgotar deliberadamente o fornecimento de tokens de um emissor específico por um usuário. Há várias mitigações contra esse tipo de ataque, como permitir que os emissores forneçam muitos tokens de uma só vez para que os usuários tenham a opção adequada de garantir que os navegadores resgatem apenas um token por visualização de página de nível superior.

Prevenção contra gastos duplos:o malware pode tentar acessar todos os tokens de confiança de um usuário. No entanto, os tokens acabam ao longo do tempo, já que cada resgate é enviado para o mesmo emissor de token, que pode verificar se cada token é usado apenas uma vez. Para reduzir o risco, os emissores também podem assinar menos tokens.

Mecanismos de solicitação

Talvez seja possível permitir o envio de registros de resgate fora de fetch(), por exemplo, com solicitações de navegação. Os sites também podem incluir dados do emissor em cabeçalhos de resposta HTTP para ativar o resgate de tokens em paralelo com o carregamento da página.

Reiterando: esta proposta precisa do seu feedback. Se você tiver comentários, crie um problema no repositório de explicações do token de confiança.

Saiba mais


Agradecemos a todos que ajudaram a escrever e avaliar esta postagem.

Foto de ZSun Fu no Unsplash.