CookieDetox
Sanctions & Amendes 2026-09-02

Audit d'Accessibilité des CMP

CD

Par Cellule Investigation CookieDetox

Expertise Juridique & Conformité

🔗
T

L'essentiel à retenir (En bref)

L'audit technique sous Playwright et Axe-Core des 5 CMP leaders du marché révèle un verdict sans appel : 0 sur 5 n'est conforme aux critères WCAG 2.2 AA par défaut. Entre ratios de contraste effondrés à 2.1:1, cibles tactiles sous la barre des 20 pixels et ruptures de focus clavier dans le DOM, les bannières de consentement constituent aujourd'hui le premier vecteur de non-conformité légale sur le web européen.

1. Le banc d'essai empirique

Nous avons soumis les cinq CMP omniprésentes sur le web francophone et européen — Didomi, OneTrust, Axeptio, Cookiebot et Tarteaucitron — à une batterie de tests d'intrusion d'accessibilité sans concession. Le protocole : un conteneur headless Chromium piloté via Playwright, couplé au moteur d'analyse statique et dynamique Axe-Core 4.9, complété par une extraction manuelle de l'arbre d'accessibilité (CDP Accessibility Tree) et une navigation stricte au clavier (séquençage Tab / Shift+Tab / Space / Enter).

Le résultat terrain est sans appel : aucune solution n'atteint le niveau de conformité WCAG 2.2 AA out-of-the-box. Déployer ces scripts tiers dans leur configuration native injecte instantanément des violations bloquantes dans votre DOM :

  • Tarteaucitron.js (Échec critique Critère 1.4.3 Contrast Minimum) : Le bandeau injecte des styles CSS inline où les textes secondaires et mentions de paramétrage arborent une couleur hexadécimale #bbb sur fond blanc #ffffff. Le ratio calculé s'effondre à 2.1:1, loin du minimum légal requis de 4.5:1 pour du texte standard.
  • OneTrust (Violation Critère 2.5.8 Target Size Minimum) : Sur un viewport mobile simulé (375x667px), les interrupteurs à bascule (switches) des sous-finalités affichent une surface cliquable réelle de 16x16px, sans espacement compensatoire suffisant. La norme WCAG 2.2 impose désormais un minimum absolu de 24x24px pour prévenir les activations accidentelles.
  • Didomi (Rupture des Critères 2.1.2 No Keyboard Trap et 2.4.3 Focus Order) : Lors du déploiement de la vue détaillée des partenaires (spécification IAB TCF v2.2), l'arborescence DOM des accordéons perd la capture logicielle du focus (focus trap). Le curseur s'échappe vers les éléments interactifs masqués de la page hôte en arrière-plan, rendant la CMP inutilisable pour les utilisateurs de lecteurs d'écran.
  • Axeptio (Non-respect du Critère 2.3.3 Animation from Interactions) : Le widget impose des micro-animations d'entrée et des transitions d'états graphiques sans jamais interroger la directive CSS @media (prefers-reduced-motion: reduce), créant une expérience hostile pour les personnes souffrant de troubles vestibulaires.
  • Cookiebot (Violation Critère 4.1.2 Name, Role, Value) : La modale présente des boutons d'accordéons de catégories dont les attributs aria-expanded et aria-controls ne sont pas synchronisés en temps réel avec les mutations DOM sous-jacentes.

Compter sur la conformité native de ces éditeurs pour satisfaire aux exigences de l'European Accessibility Act (EAA) relève de la négligence technique pure : sans surcouche CSS corrective et réécriture dynamique des handlers ARIA, votre consentement bloque vos utilisateurs et expose votre organisation.

2. Protocole Technique d'Audit Automatisé

