Premiers pas avec les Trust Tokens

Les jetons de confiance sont une nouvelle API qui permet à un site Web de transmettre une quantité limitée d'informations d'un contexte de navigation à un autre (par exemple, entre sites) afin de lutter contre la fraude, sans suivi passif.



Résumé

Les jetons de confiance permettent à une origine d'émettre des jetons cryptographiques pour un utilisateur de confiance. Les jetons sont stockés par le navigateur de l'utilisateur. Le navigateur peut ensuite utiliser les jetons dans d'autres contextes pour évaluer l'authenticité de l'utilisateur.

L'API Trust Token permet de transmettre la confiance d'un utilisateur dans un contexte à un autre contexte sans identifier l'utilisateur ni associer les deux identités.

Vous pouvez essayer l'API avec notre démonstration et inspecter les jetons dans les onglets Réseau et Application des outils pour les développeurs Chrome.

Capture d'écran montrant les jetons de confiance dans l'onglet Chrome DevTools Network.
Jetons de confiance dans l'onglet Réseau des outils pour les développeurs Chrome.
Capture d'écran montrant les jetons de confiance dans l'onglet "Application" des outils pour les développeurs Chrome.
Jetons de confiance dans l'onglet Application des outils pour les développeurs Chrome.

Pourquoi avons-nous besoin de jetons de confiance ?

Le Web a besoin de moyens pour établir des signaux de confiance qui montrent qu'un utilisateur est bien celui qu'il prétend être, et non un robot qui se fait passer pour un humain ou un tiers malveillant escroquant une personne ou un service réels. La protection contre la fraude est particulièrement importante pour les annonceurs, les fournisseurs d'annonces et les CDN.

Malheureusement, de nombreux mécanismes existants permettant d'évaluer et de propager la fiabilité (par exemple, pour déterminer si une interaction avec un site provient d'une personne réelle) tirent parti de techniques qui peuvent également être utilisées pour le fingerprinting.

L'API doit préserver la confidentialité, ce qui permet la propagation de la confiance sur les sites sans suivi individuel des utilisateurs.

Que contient la proposition de jetons de confiance ?

Le Web s'appuie sur l'élaboration de signaux de confiance pour détecter les fraudes et le spam. Pour ce faire, vous pouvez suivre la navigation à l'aide d'identifiants globaux et intersites par utilisateur. Ce n'est pas acceptable pour une API protégeant la confidentialité.

Dans l'explication de la proposition:

Cette API propose un nouvel espace de stockage par origine pour les jetons cryptographiques de style "Privacy Pass", qui sont accessibles dans des contextes tiers. Ces jetons ne sont pas personnalisés et ne peuvent pas être utilisés pour suivre les utilisateurs, mais sont signés de manière cryptographique afin qu'ils ne puissent pas être falsifiés.

Lorsqu'une origine se trouve dans un contexte de confiance en l'utilisateur, elle peut émettre au navigateur un lot de jetons qui peuvent être "dépensés" ultérieurement dans un contexte où l'utilisateur serait autrement inconnu ou moins fiable. Il est important de noter que les jetons ne sont pas différenciables les uns des autres, ce qui empêche les sites Web de suivre les utilisateurs par leur biais.

Nous proposons également un mécanisme d'extension permettant au navigateur de signer les requêtes sortantes avec des clés liées à l'utilisation d'un jeton particulier.

Exemple d'utilisation de l'API

Le code suivant est adapté de l'exemple de code fourni dans la description de l'API.

Imaginez qu'un utilisateur consulte un site Web d'actualités (publisher.example) qui intègre des publicités provenant d'un réseau publicitaire tiers (foo.example). L'utilisateur a déjà utilisé un site de réseau social qui émet des jetons de confiance (issuer.example).

La séquence ci-dessous montre le fonctionnement des jetons de confiance.

1.L'utilisateur visite issuer.example et effectue des actions qui font croire au site qu'il s'agit d'une vraie personne, comme l'activité du compte ou la réussite d'un test CAPTCHA.

2.issuer.example vérifie que l'utilisateur est un être humain et exécute le code JavaScript suivant pour émettre un jeton de confiance pour le navigateur de l'utilisateur:

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

3.Le navigateur de l'utilisateur stocke le jeton de confiance et l'associe à issuer.example.

4.Quelque temps plus tard, l'utilisateur accède au site publisher.example.

5.publisher.example veut savoir si l'utilisateur est un vrai humain. publisher.example fait confiance à issuer.example. Il vérifie donc si le navigateur de l'utilisateur dispose de jetons valides de cette origine:

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

6.Si cela renvoie une promesse qui renvoie vers true, cela signifie que l'utilisateur dispose de jetons provenant de issuer.example. publisher.example peut donc tenter d'utiliser un jeton:

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

par celui-ci :

  1. L'utilisateur publisher.example demande une utilisation.
  2. Si l'utilisation aboutit, l'émetteur issuer.example renvoie un enregistrement d'utilisation indiquant qu'un jeton valide a été émis à un moment donné pour ce navigateur.

    7.Une fois la promesse renvoyée par fetch() résolue, l'enregistrement d'utilisation peut être utilisé dans les demandes de ressources ultérieures:

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

