Premiers pas avec les Trust Tokens

Les Trust Tokens sont une nouvelle API permettant à un site Web de transmettre une quantité limitée d'informations d'un contexte de navigation à un autre (par exemple, d'un site à un autre) afin de lutter contre la fraude, sans suivi passif.



Résumé

Les jetons de confiance permettent à une origine d'émettre des jetons cryptographiques à 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 Network (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" (Réseau des outils pour les développeurs Chrome).
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 ce qu'il prétend être, et non un bot qui se fait passer pour un humain, ou un tiers malveillant escroquant une personne ou un service réel. 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 pour évaluer et propager la fiabilité (pour déterminer si une interaction avec un site a été réalisée par un humain, par exemple) exploitent des techniques qui peuvent également être utilisées pour le fingerprinting.

L'API doit préserver la confidentialité, permettant de propager la confiance sur les sites sans suivi individuel des utilisateurs.

Que contient la proposition de jetons de confiance ?

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

Dans l'explication de la proposition:

Cette API propose une nouvelle zone 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 servir à suivre les utilisateurs. En revanche, ils sont signés de manière cryptographique et ne peuvent donc pas être falsifiés.

Lorsqu'une origine se trouve dans un contexte de confiance de 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 se différencient pas les uns des autres, ce qui empêche les sites Web de suivre les utilisateurs par leur intermédiaire.

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 texte suivant est adapté de l'exemple de code présenté dans la vidéo explicative de l'API.

Imaginez qu'un utilisateur visite un site Web d'actualités (publisher.example) qui intègre la publicité d'un réseau publicitaire tiers (foo.example). Il 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.Il accède à issuer.example et effectue des actions qui laissent à penser au site qu'il s'agit d'un véritable humain (activité du compte, test CAPTCHA, etc.).

2.issuer.example vérifie que l'utilisateur est un humain et exécute le code JavaScript suivant pour envoyer un jeton de confiance au 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.Un peu plus tard, l'utilisateur accède à 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 provenant de cette origine:

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

6.Si cela renvoie une promesse qui se résout en true, cela signifie que l'utilisateur dispose de jetons de issuer.example, afin que publisher.example puisse 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 l'offre.
  2. Si l'utilisation aboutit, l'émetteur issuer.example renvoie un enregistrement d'utilisation indiquant qu'à un moment donné, il a envoyé un jeton valide à 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 sous la forme d'un 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 a considéré que cet utilisateur était un être humain.
  3. foo.example répond en conséquence.
Comment un site Web peut-il déterminer s'il vous fait confiance ?

Vous pouvez avoir un historique d'achats sur un site d'e-commerce, des check-ins sur une plate-forme de localisation ou l'historique d'un compte dans une banque. Les émetteurs peuvent également prendre en compte d'autres facteurs, tels que la durée depuis laquelle vous avez un compte ou d'autres interactions (comme les CAPTCHA ou l'envoi de formulaires) qui augmentent la confiance qu'ils ont dans la probabilité que vous êtes un véritable humain.

Émission de jetons de confiance

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

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

Cette action appelle une extension du protocole d'émission 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 indiqué.

Le point de terminaison répond avec 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 (comme 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 une fiche d'utilisation:

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

L'éditeur peut inclure des enregistrements d'offres dans les requêtes nécessitant un jeton de confiance (par exemple, publier un commentaire, cliquer sur "J'aime" ou voter 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 sous la forme d'un en-tête de requête Sec-Redemption-Record.

Considérations relatives à la confidentialité

Les jetons sont conçus pour ne pas être liés. Un émetteur peut obtenir des informations globales sur les sites consultés par ses utilisateurs, mais ne peut pas associer l'émission à l'utilisation. Lorsqu'un utilisateur utilise un jeton, il ne peut pas le distinguer des autres jetons qu'il a créés. Toutefois, les jetons de confiance n'existent actuellement pas en vase clos: en théorie, il existe d'autres manières pour un émetteur de joindre l'identité d'un utilisateur sur 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 pour de nombreuses API de la Privacy Sandbox. Nous n'en parlerons pas plus loin ici.

Points à noter concernant la sécurité

Épuisement des jetons de confiance:un site malveillant peut délibérément épuiser les jetons d'un utilisateur auprès d'un émetteur spécifique. 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 puissent s'assurer que les navigateurs n'utilisent qu'un jeton par vue de page de premier niveau.

Prévention du double des dépenses:un logiciel malveillant peut tenter d'accéder à tous les jetons de confiance d'un utilisateur. Toutefois, les jetons seront épuisés 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 limiter les risques, les émetteurs peuvent également signer moins de jetons.

Mécanismes de demande

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

Pour rappel, votre avis est important pour cette proposition. Si vous avez des commentaires, veuillez créer un problème dans le dépôt explicatif des jetons de confiance.

En savoir plus


Merci à tous ceux qui nous ont aidés à rédiger et à commenter ce message.

Photo de ZSun Fu sur Unsplash.