Introdução aos tokens de confiança

O Trust Tokens é 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 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 os tokens nas guias Rede e Aplicativo do Chrome DevTools.

Captura de tela mostrando 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 "Aplicativo" do Chrome DevTools.
Tokens de confiança na guia Aplicativo do Chrome DevTools.

Por que precisamos de tokens de confiança?

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

Infelizmente, muitos mecanismos para avaliar e propagar confiabilidade (para saber se uma interação com um site é feita por uma pessoa real, por exemplo) 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 entre sites sem o rastreamento individual do usuário.

O que há na proposta de tokens de confiança?

A Web depende da criação de indicadores de confiança para detectar fraudes e spam. 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.

Explicação da proposta:

Essa API propõe uma nova área de armazenamento por origem para tokens criptográficos no estilo "Passe 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, portanto, não podem ser forjados.

Quando uma origem está em um contexto em que o usuário é confiável, ela pode emitir para o navegador um lote de tokens, que pode ser "gasto" mais tarde em um contexto em que o usuário seria desconhecido ou menos confiável. É importante ressaltar que os tokens não podem ser distinguidos um do outro, impedindo que os sites rastreiem usuários por meio deles.

Também sugerimos um mecanismo de extensão para o navegador assinar solicitações de saída com chaves vinculadas a um resgate de token específico.

Exemplo de uso da API

Confira abaixo uma adaptação do exemplo de código na explicação da API.

Imagine que um usuário visita 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 visita issuer.example e realiza ações que levam o site a acreditar que ele é um ser humano real, como atividade da conta ou aprovação em um desafio CAPTCHA.

2.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 é um ser humano 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 isso retornar uma promessa que é resolvida como true, isso significa que o usuário tem tokens de issuer.example, então 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 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.Depois que 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 analisá-lo para determinar se issuer.example achou que esse usuário era humano.
  3. foo.example responde de acordo com isso.
Como um site pode saber se é confiável ou não em você?

É possível ter histórico de compras em um site de e-commerce, check-ins em uma plataforma de localização ou histórico de contas 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 uma pessoa 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. Ocultar os valores de uso único (codificá-los para que o emissor não possa ver o conteúdo deles) e anexá-los à solicitação em um cabeçalho Sec-Trust-Token.

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

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

Resgate de tokens 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 conseguir 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 com "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 foram criados para serem "não vinculáveis". Um emissor pode aprender informações agregadas sobre quais sites os usuários visitam, mas não pode vincular a emissão ao resgate: quando um usuário resgata um token, o emissor não consegue diferenciá-lo de outros tokens criados por ele. No entanto, os tokens de confiança atualmente não existem no vácuo: há outras maneiras pelas quais um emissor poderia, na teoria, mesclar a identidade de um usuário em sites, como cookies de terceiros e técnicas de rastreamento ocultas. É importante que os sites entendam essa transição do ecossistema à medida que planejam o suporte. Esse é um aspecto geral da transição para muitas APIs do Sandbox de privacidade, que não vai ser discutido aqui.

Considerações sobre segurança

Esgotamento do token de confiança:um site malicioso pode deliberadamente esgotar o fornecimento de tokens de um usuário de um emissor específico. 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 o fornecimento adequado para garantir que os navegadores resgatem apenas um token por visualização de página de nível superior.

Prevenção de gasto duplo:o malware pode tentar acessar todos os tokens de confiança de um usuário. No entanto, os tokens vão acabar com o tempo, já que cada resgate é enviado ao mesmo emissor, 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

É 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 explicativo do token de confiança.

Saiba mais


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

Fotografia por ZSun Fu no Unsplash.