consentement cookies pour React

Le consentement cookies pour React,
une balise et un composant

Une app Vite ou CRA reçoit le runtime comme première balise dans index.html, puis @cookiecrumbs/react vous donne ConsentGate, CookieDeclaration et ManageCookiesLink pour l’arbre.

Ce qui change dans le head d’une page React une fois le runtime en premier : rien de non essentiel ne s’exécute tant que sa catégorie n’est pas accordée.

la règle

Ce que la loi demande à un site React

Une single-page app React charge ses statistiques dans main.tsx avant qu’aucune UI n’existe. Un composant bannière ajouté ensuite affiche un choix mais ne peut pas reprendre ce qui a déjà tourné.

La règle est la même partout dans l’UE et au Royaume-Uni : rien au-delà du strictement nécessaire ne peut être stocké sur l’appareil d’un visiteur ni lu depuis celui-ci avant son accord. C’est l’article 5(3) de la directive ePrivacy, et cet accord doit répondre à la définition du consentement du RGPD : libre, spécifique, éclairé et univoque, avec un refus aussi simple que l’acceptation. Le Royaume-Uni conserve la même règle dans PECR, avec d’étroites exemptions pour les statistiques à faible risque depuis le 5 février 2026. La Californie et les autres lois des États américains fonctionnent à l’inverse : pas d’opt-in, mais un lien d’opt-out et la prise en charge du signal Global Privacy Control.

Trois choses en découlent pour un site. Les scripts d’analyse, de publicité et de réseaux sociaux doivent attendre un choix. Ce choix doit être enregistré de façon à pouvoir être montré plus tard, car l’article 7(1) met la charge de la preuve sur vous. Et retirer son consentement doit être aussi simple que le donner, ce qui suppose un contrôle qui rouvre la bannière sur chaque page. Une bannière qui affiche deux boutons et charge quand même Google Analytics échoue au premier test, et c’est précisément ce manquement que les autorités sanctionnent, des décisions de la CNIL contre Google et SHEIN aux contrôles des autorités néerlandaise et belge.

comment ça marche

Comment fonctionne le consentement dans une app React

Une SPA React a un seul fichier HTML, et c’est là que le consentement doit commencer. Le runtime va dans index.html comme premier script du head, avant le bundle Vite ou Webpack. Il installe son intercepteur de façon synchrone, avant même de récupérer votre configuration, si bien que tout ce que le bundle tente d’injecter ensuite est attrapé.

Dans l’arbre, vous avez deux outils. ConsentGate ne rend ses enfants que lorsqu’une catégorie est accordée et affiche sinon votre fallback, ce qui est la bonne façon de monter un widget de chat, une vidéo embarquée ou un fournisseur d’analytics. L’API runtime sur window, enveloppée par @cookiecrumbs/react dans un hook, indique à tout composant l’état courant, le régime, la langue et l’identifiant de consentement, et lui donne open() pour rouvrir la bannière depuis un lien de pied de page.

Les patterns React qui piègent : un fournisseur d’analytics en haut de l’arbre qui tire au montage, un routeur qui envoie des pages vues à chaque navigation, et un useEffect qui injecte un pixel. Chacun passe soit dans un gate, soit vérifie isGranted("analytics") avant de faire quoi que ce soit. Le scan de votre site déployé montre lesquels tirent encore avant le consentement, avec le script responsable.

mise en place

Mise en place dans React

Cinq étapes. La CLI en fait l’essentiel, et chacune est aussi un clic dans le tableau de bord.

  1. Init depuis le dépôt

    Détecte un projet React simple, relie le site, écrit la config et affiche le snippet.

    npx cookiecrumbs login
    npx cookiecrumbs init
  2. Placez la balise en premier dans index.html

    Avant votre bundle, avant tout. Le runtime installe son intercepteur de façon synchrone.

    <!-- index.html -->
    <head>
      <script src="https://app.cookiecrumbs.eu/runtime/cc.js"
        data-cc-site="pk_live_…"
        data-cc-env="production"></script>
      …
    </head>
  3. Verrouillez les scripts et composants soumis au consentement

    Une balise type="text/plain" avec une catégorie reste inerte jusqu’à l’accord. Dans l’arbre, ConsentGate ne rend ses enfants que lorsque la catégorie est accordée.

    <script type="text/plain" data-cc-category="analytics"
            src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
    
    // in the app
    import { ConsentGate } from '@cookiecrumbs/react';
    <ConsentGate category="marketing">
      <MetaPixel />
    </ConsentGate>
  4. Offrez un moyen de revenir

    Un lien de pied de page qui rouvre la bannière est la voie de retrait qu’attend l’article 7(3).

    import { ManageCookiesLink } from '@cookiecrumbs/react';
    <ManageCookiesLink>Manage cookies</ManageCookiesLink>
  5. Scanner, classer, publier

    Le scan trouve ce que le bundle charge vraiment. Classez une fois par fournisseur, publiez, c’est fait.

    npx cookiecrumbs scan --wait
    npx cookiecrumbs push --env production

attention

Les erreurs que nous voyons dans les apps React

