consentement cookies pour Next.js

Le consentement cookies pour Next.js,
en une commande

Lancez npx cookiecrumbs init dans votre dépôt Next.js. Il relie le site, écrit cookiecrumbs.config.ts et insère la balise avec strategy="beforeInteractive", pour que les valeurs par défaut du consentement arrivent avant l’hydratation et avant tout gestionnaire de balises.

Ce qui change dans le head d’une page Next.js 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 Next.js

Une app Next.js n’a pas de couche de consentement. next/script charge GA4 ou le pixel Meta dès que la page s’hydrate, et chaque visiteur de l’UE est suivi avant d’avoir dit quoi que ce soit.

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 Next.js

Next.js n’offre qu’un seul bon emplacement pour un runtime de consentement : une balise next/script avec strategy="beforeInteractive". Les scripts avec cette stratégie sont injectés dans le HTML initial et s’exécutent avant toute hydratation, le seul moment assez tôt. afterInteractive (par défaut) s’exécute après l’hydratation, quand un gestionnaire de balises ajouté avec la même stratégie a peut-être déjà tiré. lazyOnload est encore pire.

Dans l’App Router, la balise va dans app/layout.tsx, qui enveloppe chaque route. Dans le Pages Router, elle va dans pages/_document.tsx. La CLI détecte lequel vous utilisez et affiche le bon snippet ; @cookiecrumbs/next enveloppe la balise dans un composant et ajoute des helpers serveur, si bien qu’un Server Component ou un route handler peut lire le cookie de consentement et décider quoi rendre avant que le client ne s’exécute.

À partir de là, le verrouillage est une question de catégorie. Une balise tierce devient type="text/plain" avec data-cc-category ; un sous-arbre React qui charge un traceur passe dans ConsentGate. Le runtime libère les deux quand la catégorie est accordée, dans l’ordre du document, si bien qu’un conteneur GTM qui attend les statistiques s’exécute exactement comme il l’aurait fait, juste plus tard. Tout ce que le scan a trouvé sur votre domaine de production est compilé dans une carte de blocage à la publication, donc les scripts non balisés dont l’hôte est connu sont aussi neutralisés sur place.

mise en place

Mise en place dans Next.js

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 Next.js, relie ou crée le site dans votre espace de travail, écrit la config et les fichiers de textes, et affiche le snippet pour votre routeur.

    npx cookiecrumbs login
    npx cookiecrumbs init
  2. Placez la balise en premier

    App Router : dans app/layout.tsx. Pages Router : dans pages/_document.tsx. beforeInteractive la garde avant l’hydratation et avant tout gestionnaire de balises.

    // app/layout.tsx
    import Script from 'next/script';
    
    <Script src="https://app.cookiecrumbs.eu/runtime/cc.js"
      strategy="beforeInteractive"
      data-cc-site="pk_live_…" data-cc-env="production" />
  3. Verrouillez ce qui exige le consentement

    Donnez aux balises soumises au consentement type="text/plain" et une catégorie, ou enveloppez les composants dans ConsentGate de @cookiecrumbs/next. Le runtime les libère quand la catégorie est accordée.

    import { ConsentGate } from '@cookiecrumbs/next';
    
    <ConsentGate category="analytics" fallback={null}>
      <Analytics />
    </ConsentGate>
  4. Scanner, classer, publier

    Le premier scan trouve ce que l’app charge vraiment. Classez chaque fournisseur une fois, renseignez vos liens légaux, publiez, et le journal de consentement commence à enregistrer.

    npx cookiecrumbs scan --wait
    npx cookiecrumbs push --env production
  5. Verrouillez le déploiement

    En CI, faites échouer le build quand un nouveau traceur apparaît non classé. La sortie SARIF atterrit dans l’analyse de code.

    npx cookiecrumbs scan --wait --fail-on-unknown --fail-on-preconsent --sarif results.sarif

attention

Les erreurs que nous voyons dans les apps Next.js

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

  • Charger le runtime avec afterInteractiveÀ ce moment la page est hydratée et un gestionnaire de balises avec la même stratégie a peut-être déjà tourné. Seul beforeInteractive est assez tôt.
  • Un composant bannière qui ne fait que se cacherPoser un cookie et masquer la boîte ne change rien aux scripts déjà exécutés. Le blocage doit se faire au niveau de la balise script, pas dans l’UI.
  • Vercel Analytics et Speed Insights en « nécessaires »Ce sont des statistiques. Classez-les en statistiques et verrouillez-les ; l’offre gratuite compte aussi.
  • Un middleware qui pose des cookies marketingUn test A/B ou un cookie de référent posé dans le middleware s’exécute avant tout consentement. Gardez-les strictement nécessaires ou placez-les derrière le consentement.
  • Oublier le déploiement de prévisualisationLes URL de prévisualisation reçoivent la clé preview et leur propre environnement, les tests ne touchent donc jamais les vrais visiteurs.

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

Fonctionne-t-il avec l’App Router et le Pages Router ?
Oui. La balise va dans app/layout.tsx avec next/script et strategy="beforeInteractive" pour l’App Router, ou dans pages/_document.tsx pour le Pages Router. La CLI affiche le bon snippet pour votre projet.
La bannière ralentit-elle mes Core Web Vitals ?
Le runtime pèse 21 ko gzippé, un seul fichier, chargé en asynchrone, et les mises en page barre et ruban réservent leur espace avant le rendu, donc aucun décalage. Sur Vercel il est servi depuis notre propre domaine avec de longues durées de cache.
Puis-je garder la config dans git ?
Oui. cookiecrumbs.config.ts contient le design, les textes, les catégories, les langues et les règles régionales. cookiecrumbs push la déploie et cookiecrumbs pull ramène les modifications du tableau de bord dans le dépôt, donc un changement de bannière est une pull request.
Un Server Component peut-il lire le consentement ?
Oui. @cookiecrumbs/next expose le cookie de consentement aux helpers serveur, vous pouvez donc rendre un placeholder plutôt qu’un embed avant même que le client ne s’exécute.
Et Google Tag Manager dans Next.js ?
Gardez-le. Le runtime fixe les valeurs par défaut de Consent Mode v2 avant le chargement de GTM et les met à jour au consentement ; le modèle GTM ajoute les déclencheurs. Ou donnez une catégorie à la balise GTM et laissez-la attendre entièrement.
L’offre gratuite couvre-t-elle un projet perso en Next.js ?
Deux domaines, 100 sous-pages scannées par mois et par domaine, toutes les réglementations, le SDK, la CLI et le serveur MCP. Les preuves de consentement sont conservées 12 mois en Free et 60 mois sur toutes les offres payantes.

étape suivante

Livrer la bannière au prochain déploiement

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