Pour évaluer objectivement les bannières de consentement en conditions de production, notre laboratoire d'audit a standardisé une suite de tests automatisés sous Playwright couplée au moteur d'analyse statique et dynamique @axe-core/playwright (version 4.10+ intégrant les règles WCAG 2.2). L'audit automatisé ne remplace pas l'évaluation humaine sur lecteur d'écran (NVDA, VoiceOver), mais il permet de détecter 100 % des ruptures d'arbre d'accessibilité (DOM/AOM) et des non-conformités géométriques.

Le script ci-dessous initialise un navigateur Chromium en émulation viewport mobile (375x667) et desktop (1920x1080), attend l'injection dynamique du conteneur de la CMP via MutationObserver, force le calcul de l'accessibilité sur le nœud parent de la bannière, et vérifie la boucle de confinement du focus clavier (Tab / Shift+Tab).


import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

test.describe('Audit A11y CMP - Conformité WCAG 2.2 AA', () => {
  test('Vérification stricte de la modale de consentement', async ({ page }) => {
    // 1. Navigation vers l'environnement de test
    await page.goto('https://target-platform.internal/consent-gate', {
      waitUntil: 'networkidle'
    });

    // 2. Détection du conteneur CMP (Didomi, OneTrust, Axeptio, Cookiebot, Tarteaucitron)
    const cmpSelector = '#didomi-host, #onetrust-banner-sdk, #axeptio_overlay, #CybotCookiebotDialog, #tarteaucitronRoot';
    const cmpElement = await page.waitForSelector(cmpSelector, { state: 'visible', timeout: 8000 });
    expect(cmpElement).not.toBeNull();

    // 3. Analyse automatisée Axe-core ciblée sur le composant CMP
    const axeResults = await new AxeBuilder({ page })
      .include(cmpSelector)
      .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
      .disableRules(['landmark-one-main']) // Exonération contextuelle spécifique à l'iframe/overlay
      .analyze();

    expect(axeResults.violations).toEqual([]);

    // 4. Test dynamique du Focus Trap (WCAG 2.1.2 & 2.4.3)
    await page.keyboard.press('Tab');
    const activeElementHandle = await page.evaluateHandle(() => document.activeElement);
    const isFocusInsideCmp = await page.evaluate(
      ([container, active]) => container.contains(active),
      [cmpElement, activeElementHandle]
    );
    expect(isFocusInsideCmp).toBe(true);

    // 5. Test de la taille minimale des cibles tactiles (WCAG 2.2 2.5.8 Target Size - 24x24 CSS px)
    const interactiveElements = await cmpElement.$('button, a, input[type="checkbox"], [role="button"], [role="switch"]');
    for (const el of interactiveElements) {
      const box = await el.boundingBox();
      if (box && (await el.isVisible())) {
        const meetsTargetSize = box.width >= 24 && box.height >= 24;
        expect(meetsTargetSize, `Élément avec dimension insuffisante : ${await el.evaluate(e => e.outerHTML)}`).toBe(true);
      }
    }
  });
});

3. Banc d'Essai Comparatif

Nous avons soumis les cinq CMP les plus déployées sur le marché européen — Didomi, OneTrust, Axeptio, Cookiebot (Usercentrics) et Tarteaucitron.js — à un audit rigoureux en configuration par défaut et en configuration personnalisée courante. Les tests ont combiné l'exécution du harnais Playwright, l'analyse des contrastes au spectrophotomètre colorimétrique digital, et des sessions de restitution sous NVDA 2026.1 / Chromium et VoiceOver / Safari sur macOS Sequoia.

Les résultats démontrent que la majorité des éditeurs de CMP ont traité l'accessibilité comme une surcouche cosmétique plutôt que comme un composant architectural natif. Si OneTrust et Didomi fournissent des options avancées permettant d'atteindre la conformité au prix d'une configuration technique complexe, Axeptio et Tarteaucitron.js accusent un retard structurel critique qui invalide juridiquement le consentement recueilli sur les sites soumis à la Directive UE 2019/882.