Chacune apparaît dans le premier scan comme un traceur déclenché avant le consentement.

  • Injecter le runtime depuis un useEffectLes effets s’exécutent après le premier rendu. À ce moment le bundle est chargé et le fournisseur d’analytics a tiré. La balise appartient à index.html.
  • Traiter les cookies « de session » comme nécessairesLa nécessité tient à la fonction, pas à la durée de vie. Un cookie de session d’un outil marketing reste du marketing.
  • Stocker le consentement uniquement dans l’état ReactUn rafraîchissement l’oublie et la bannière redemande. Laissez le runtime posséder le cookie et lisez-le.
  • Une seule bannière pour tous les paysLes États-Unis exigent l’opt-out et GPC, l’UE l’opt-in. Les règles régionales choisissent la bonne selon l’emplacement du visiteur.
  • Tester uniquement sur localhostLe scan et la vérification d’installation ont besoin de l’URL déployée. Utilisez la clé preview sur un déploiement de staging.

avant de publier

La checklist de conformité

Huit lignes. Le tableau de bord coche les deux dernières à partir de données réelles.

  • La balise est le premier script du headTout ce qui se trouve au-dessus peut déposer un cookie que le runtime ne peut pas reprendre.
  • Chaque script d’analyse, de publicité ou social attend sa catégorieSoit type="text/plain" avec une catégorie, soit l’hôte figure dans la carte de blocage issue du scan.
  • « Tout refuser » est sur le premier niveauMême taille, même poids que « Tout accepter ». Pas de « X » qui vaut consentement, pas de cases pré-cochées.
  • Les valeurs par défaut de Consent Mode sont sur « denied » avant le chargement de GoogleVérifiez les sept signaux dans Tag Assistant, consentement refusé.
  • Les liens vers les mentions légales et la politique de confidentialité sont renseignésLa publication est refusée tant qu’ils manquent ; le pied de la bannière y renvoie.
  • Un contrôle de retrait est accessible sur chaque pageLe contrôle permanent ou un lien « Gérer les cookies » dans votre pied de page.
  • Le premier scan complet a tourné et chaque fournisseur est classéLe verdict sur l’accueil indique, daté, ce qui s’est déclenché avant le consentement.
  • La vérification d’installation est passéeElle charge votre page comme un visiteur et confirme que la bannière s’est exécutée avant tout traceur.

ce que vous obtenez

Ce que comprend l’offre gratuite

Deux domaines, 100 sous-pages scannées par mois et par domaine, toutes les réglementations, la CLI, les SDK et le serveur MCP.

Un scanner qui lit la page rendue

Chaque page, dans chaque état de consentement, dans un vrai navigateur. Cookies, pixels, iframes et clés de stockage, avec la page et le script qui les ont posés. Rescanné selon un planning.

La déclaration cookies s’écrit d’elle-même à partir du résultat.

Une bannière qui bloque d’abord

Les balises restent inertes tant que leur catégorie n’est pas accordée. « Tout refuser » est aussi visible que « Tout accepter ». Sept mises en page, 25 langues, Consent Mode v2 et la bonne règle par région.

21 ko, un seul fichier, aucune requête tierce de son propre chef.

Une preuve que vous pouvez remettre

Chaque choix est stocké avec un horodatage, la version de la bannière et un hachage des textes affichés, chaîné à l’enregistrement précédent. Les exports sont signés. Hébergé à Francfort.

Article 7(1), dans l’offre gratuite.

vérification gratuite

Vérifiez ce que votre site charge en ce moment

Le HTML de la page d’accueil, confronté à la base de traceurs. Pas de compte, rien n’est stocké. Le scan complet du tableau de bord fait de même pour chaque page, dans un vrai navigateur.

questions

Des réponses claires

Ai-je besoin d’un paquet npm ?
Non. La balise script suffit pour le blocage et la bannière. @cookiecrumbs/react ajoute des composants et hooks typés pour les arbres React.
Comment lire l’état du consentement dans un composant ?
L’API runtime l’expose sur window et @cookiecrumbs/react l’enveloppe dans un hook, si bien qu’un composant peut afficher un placeholder jusqu’à ce que la catégorie soit accordée.
Et une app React qui utilise Google Tag Manager ?
Donnez à la balise GTM type="text/plain" avec une catégorie, ou laissez Consent Mode v2 s’en charger : le runtime met les sept signaux sur « denied » avant le chargement de GTM et les met à jour au consentement.
Cela fonctionne-t-il avec Remix, Gatsby ou Vite SSR ?
Tout ce qui rend un document HTML fonctionne avec la balise script comme premier élément du head. Les composants React fonctionnent dans n’importe quel arbre React.
Cela va-t-il casser mon score Lighthouse ?
Le runtime pèse 21 ko gzippé, asynchrone, sans requête tierce de son propre chef. Les mises en page barre et ruban réservent l’espace avant le rendu, donc aucun décalage.
Comment afficher la liste des cookies sur ma page de confidentialité ?
Montez CookieDeclaration où vous voulez. Il affiche la liste publique des cookies issue de votre dernier scan, dans la langue du visiteur.

étape suivante

Livrer la bannière au prochain déploiement

Ajoutez le site, lancez npx cookiecrumbs init dans votre dépôt React, et le journal de consentement commence à enregistrer dans l’UE.