consentement cookies pour Nuxt

Le consentement cookies pour Nuxt,
un module

@cookiecrumbs/nuxt place la balise en tête de app.head.script avec la priorité critical, avant le chunk d’entrée de Nuxt, et importe automatiquement un composable useConsent().

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

Une app Nuxt avec un plugin GA ou pixel l’exécute à l’entrée côté client. Rien ne demande avant, et rien ne peut le reprendre.

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 Nuxt

Nuxt gère le head du document pour vous, et c’est exactement là qu’un runtime de consentement doit se trouver. Le module place la balise dans app.head.script avec tagPriority: "critical", si bien qu’elle est rendue avant le chunk d’entrée de Nuxt sur chaque page, rendue côté serveur ou statique. Pas de modification de layout, pas d’appel de head par page.

Les plugins client sont la source habituelle de traceurs précoces dans Nuxt : un plugin gtag, un plugin Pixel, un module tiers qui injecte son propre script. Le composable useConsent() donne à chacun isGranted(category) et un moyen de s’abonner aux changements, si bien qu’un plugin peut attendre et s’initialiser au moment où le consentement arrive. Les modules Nuxt tiers qui injectent des scripts reçoivent une catégorie sur leur balise, ou leur hôte est neutralisé par la carte de blocage issue du scan.

Trois composants accompagnent le module : ConsentGate pour les sous-arbres, CookieDeclaration pour la page de confidentialité et ManageCookiesLink pour le pied de page. Les routes serveur et le middleware peuvent lire le cookie de consentement via les mêmes helpers, si bien qu’une page peut rendre un placeholder plutôt qu’un embed avant l’hydratation.

mise en place

Mise en place dans Nuxt

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 Nuxt, relie le site, écrit la config.

    npx cookiecrumbs login
    npx cookiecrumbs init
  2. Ajoutez le module

    La clé du site et l’environnement vont dans nuxt.config.ts.

    npm i @cookiecrumbs/nuxt
    
    // nuxt.config.ts
    export default defineNuxtConfig({
      modules: ['@cookiecrumbs/nuxt'],
      cookiecrumbs: { site: 'pk_live_…', env: 'production' },
    });
  3. Utilisez le composable

    useConsent() expose status, consent, regime, country, language, version et les actions accept, reject, open et withdraw.

    const { isGranted, open } = useConsent();
    
    <ConsentGate category="analytics">
      <AnalyticsWidget />
    </ConsentGate>
  4. Faites attendre les plugins

    Un plugin client n’initialise son traceur que lorsque la catégorie est accordée, et de nouveau si le consentement change ensuite.

    // plugins/pixel.client.ts
    export default defineNuxtPlugin(() => {
      const { isGranted, onChange } = useConsent();
      const start = () => { if (isGranted('marketing')) initPixel(); };
      start(); onChange(start);
    });
  5. Scanner, classer, publier

    Scannez, classez une fois par fournisseur, publiez.

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

attention

Les erreurs que nous voyons dans les apps Nuxt

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

  • Un plugin gtag avec mode: "client" et sans gateIl s’exécute sur le chunk d’entrée. Verrouillez-le avec le composable ou laissez Consent Mode porter les valeurs par défaut.
  • Utiliser useHead dans une page pour ajouter le runtimeLe head au niveau page s’exécute après le head de l’app. C’est la priorité critical du module qui garde la balise en premier.
  • Des routes Nitro qui posent des cookies de suiviLes cookies côté serveur pour l’attribution restent des cookies. Gardez-les strictement nécessaires ou posez-les après le consentement.
  • Ignorer l’environnement de prévisualisationLa clé preview sur un déploiement de staging vous permet de tester une nouvelle version de bannière sans toucher les visiteurs.
  • Pas de nouvelle demande après l’ajout d’une catégorieAjoutez une nouvelle finalité et le runtime redemande. Ne le supprimez pas ; c’est ce qui maintient la validité du consentement.

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

Le module garde-t-il la balise avant mes plugins ?
Oui. Elle est injectée avec tagPriority critical, avant le chunk d’entrée de Nuxt, si bien que les valeurs par défaut du consentement existent avant qu’un plugin ne s’exécute.
Quels composants sont fournis avec le module ?
ConsentGate, CookieDeclaration et ManageCookiesLink, plus le composable useConsent() avec status, consent, regime, country, language, version, consentId et les actions accept, reject, set, open, close, withdraw et setLang.
Fonctionne-t-il avec Nuxt Content ou un build statique ?
Oui. La génération statique écrit la balise dans chaque fichier HTML ; le SSR la rend à chaque requête.
Puis-je lire le consentement dans une route serveur ?
Oui. Les helpers de cookie fonctionnent dans Nitro, si bien qu’une route API peut sauter un appel de suivi pour un visiteur qui a dit non.
Et Google Tag Manager ?
Gardez le module GTM. Le runtime fixe d’abord les valeurs par défaut de Consent Mode v2 et le modèle GTM ajoute les déclencheurs.
Existe-t-il une version Vue 3 sans Nuxt ?
Utilisez la balise script et l’API runtime. Le module est une fine enveloppe autour du même runtime.

étape suivante

Livrer la bannière au prochain déploiement

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