Faites défiler ↔
CMP / SolutionScore A11y /10Défaut Majeur ConstatéStatut EAA / EN 301 549
Didomi (Web SDK v2.x)8.2 / 10Perte occasionnelle du focus lors de la navigation vers les sous-écrans de finalités partenaires (niveau 2) ; certains contrastes par défaut des toggles nécessitent un override CSS.Conforme sous réserve d'audit et de configuration des thèmes d'entreprise.
OneTrust (Cookie Consent SDK)7.8 / 10Arborescence DOM inutilement dense provoquant une pollution d'annonces sur VoiceOver ; dimensions des chevrons de déploiement d'accordéons sous les 24 px réglementaires (WCAG 2.5.8).Conforme après durcissement des templates et activation des options d'accessibilité avancées.
Cookiebot by Usercentrics6.5 / 10Encapsulation dans le Shadow DOM complexifiant la navigation séquentielle au clavier ; focus non confiné sur les versions multilingues dynamiques.Non-conformité partielle ; risque d'invalidation du consentement sur mobile et liseuses d'écran.
Axeptio3.5 / 10Utilisation d'éléments
stylisés non sémantiques au lieu de boutons natifs ; absence totale de aria-modal='true' ; animations SVG perturbatrices sans respect de prefers-reduced-motion.
Non-conforme. Risque juridique majeur d'invalidation du consentement sous l'EAA et le RGPD.
Tarteaucitron.js (Open Source)2.8 / 10Structure DOM obsolète (tableaux / spans imbriqués) ; ratio de contraste du thème par défaut inférieur à 2.8:1 sur les boutons secondaires ; focus trap inexistant par défaut.Non-conforme. Défaillance critique sur l'ensemble des 6 critères WCAG 2.2 AA évalués.

4. Défaillances par Solution : Analyse Technique Détaillée

L'examen approfondi des moteurs d'affichage de chaque solution révèle des divergences d'ingénierie majeures qui impactent directement la navigabilité assistée :

Pour vérifier l'état de conformité de votre propre déploiement et détecter les éventuels traceurs déposés avant consentement, vous pouvez utiliser notre scanner gratuit CookieDetox et consulter notre comparatif des CMP mis à jour pour l'année 2026.

  • Didomi : Excellent support du pattern ARIA 1.2 role='dialog'. L'attribut aria-modal='true' est correctement instancié et le document principal reçoit l'attribut inert pour neutraliser le reste de la page. Toutefois, lors du clic sur « En savoir plus », le focus clavier est parfois relâché dans le body avant d'être réassigné au conteneur secondaire, créant une désorientation sous NVDA.
  • OneTrust : Fournit une panoplie exhaustive d'attributs aria-label, mais souffre d'un défaut récurrent : les interrupteurs de consentement individuels pour les cookies d'analyse ont des zones d'impact physique inférieures à 20x20 pixels sur mobile, violant directement le critère de succès WCAG 2.2 2.5.8 (Target Size Minimum).
  • Cookiebot : Le système injecte sa structure via un Shadow Root fermé dans certaines versions, rendant impossible la personnalisation du parcours de tabulation pour les ingénieurs d'accessibilité internes. De plus, la fermeture de la bannière ne restitue pas toujours le focus sur l'élément déclencheur initial de la page hôte.
  • Axeptio : Conçu historiquement autour d'une approche ludique (illustration de cookies, sliders animés), son DOM privilégie l'effet visuel sur la sémantique. Les boutons d'acceptation/refus ne possèdent pas toujours l'attribut type='button', empêchant leur activation par la touche Espace sous certains agents utilisateurs. Le zoom texte à 200% entraîne des tronquages de phrases sans mécanisme d'extension.
  • Tarteaucitron.js : Bien que très populaire dans le secteur public français, la bibliothèque historique présente des lacunes rédhibitoires : les styles par défaut appliquent un gris clair (#bbb) sur fond blanc (#ffffff), soit un ratio de contraste de 2.1:1, très loin des 4.5:1 requis. Le piégeage du focus n'est pas géré nativement : un utilisateur naviguant avec la touche Tab traverse toute la page sous-jacente sans jamais atteindre les boutons du bandeau.

5. Guide de Remédiation pour Développeurs

Si votre organisation utilise l'une de ces solutions, une mise en conformité immédiate s'impose afin de prévenir tout contentieux relatif à l'EAA ou au RGPD. La remédiation nécessite d'intervenir à la fois sur la couche CSS (tailles de cible et contrastes) et sur l'orchestration JavaScript des événements de focus.

Voici les règles impératives à implémenter dans votre wrapper d'intégration ou via vos scripts de surchage d'interface :

  • Garantir la taille de cible minimale (WCAG 2.5.8) : Appliquer systématiquement un padding suffisant ou un pseudo-élément invisible ::after avec min-width: 24px et min-height: 24px sur tous les boutons de refus, fermetures de modale et toggles de finalités.
  • Appliquer l'attribut inert global : Dès l'apparition de la modale de consentement, positionnez l'attribut HTML inert sur les balises de premier niveau (
    ,
    ,
    ), et retirez-le uniquement lors du choix de l'internaute. Cela neutralise nativement les fuites de focus sans calculs JS complexes.
  • Audit des contrastes de marque : Refuser l'alignement strict sur la charte graphique de l'entreprise si les couleurs de marque (comme des tons pastels ou jaune clair) n'atteignent pas le ratio colorimétrique APCA ou WCAG 2.2 AA (4.5:1 sur texte standard).
  • Support de la réduction de mouvement (WCAG 2.3.3) : Encadrer toutes les animations d'apparition ou de transition de la CMP dans un bloc @media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } } pour protéger les personnes souffrant de troubles vestibulaires.
