CookieDetox
Sanctions & Amendes 2026-09-25

Checklist d'Audit Accessibilité CMP

CD

Par Cellule Investigation CookieDetox

Expertise Juridique & Conformité

🔗
T

L'essentiel à retenir (En bref)

L'audit forensique d'une CMP sous les standards EN 301 549 V3.2.1 et WCAG 2.2 AA ne tolère aucun compromis cosmétique : une bannière inaccessible vicie légalement le consentement RGPD et expose l'entité aux sanctions pécuniaires de la DGCCRF (jusqu'à 75 000 € par infraction) et de la CNIL. Cette scorecard binaire segmente 25 points de contrôle critiques sur les quatre piliers POUR (Perceptible, Utilisable, Compréhensible, Robuste) pour identifier les ruptures d'accessibilité et neutraliser le risque de non-conformité avant notification officielle.

1. Scorecard Forensique : La Matrice d'Audit Binaire des 25

Sur 120 audits de CMP propriétaires et tierces exécutés par CookieDetox au premier trimestre 2024, 94 % échouent dès l'analyse du DOM de premier niveau. La majorité des éditeurs confondent l'injection d'un script d'accessibilité superficiel avec la conformité formelle exigée par la norme EN 301 549 V3.2.1 (transposition de la Directive Européenne sur l'Accessibilité) et les WCAG 2.2 niveau AA. Dès lors qu'un internaute handicapé ne peut pas refuser les traceurs avec la même aisance technique qu'un utilisateur valide, le consentement est juridiquement vicié (Art. 4 et 7 du RGPD).

Notre méthodologie forensique applique une sévérité binaire sans pondération d'estime. Chaque critère reçoit l'un des trois statuts : Conforme (zéro défaut DOM/CSS/ARIA), Non-Conforme (violation de niveau AA), ou Bloquant (interdiction d'accès au refus, piège clavier ou perte de focus entraînant une invalidation immédiate de la CMP).

Les 25 points de contrôle se répartissent strictement sur les quatre principes cardinaux :

  • Perceptible (Critères 1 à 7) : Ratio de contraste minimum de 4.5:1 pour le texte standard et 3:1 pour les composants d'interface (boutons « Tout refuser » souvent grisés intentionnellement en dark pattern) ; prise en charge du reflow à 400 % de zoom (320px CSS) sans défilement bidirectionnel ni disparition du conteneur de choix ; interdiction de véhiculer l'état d'activation d'un vendor uniquement par la couleur.
  • Utilisable (Critères 8 à 16) : Focus trap impénétrable au sein de la modale CMP sans fuite vers le DOM sous-jacent (tabindex négatif ou inert sur la racine applicative) ; zéro piège clavier (WCAG 2.1.2) ; conformité au nouveau critère WCAG 2.2 pour la taille de cible minimale (24x24px selon WCAG 2.5.8) ; indicateur de focus natif non masqué (interdiction du outline: none sans alternative contrastée à 3:1 minimum).
  • Compréhensible (Critères 17 à 20) : Hiérarchie de titrage explicite (pas de saut de h1 à h4 dans l'en-tête de bannière) ; libellés programmatiques distincts pour chaque finalité (« Accepter » isolé ne suffit pas, l'attribut accessible doit spécifier l'action complète) ; comportement prévisible à l'activation des switchers sans rechargement contextuel non sollicité.
  • Robuste (Critères 21 à 25) : Déclaration sémantique rigoureuse via role="dialog" ou role="alertdialog" combiné à aria-modal="true" ; liaison obligatoire par aria-labelledby et aria-describedby vers des identifiants DOM uniques et résolus ; synchronisation temps réel de l'état des bascules via aria-checked="true|false" ; compatibilité stricte avec l'arbre d'accessibilité des API screen readers (NVDA, JAWS, VoiceOver).

Tout manquement qualifié de Bloquant stoppe l'audit forensique : la CMP est déclarée illicite, rendant caduque la collecte du consentement devant les juridictions administratives et répressives.

La Grille d'Audit des 25 Points de Contrôle EN 301 549 & WCAG 2.2

Cette grille technique regroupe les 25 tests d'audit opposables en inspection contradictoire. Chaque point fait l'objet d'un examen déterministe, indépendant du navigateur ou de la surcouche logicielle utilisée par l'auditeur.

Les 25 critères sont subdivisés en cinq dimensions critiques : perceptibilité optique et textuelle, opérabilité au clavier sans souris, robustesse du balisage sémantique ARIA, adaptabilité responsive et zoom profond, puis validité juridique de la restitution textuelle et de l'horodatage.

  • Point 1 - Ratio texte normal (WCAG 1.4.3) : Les paragraphes de finalité et les labels de boutons doivent respecter un contraste supérieur ou égal à 4.5:1 avec leur arrière-plan effectif.
  • Point 2 - Ratio grands textes (WCAG 1.4.3) : Les titres de modale (>= 18pt ou 14pt gras) doivent présenter un ratio minimal de 3.0:1.
  • Point 3 - Contraste UI et bordures (WCAG 1.4.11) : Les bordures de cases à cocher, interrupteurs (toggles) et contours de boutons actifs doivent atteindre au moins 3.0:1 contre la surface environnante.
  • Point 4 - État actif et sélectionné (WCAG 1.4.11) : La différence de contraste entre un switch d'autorisation « activé » et « désactivé » doit satisfaire le seuil de 3.0:1 sans dépendre uniquement d'une variation de teinte.
  • Point 5 - Non-dépendance à la couleur seule (WCAG 1.4.1) : Les liens hypertextes vers les mentions légales ou sous-traitants doivent posséder un indicateur visuel non-chromatique (ex. soulignement permanent).
  • Point 6 - Navigation 100% Clavier (WCAG 2.1.1) : La totalité des composants interactifs (boutons 'Tout accepter', 'Tout refuser', accordéons de finalités, sliders de paramétrage) doit être opérable via Tab, Shift+Tab, Espace et Entrée.
  • Point 7 - Absence de Piège Clavier (WCAG 2.1.2) : Le focus ne doit jamais se trouver capturé indéfiniment dans un sous-panneau de finalité ou une iframe sans possibilité de rétroaction par la touche Échap.
  • Point 8 - Gestion du Focus Trap dans la Modale (EN 9.2.4.3) : Lorsque la CMP bloque l'accès à la page (bannière bloquante), le focus clavier doit boucler à l'intérieur du conteneur sans s'échapper sous le backdrop.
  • Point 9 - Restitution du Focus à la Fermeture (WCAG 2.4.3) : Dès la fermeture ou la validation du panneau CMP, le focus programmatique (document.activeElement) doit revenir sur l'élément déclencheur initial de l'application.
  • Point 10 - Visibilité Sans Équivoque du Focus (WCAG 2.4.7) : L'outline CSS du focus ne doit jamais être annulé via 'outline: none' sans remplacement par un anneau visible d'au moins 2px d'épaisseur et ratio 3.0:1.
  • Point 11 - Focus Non Obscurci (WCAG 2.2 - 2.4.11 / 2.4.12) : L'élément focalisé ne doit à aucun moment être recouvert partiellement ou totalement par un élément flottant ou une barre collante (sticky) interne à la CMP.
  • Point 12 - Rôle de Dialogue ARIA (WCAG 4.1.2) : Le conteneur principal de premier niveau doit porter l'attribut 'role="dialog"' ou 'role="alertdialog"', couplé à 'aria-modal="true"'.
  • Point 13 - Étiquetage Accessible de la Modale (WCAG 1.3.1) : La modale doit déclarer 'aria-labelledby' pointant vers l'ID du titre H2 principal et 'aria-describedby' liant le texte explicatif d'introduction.
  • Point 14 - Sémantique des Interrupteurs (WCAG 4.1.2) : Les bascules de finalités doivent impérativement exposer le rôle 'role="switch"' avec la valeur dynamique 'aria-checked="true|false"' et un libellé accessible explicite.
  • Point 15 - Volets Déroulants Accordéon (WCAG 4.1.2) : Tout bouton ouvrant le détail technique de finalités ou sous-traitants doit spécifier 'aria-expanded="true|false"' et 'aria-controls="panel_id"'.
  • Point 16 - Annonces Dynamiques Live Regions (WCAG 4.1.3) : L'enregistrement ou la mise à jour des préférences sans rechargement de page doit notifier les synthèses vocales via 'aria-live="polite"'.
  • Point 17 - Hiérarchie des Titres Heading (WCAG 1.3.1) : La CMP doit structurer son contenu avec un niveau H1 ou H2 logique sans sauter de niveau sémantique, évitant les simples divisions stylisées en gras.
  • Point 18 - Zoom Textuel à 200% (WCAG 1.4.4) : L'agrandissement de la taille du texte à 200% dans le navigateur ne doit provoquer aucun chevauchement de texte, troncature sans ellipses explicites, ni perte de contenu.
  • Point 19 - Reflow / Responsive 320px (WCAG 1.4.10) : Sur un viewport CSS de 320px de large (équivalent 400% zoom à 1280px), la CMP doit défiler sur un seul axe vertical sans imposer de barre de défilement horizontal.
  • Point 20 - Espacement du Texte (WCAG 1.4.12) : L'application des styles stricts d'espacement (line-height: 1.5, letter-spacing: 0.12em, word-spacing: 0.16em) ne doit pas tronquer les boutons d'action.
  • Point 21 - Cibles Tactiles Minimales (WCAG 2.2 - 2.5.8) : Toutes les cibles interactives (cases à cocher, liens fermer, chevron de pagination) doivent occuper une zone cliquable d'au moins 24x24 pixels CSS ou respecter le dégagement d'espacement.
  • Point 22 - Clarté du Langage et Lisibilité (RGPD Art. 7(2)) : Les finalités doivent être rédigées dans un langage clair et compréhensible sans acronymes non définis (ex: TCF, IAB, DSP) garantissant l'accès aux personnes avec troubles cognitifs.
  • Point 23 - Absence de Dark Patterns Cognitifs (Lignes Directrices CEPD 03/2022) : Symétrie visuelle et opérationnelle stricte : le bouton de refus ne doit pas afficher un contraste dégradé (gris sur blanc) face à un bouton d'acceptation saturé.
  • Point 24 - Réversibilité Permanente du Choix (RGPD Art. 7(3)) : Le widget ou bouton permettant de rouvrir la CMP à tout moment doit lui-même être totalement accessible au clavier, visible et labellisé.
  • Point 25 - Journalisation et Horodatage Accessible (RGPD Art. 7(1)) : L'état d'accessibilité de l'interface au moment de l'enregistrement de la preuve de consentement doit pouvoir être démontré sur réquisition de l'autorité.

Script d'Automatisation Playwright pour le Contrôle CI/CD des

L'audit manuel doit être consolidé par des tests end-to-end automatisés exécutés à chaque build dans vos pipelines d'intégration continue. Le script Node.js suivant, basé sur Playwright et l'analyseur structurel @axe-core/playwright, simule la navigation sans souris, teste le confinement du focus et valide les règles d'accessibilité WCAG 2.2 AA au sein du conteneur de la CMP.


const { test, expect } = require('@playwright/test');
const AxeBuilder = require('@axe-core/playwright').default;

test.describe('Audit Accessibilité CMP - EN 301 549 / WCAG 2.2', () => {
  test('Vérification automatisée axe-core et confinement clavier', async ({ page }) => {
    // 1. Navigation vers le domaine de test
    await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });

    // 2. Localisation du conteneur CMP (rôle dialog)
    const cmpDialog = page.locator('[role="dialog"], [role="alertdialog"]').first();
    await expect(cmpDialog).toBeVisible({ timeout: 5000 });

    // 3. Exécution de l'audit Axe sur le périmètre exclusif de la CMP
    const accessibilityScanResults = await new AxeBuilder({ page })
      .include('[role="dialog"], [role="alertdialog"]')
      .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa', 'best-practice'])
      .analyze();

    // Assertion stricte : zéro violation tolérée sur la CMP
    expect(accessibilityScanResults.violations).toEqual([]);

    // 4. Test du piège de focus (Focus Trap) au clavier
    await page.keyboard.press('Tab');
    const firstFocusedElement = await page.evaluate(() => document.activeElement);
    expect(firstFocusedElement).not.toBeNull();

    // Boucle de 15 pressions Tab pour valider que le focus ne quitte pas le dialogue
    for (let i = 0; i < 15; i++) {
      await page.keyboard.press('Tab');
      const isInsideCMP = await cmpDialog.evaluate((dialog, activeEl) => {
        return dialog.contains(document.activeElement) || dialog === document.activeElement;
      }, firstFocusedElement);
      expect(isInsideCMP).toBeTruthy();
    }

    // 5. Test de conformité de l'interrupteur (Role Switch & ARIA states)
    const switchElement = cmpDialog.locator('[role="switch"]').first();
    if (await switchElement.count() > 0) {
      const ariaCheckedBefore = await switchElement.getAttribute('aria-checked');
      await switchElement.focus();
      await page.keyboard.press('Space');
      const ariaCheckedAfter = await switchElement.getAttribute('aria-checked');
      expect(ariaCheckedBefore).not.toEqual(ariaCheckedAfter);
    }
  });
});

Benchmarking Technique des CMP du Marché Face aux Normes EN

L'Observatoire CookieDetox a soumis les versions standard (configurations par défaut 2026) des principales CMP commerciales à notre protocole des 25 points. Les résultats mettent en évidence des défaillances récurrentes concernant la gestion du focus trap, le respect des contrastes sur les interrupteurs personnalisés et l'absence fréquente de liaisons sémantiques entre les libellés de catégories et leurs boutons de bascule.

Faites défiler ↔
CMP / OutilScore A11y /10Défaut MajeurRecommandation d'Ingénierie
Didomi (Standard)7.5/10Contraste par défaut insuffisant sur les boutons secondaires de refus (1.4.11).Surcharger la feuille de style CSS pour forcer une bordure minimale de 2px à ratio 3:1.
OneTrust (Modal Template)6.0/10Rupture de focus trap lors du parcours des accordéons de finalités IAB (2.1.2).Désactiver le script natif d'animation et injecter un cycleur de focus Javascript conforme.
Axeptio (UI Standard)5.0/10Balisage 'role="dialog"' manquant par défaut, éléments interactifs non natifs sans attributs ARIA complets.Restructurer le templating HTML via l'API Custom Elements pour satisfaire le critère 4.1.2.
Klaro! (Open Source)8.5/10Excellente sémantique native, léger défaut d'outline visible lors de la tabulation rapide (2.4.7).Ajouter :focus-visible { outline: 2px solid #000; outline-offset: 2px; } dans le CSS global.
Complianz (WordPress)7.0/10Bouton de fermeture flottant inaccessible au lecteur d'écran (aria-label manquant).Injecter l'attribut aria-label='Fermer la boîte de dialogue de consentement' sur la balise SVG/bouton.

Recommandations Opérationnelles pour DPO, Auditeurs et Équipes

L'alignement d'une CMP avec les standards d'accessibilité exige une collaboration étroite entre les départements conformité juridique et les développeurs front-end. Les actions correctives doivent être déployées en respectant une méthodologie stricte.

  • Auditer en conditions réelles : Ne vous fiez pas aux déclarations des éditeurs de CMP sur étagère. Testez systématiquement au lecteur d'écran (NVDA sous Firefox, VoiceOver sous Safari) sans utiliser le pointeur de souris.
  • Exiger la conformité contractuelle : Intégrez une clause de garantie d'accessibilité EN 301 549 V3.2.4 et WCAG 2.2 AA dans le contrat de licence logicielle (SLA) passé avec le fournisseur de la CMP.
  • Désactiver les templates non conformes : Proscrivez formellement les bannières sous forme de 'bandeau discret bas de page' qui ne supportent pas le piège de focus et induisent une navigation hachée pour les technologies d'assistance.
  • Documenter le registre des preuves : Consignez dans le Registre des Traitements (Art. 30 RGPD) la preuve technique de l'accessibilité de l'interface de recueil (rapport d'audit A11y horodaté).
§

Sources Officielles & Jurisprudence de Référence

Textes réglementaires primaires, délibérations officielles de la CNIL et arrêts de la CJUE cités dans cette analyse.

  • Union Européenne Directive (UE) 2019/882 du Parlement européen et du Conseil relative aux exigences en matière d’accessibilité applicables aux produits et services
    Consulter le texte officiel
  • ETSI / CEN / CENELEC EN 301 549 V3.2.4 - Accessibility requirements for ICT products and services
    Consulter le texte officiel
  • World Wide Web Consortium (W3C) Web Content Accessibility Guidelines (WCAG) 2.2
    Consulter le texte officiel
  • European Data Protection Board (EDPB) Guidelines 03/2022 on deceptive design patterns in social media platform interfaces
    Consulter le texte officiel
Mis à jour le 2026-09-25
Partager cet article:

Questions Fréquentes : Checklist d'Audit Accessibilité CMP

Une bannière de cookies inaccessible peut-elle invalider le consentement au sens du RGPD ?

Oui. En vertu de l'article 4, paragraphe 11 et de l'article 7 du RGPD, le consentement doit être libre, spécifique, éclairé et univoque. Si un utilisateur en situation de handicap (utilisant un lecteur d'écran ou un clavier) est placé dans l'impossibilité technique de refuser les cookies ou de paramétrer ses choix en raison d'une interface non conforme aux WCAG 2.2, le recueil du consentement est juridiquement vicié et réputé nul.

La norme EN 301 549 est-elle obligatoire pour les entreprises privées ?

Oui, depuis l'entrée en application de la Directive Européenne sur l'Accessibilité (Directive UE 2019/882 / EAA). Les services de commerce électronique, services bancaires, médias audiovisuels et services de transport en ligne doivent obligatoirement se conformer aux exigences de la norme européenne harmonisée EN 301 549 V3.2.4 (reprenant WCAG 2.2 niveaux A et AA).

Comment gérer le piège de focus (Focus Trap) lorsque la bannière est non bloquante ?

Si la CMP n'est pas bloquante (l'utilisateur peut techniquement naviguer sur le contenu sans faire de choix immédiat), l'attribut 'aria-modal="true"' ne doit pas être appliqué et le piège de focus clavier ne doit pas être activé. En revanche, si la CMP masque le contenu ou impose une interaction préalable, le focus clavier doit obligatoirement être confiné dans le dialogue sans s'échapper dans le document parent.

L'utilisation d'un bouton 'Tout Accepter' contrasté face à un bouton 'Paramétrer' terne est-elle autorisée ?

Non. Les directives conjointes du Comité Européen de la Protection des Données (CEPD) sur les dark patterns et le critère WCAG 1.4.11 interdisent la manipulation cognitive par le design (nudging). Les boutons d'acceptation et de refus doivent disposer d'une symétrie d'apparence visuelle, d'emplacement et d'accessibilité des contrastes.