par celui-ci :

  1. Les enregistrements d'utilisation sont inclus dans l'en-tête de requête Sec-Redemption-Record.
  2. foo.example reçoit l'enregistrement d'utilisation et peut l'analyser pour déterminer si issuer.example pensait que cet utilisateur était un humain.
  3. foo.example répond en conséquence.
Comment un site Web peut-il déterminer s'il peut vous faire confiance ?

Il peut s'agir d'un historique d'achats sur un site d'e-commerce, d'enregistrements effectués sur une plate-forme de localisation ou d'un historique de compte dans une banque. Les émetteurs peuvent également examiner d'autres facteurs, tels que la durée pendant laquelle vous disposez d'un compte ou d'autres interactions (telles que les CAPTCHA ou l'envoi d'un formulaire) qui augmentent la confiance de l'émetteur quant à la probabilité qu'il s'agisse d'un être humain.

Émission de jetons de confiance

Si l'émetteur est considéré comme digne de confiance par un émetteur de jetons de confiance tel que issuer.example, il peut récupérer les jetons de confiance de l'utilisateur en envoyant une requête fetch() avec un paramètre trustToken:

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

Cela appelle une extension du protocole d'émission de Privacy Pass à l'aide d'une nouvelle primitive cryptographique:

  1. Générez un ensemble de nombres pseudo-aléatoires appelés nonces.

  2. Aveuglez les nonces (encodez-les pour que l'émetteur ne puisse pas afficher leur contenu) et associez-les à la requête dans un en-tête Sec-Trust-Token.

  3. Envoyez une requête POST au point de terminaison fourni.

Le point de terminaison répond par des jetons aveugles (signatures sur les nonces aveugles), puis les jetons sont révélés et stockés en interne avec les nonces associés par le navigateur en tant que jetons de confiance.

Utilisation d'un jeton de confiance

Un site d'éditeur (tel que publisher.example dans l'exemple ci-dessus) peut vérifier si des jetons de confiance sont disponibles pour l'utilisateur:

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

Si des jetons sont disponibles, le site de l'éditeur peut les utiliser pour obtenir un enregistrement d'utilisation:

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

L'éditeur peut inclure des enregistrements d'utilisation dans les requêtes nécessitant un jeton de confiance (par exemple, publication d'un commentaire, clic sur "J'aime" ou vote dans un sondage) à l'aide d'un appel fetch() comme suit:

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

Les enregistrements d'utilisation sont inclus dans un en-tête de requête Sec-Redemption-Record.

Considérations liées à la confidentialité

Les jetons sont conçus pour être "dissociables". Un émetteur peut obtenir des informations globales sur les sites consultés par ses utilisateurs, mais il ne peut pas associer l'émission à l'utilisation. Lorsqu'un utilisateur utilise un jeton, il ne peut pas distinguer le jeton des autres jetons qu'il a créés. Toutefois, les jetons de confiance n'existent actuellement pas en vase clos. Un émetteur peut actuellement, en théorie, joindre l'identité d'un utilisateur à plusieurs sites, comme les cookies tiers et les techniques de suivi dissimulé. Il est important que les sites comprennent cette transition vers l'écosystème lorsqu'ils planifient leur assistance. Il s'agit d'un aspect général de la transition de nombreuses API de la Privacy Sandbox. Il n'est donc pas abordé plus en détail ici.

Points à noter concernant la sécurité

Épuisement des jetons de confiance:un site malveillant peut délibérément épuiser l'approvisionnement d'un utilisateur en jetons provenant d'un émetteur particulier. Il existe plusieurs mesures d'atténuation contre ce type d'attaque, telles que la possibilité pour les émetteurs de fournir plusieurs jetons à la fois, afin que les utilisateurs disposent d'un approvisionnement suffisant pour garantir que les navigateurs n'utilisent qu'un seul jeton par page vue de niveau supérieur.

Protection contre les doubles dépenses:des logiciels malveillants peuvent tenter d'accéder à tous les jetons de confiance d'un utilisateur. Toutefois, les jetons s'épuiseront au fil du temps, car chaque utilisation est envoyée au même émetteur de jetons, qui peut vérifier que chaque jeton n'est utilisé qu'une seule fois. Pour réduire les risques, les émetteurs peuvent également signer moins de jetons.

Mécanismes de requête

Il peut être possible d'autoriser l'envoi d'enregistrements d'utilisation en dehors de fetch(), par exemple pour les requêtes de navigation. Les sites peuvent également inclure des données de l'émetteur dans les en-têtes de réponse HTTP pour activer l'utilisation des jetons en parallèle du chargement de la page.

Nous vous rappelons que cette proposition nécessite votre avis. Si vous avez des commentaires, veuillez signaler un problème dans le dépôt d'explications des jetons de confiance.

En savoir plus


Merci à tous ceux qui nous ont aidés à rédiger et à relire ce post.

Photo de ZSun Fu sur Unsplash.