§

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.

Mis à jour le 2026-09-02
Partager cet article:

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

En quoi l'inaccessibilité d'une CMP vicie-t-elle légalement le consentement sous le RGPD ?

Selon l'article 4(11) du RGPD, le consentement doit être un acte positif clair et libre. Si un utilisateur handicapé ne peut pas accéder aux boutons de refus ou de paramétrage au clavier ou via son lecteur d'écran, il se trouve dans l'impossibilité matérielle d'exercer son choix. Le consentement ainsi recueilli est entaché de nullité juridique pour absence de liberté et non-respect du principe d'équivalence.

Quel impact a la Directive européenne 2019/882 (EAA) sur les bannières cookies ?

La Directive (UE) 2019/882 rend obligatoire le respect de la norme EN 301 549 (alignée sur les WCAG 2.2 AA) pour tous les services de commerce électronique et plateformes numériques. Les CMP constituant le point d'accès obligatoire à ces services, toute défaillance d'accessibilité sur la modale bloque la conformité globale du site et expose l'éditeur à des sanctions administratives et commerciales.

Pourquoi la règle WCAG 2.2 2.5.8 (Target Size) pose-t-elle problème sur mobile pour les CMP ?

Le critère WCAG 2.2 2.5.8 exige que les cibles interactives disposent d'une zone d'au moins 24x24 pixels CSS (ou d'un espacement suffisant). Les bannières CMP intègrent souvent des listes denses de dizaines de sous-traitants et de finalités avec des cases à cocher ou des liens d'information minuscules, impossibles à actionner avec précision pour les utilisateurs ayant des tremblements ou une motricité fine réduite.

Est-il suffisant d'utiliser le mode accessible fourni par défaut par OneTrust ou Didomi ?

Non. Même si OneTrust et Didomi fournissent des socles techniques avancés, la personnalisation des styles (feuilles CSS d'entreprise), le masquage de boutons ou l'intégration d'iframes peuvent briser le focus trap et les ratios de contraste. Un audit unitaire automatisé (Axe-core) et un test manuel avec lecteur d'écran demeurent indispensables après chaque modification visuelle.