Anaïs Sparesotto
Réglementation · GratuitIntermédiaire≈ 25h · 9 chapitres · TP intégrés

Conformité réglementaire numérique pour développeur·euses

RGPD, AI Act, NIS2, accessibilité, éco-conception : les 5 cadres réglementaires que tout·e dev doit comprendre pour travailler sur des produits numériques conformes en France et en Europe.

À la fin du cours, tu sais

  • Identifier les cadres réglementaires applicables à un projet numérique donné (RGPD, EAA, NIS2, CRA, AI Act, RGESN)
  • Distinguer les rôles : responsable de traitement, sous-traitant, fournisseur IA, déployeur, entité essentielle NIS2
  • Cartographier les données personnelles d'un schéma de base de données et choisir la base légale RGPD appropriée
  • Implémenter les mesures techniques de minimisation : purge auto, pseudonymisation, durées de conservation
  • Auditer un composant front-end pour identifier les non-conformités RGAA niveau A et AA
  • Implémenter les corrections d'accessibilité courantes (ARIA, focus, contrastes, sémantique HTML)
  • Identifier les vulnérabilités OWASP dans un endpoint API et appliquer les contre-mesures
  • Construire un arbre de décision pour les notifications d'incident (RGPD 72h, NIS2 24h, CRA 24h)
  • Appliquer les principes RGESN à la conception d'un service numérique (sobriété, médias, requêtes)
  • Classer un système d'IA dans les 4 niveaux de risque AI Act avec justification par article
  • Implémenter les obligations art. 50 AI Act (mention IA, watermarking, journalisation)
  • Produire un audit multi-cadre et un plan de mise en conformité priorisé pour un produit fictif

Prérequis

  • Avoir développé au moins une application web
  • Connaître les bases HTTP et les APIs

Chapitre 1

Panorama : les 5 cadres réglementaires du numérique

En 2026, un·e dev qui travaille sur un produit numérique en Europe est potentiellement concerné·e par 5 textes différents en même temps. Pas besoin d'être juriste : il faut savoir lesquels s'appliquent à ton projet et ce qu'ils impliquent concrètement dans ton IDE.

État réglementaire au 17 mai 2026

Ce cours est calé sur l'état en vigueur en mai 2026. AI Act haut risque : application au 2 août 2026. EAA/accessibilité : applicable depuis le 28 juin 2025. NIS2 : transposition française en cours (loi Résilience attendue 1er semestre 2026). CRA : obligations de signalement au 11 septembre 2026. Vérifie ces dates avant toute mise en conformité réelle.

Les 5 cadres à connaître

  • RGPD (règlement UE 2016/679) : Protection des données personnelles. En application depuis 2018. Le plus connu et le plus quotidien pour un·e dev.
  • RGAA / EAA : Accessibilité numérique. Le RGAA (référentiel français, version 4.1.2) opérationnalise la directive européenne EAA. Applicable aux sites publics et au secteur privé depuis juin 2025.
  • NIS2 / CRA (directives UE 2022/2555 et règlement 2024/2847) : Cybersécurité. NIS2 cible les organisations des secteurs essentiels ; CRA cible les fabricants de produits numériques.
  • RGESN 2024 (Référentiel Général d'Éco-conception des Services Numériques) : 78 critères pour réduire l'empreinte environnementale du numérique.
  • AI Act (règlement UE 2024/1689) : Intelligence artificielle. Premier cadre juridique mondial sur l'IA, avec une approche par les niveaux de risque.

Règlement vs directive : une distinction clé

Un règlement européen (RGPD, AI Act, CRA) s'applique directement dans tous les États membres sans transposition. Une directive (NIS2, EAA) fixe des objectifs que chaque État transpose dans sa législation nationale : en France, avec un délai et parfois des spécificités locales.

À quoi ça sert pour un·e dev ?

  • Ne pas ignorer une obligation qui s'applique à ton projet (et créer une dette de conformité).
  • Savoir à qui parler quand un cas dépasse tes compétences : DPO pour le RGPD, RSSI pour NIS2, expert·e accessibilité pour le RGAA, DPO+RSSI pour l'AI Act.
  • Traduire une exigence réglementaire en spécification technique dans ton backlog, plutôt que de la laisser au service juridique.
  • Éviter le surclassement (mettre "haut risque AI Act" ou "données sensibles RGPD" sur tout) qui génère du coût sans valeur.

La promesse de ce cours

À l'issue, tu ne seras pas juriste. Tu sauras tenir une conversation sérieuse avec un·e DPO ou RSSI, et prendre les bonnes décisions d'implémentation sur les cas courants.

Chapitre 2

Rôles et responsabilités : qui doit faire quoi

Chaque cadre réglementaire définit des rôles distincts avec des obligations différentes. Confondre les rôles, c'est soit se charger d'obligations qui ne t'appartiennent pas, soit en manquer qui te reviennent.

RGPD : responsable de traitement vs sous-traitant

  • Responsable de traitement : l'entité qui détermine les finalités et les moyens du traitement de données personnelles. C'est l'entreprise qui "décide pourquoi et comment" les données sont traitées. Obligations : registre des traitements, politique de confidentialité, réponse aux droits des personnes, AIPD si nécessaire.
  • Sous-traitant : l'entité qui traite des données pour le compte du responsable. Typiquement un prestataire SaaS (Stripe, Resend, SendGrid, Heroku...). Obligation principale : contrat de sous-traitance conforme art. 28 RGPD.
  • Cas fréquent dev : ton entreprise est responsable de traitement pour ses propres données clients. Elle est sous-traitante si elle héberge les données d'un client B2B. Elle peut être les deux en même temps.

AI Act : fournisseur vs déployeur

  • Fournisseur (provider) : celui qui développe ou fait développer un système d'IA et le met sur le marché ou le met en service sous son nom. Obligations lourdes si haut risque (art. 16 AI Act).
  • Déployeur (deployer) : celui qui utilise un système d'IA sous sa propre autorité dans un cadre professionnel. Obligations plus légères (art. 26 AI Act). Utiliser l'API GPT-4o dans ton produit = déployeur.
  • Cumul possible : si tu développes un modèle en interne et tu l'utilises dans tes propres produits, tu es fournisseur ET déployeur en même temps.

NIS2 : entité essentielle vs entité importante

NIS2 ne s'applique qu'à certains secteurs (énergie, transports, banques, infrastructure numérique, santé...) et selon des seuils de taille. Les entités essentielles (grands acteurs des secteurs critiques) ont des obligations plus strictes que les entités importantes. Si tu travailles dans une start-up SaaS de 20 personnes dans le secteur RH, tu n'es probablement pas concerné·e par NIS2, mais si tu travailles pour un fournisseur cloud ou une banque, tu l'es.

Piège EAA : les PME ne sont pas exemptées

Contrairement à ce que beaucoup pensent, l'EAA (accessibilité) s'applique aussi aux PME du secteur privé dès lors qu'elles vendent des produits ou services numériques aux consommateurs. Une boutique e-commerce de 12 personnes à 3 M€ de CA est concernée depuis le 28 juin 2025.

Chapitre 3

RGPD pour développeur·euses : ce qui change dans ton code

Le RGPD n'est pas juste une affaire de cookies et de pop-ups. Il impose des choix d'implémentation concrets dans ton backend, ta base de données, tes logs et ton API.

Ce qu'est une donnée personnelle (et ce qui surprend)

  • Donnée personnelle (art. 4 RGPD) : toute information qui permet d'identifier directement ou indirectement une personne physique. Pas besoin de nom : une adresse IP, un cookie ID, une empreinte navigateur suffisent.
  • Une adresse IP est une donnée personnelle : CJUE, arrêt Breyer, 2016. Tes logs applicatifs qui enregistrent les IP sont donc des traitements RGPD.
  • Données sensibles (art. 9) : santé, origine ethnique, opinions politiques, données biométriques, données génétiques. Base légale plus restrictive, AIPD souvent obligatoire.
  • Pseudonymisation ≠ anonymisation : remplacer un email par un hash SHA-256 = pseudonymisation (RGPD s'applique toujours). Supprimer tout lien avec la personne = anonymisation (RGPD ne s'applique plus).

Les 6 bases légales : choisir la bonne

Tout traitement de données personnelles doit reposer sur une base légale (art. 6 RGPD). Choisir la mauvaise base, c'est le traitement entier qui est illicite.

  • Exécution du contrat (art. 6.1.b) : traitement nécessaire pour fournir le service que l'utilisateur a commandé. Base naturelle pour les données de commande, de compte, de livraison.
  • Obligation légale (art. 6.1.c) : factures (10 ans), données pour la LCB-FT dans les banques. Pas de choix : la loi impose le traitement.
  • Intérêt légitime (art. 6.1.f) : sécurité du site, prévention de la fraude, logs techniques. Nécessite un test de balance (ton intérêt ne doit pas l'emporter sur les droits de la personne).
  • Consentement (art. 6.1.a) : la base la plus connue mais pas la plus utilisée. Cookies non essentiels, newsletters, profiling marketing. Le consentement doit être libre, spécifique, éclairé, univoque et révocable.
  • Mission de service public (art. 6.1.e) et sauvegarde des intérêts vitaux (art. 6.1.d) : rares dans un contexte dev classique.

Piège : le consentement par défaut

Beaucoup de devs choisissent "consentement" pour tout car c'est le plus connu. C'est souvent une erreur : si l'utilisateur doit consentir pour recevoir sa commande, ce consentement n'est pas libre (il ne peut pas refuser sans perdre le service). Utilise l'exécution du contrat à la place.

Minimisation et durées de conservation

  • Principe de minimisation (art. 5.1.c) : ne collecter que les données strictement nécessaires à la finalité. Si tu n'as pas besoin de la date de naissance, ne la demande pas.
  • Durées de conservation : les données ne peuvent pas être gardées indéfiniment. Exemples courants : données clients actifs (durée du contrat + 3 ans pour les actions commerciales), factures (10 ans comptable), logs techniques (6-12 mois recommandés CNIL), candidatures non retenues (2 ans max).
  • Implémentation technique : prévoir dès la conception des jobs de purge automatique, des soft-deletes avec date d'expiration, et une traçabilité des suppressions.
  • Droits des personnes : droit d'accès, rectification, effacement ("droit à l'oubli"), portabilité, opposition. Prévoir des endpoints ou des processus internes pour y répondre dans les 30 jours.

TP 2.1 — Cartographier un schéma DB et choisir les bases légales

Modalité A · Durée estimée : 45 min · Objectifs O3

Tu vas analyser un schéma de base de données d'un SaaS RH fictif, identifier toutes les données personnelles et associer une base légale RGPD à chaque catégorie de traitement.

Contexte. TalentFlow est un SaaS RH qui gère le recrutement, la paie et la formation d'entreprises clientes. Voici les tables de la base :

Schéma TalentFlow — SaaS RH fictif
-- TalentFlow — schéma simplifié
CREATE TABLE employees (
  id UUID PRIMARY KEY,
  full_name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL,
  birth_date DATE,
  national_id TEXT,          -- numéro de sécu
  bank_iban TEXT,
  salary DECIMAL(10,2),
  disability_status BOOLEAN, -- RQTH
  manager_id UUID REFERENCES employees(id),
  hired_at DATE,
  created_at TIMESTAMP DEFAULT now()
);

CREATE TABLE candidates (
  id UUID PRIMARY KEY,
  full_name TEXT NOT NULL,
  email TEXT NOT NULL,
  cv_url TEXT,
  linkedin_url TEXT,
  applied_at TIMESTAMP,
  status TEXT  -- 'pending','rejected','hired'
);

CREATE TABLE training_sessions (
  id UUID PRIMARY KEY,
  employee_id UUID REFERENCES employees(id),
  course_title TEXT,
  score INTEGER,       -- note obtenue
  completed_at DATE
);

CREATE TABLE payslips (
  id UUID PRIMARY KEY,
  employee_id UUID REFERENCES employees(id),
  gross_salary DECIMAL(10,2),
  net_salary DECIMAL(10,2),
  month DATE,
  pdf_url TEXT
);

Livrable attendu

Un tableau avec 4 colonnes : Champ / table · Type de donnée personnelle · Catégorie spéciale ? · Base légale RGPD (art. 6 + justification). Puis : pour chaque table, la durée de conservation recommandée.

Corrigé progressif TP 2.1

Palier 1 — Décodage

Deux sous-tâches : (1) identifier quels champs contiennent des données personnelles au sens RGPD (tout ce qui permet d'identifier une personne physique directement ou indirectement) ; (2) pour chaque catégorie, trouver le fondement juridique parmi les 6 bases légales de l'art. 6. La question clé : pourquoi ce champ existe-t-il et qui a consenti à quoi ?

Palier 2 — Indices stratégiques

Pour identifier les données personnelles : tout ce qui se rattache à une personne identifiée ou identifiable est personnel. L'IBAN et le numéro de sécu sont également personnels. Pour les catégories spéciales : disability_status est une donnée de santé (art. 9) : base légale spéciale obligatoire (obligation légale RH). Pour les bases légales : les salariés = obligation légale (code du travail) ou contrat ; les candidats = intérêt légitime ou consentement selon le contexte ; les notes de formation = obligation légale si formation obligatoire, sinon intérêt légitime.

Palier 3 — Squelette de réponse

employees : full_name + email + birth_date + national_id + bank_iban + salary + disability_status — tous personnels. national_id + disability_status = données sensibles nécessitant une base art. 9. Base légale principale : obligation légale (contrat de travail, code du travail).

candidates : full_name + email + cv_url + linkedin_url — personnels. Pas de données sensibles. Base légale : À compléter — intérêt légitime ou consentement ? Durée de conservation : 2 ans max CNIL.

training_sessions : employee_id (indirect) + score — personnels. Base légale : À compléter.

payslips : tous les champs — personnels et sensibles (données financières). Base légale : obligation légale. Durée : À compléter.

Palier 4 — Solution commentée

employees — Base légale : obligation légale (art. 6.1.c RGPD + code du travail). disability_status : exception art. 9.2.b (obligation légale droit du travail). Conservation : durée du contrat + 5 ans (prescription prud'homale).

candidates — Base légale : intérêt légitime de l'employeur (art. 6.1.f) si processus de recrutement actif ; consentement explicite si candidature spontanée conservée. Conservation : 2 ans max après dernier contact (recommandation CNIL). Attention : linkedin_url peut poser un problème si le scraping n'est pas consenti.

training_sessions — Base légale : exécution du contrat (art. 6.1.b) si formation contractuelle ; obligation légale (art. 6.1.c) si formation CPPF obligatoire. Conservation : 5 ans (DIF/CPF justificatifs).

payslips — Base légale : obligation légale comptable (art. 6.1.c). Conservation : 10 ans (délai comptable), puis suppression ou anonymisation.

Piège classique : bank_iban dans employees — c'est une donnée personnelle financière (pas une catégorie spéciale art. 9), mais sa compromission est critique. Chiffrement obligatoire au repos (art. 32 RGPD).

Palier 5 — Pour aller plus loin

Construis le registre des traitements (ROPA) minimal pour TalentFlow : une ligne par finalité de traitement (recrutement, paie, formation), avec responsable, base légale, durée et mesures de sécurité. C'est l'obligation art. 30 RGPD pour toute organisation de +250 salariés.

TP 2.2 — Implémenter les mesures de minimisation SQL

Modalité A · Durée estimée : 50 min · Objectifs O4

Tu vas écrire les requêtes SQL qui implémentent concrètement les mesures de minimisation identifiées en TP 2.1 : purge automatique, pseudonymisation et soft-delete avec expiration.

Livrable attendu

3 requêtes SQL : (1) purge des candidats non retenus de plus de 2 ans ; (2) pseudonymisation des données employés après fin de contrat ; (3) fonction de soft-delete avec date d'expiration pour les fiches de paie.

Palier 1 — Décodage

Trois sous-tâches indépendantes : (1) supprimer définitivement des lignes selon une condition de date ; (2) remplacer des données identifiantes par un hash irréversible ; (3) marquer des lignes comme supprimées logiquement avec une date d'expiration réelle.

Palier 2 — Indices stratégiques

Purge : DELETE avec WHERE sur applied_at + INTERVAL. Pseudonymisation : UPDATE avec une fonction de hachage (SHA-256 ou équivalent). En PostgreSQL : encode(digest(email, 'sha256'), 'hex'). Soft-delete : ajouter une colonne deleted_at TIMESTAMP et une colonne expires_at DATE calculée à l'insertion.
Squelette SQL — purge, pseudonymisation, soft-delete
-- Palier 3 — Squelette à compléter

-- 1. Purger les candidats rejetés de plus de 2 ans
DELETE FROM candidates
WHERE status = 'rejected'
  AND applied_at < /* À compléter */;

-- 2. Pseudonymiser les employés partis il y a plus de 5 ans
UPDATE employees
SET
  full_name  = /* hash de full_name */,
  email      = /* hash de email */,
  national_id = NULL,
  bank_iban   = NULL,
  birth_date  = NULL
WHERE /* condition sur hired_at ou date de départ */;

-- 3. Soft-delete des fiches de paie avec expiration
ALTER TABLE payslips ADD COLUMN IF NOT EXISTS deleted_at  TIMESTAMP;
ALTER TABLE payslips ADD COLUMN IF NOT EXISTS expires_at  DATE;

-- Marquer une fiche comme supprimée logiquement
UPDATE payslips
SET deleted_at = now(),
    expires_at = /* 10 ans après la date de la fiche */
WHERE id = $1;
Solution SQL — minimisation RGPD conforme art. 5 et 32
-- Palier 4 — Solution complète commentée

-- 1. Purger les candidats rejetés de plus de 2 ans
-- Selon recommandation CNIL : 2 ans max après dernier contact
DELETE FROM candidates
WHERE status = 'rejected'
  AND applied_at < NOW() - INTERVAL '2 years';

-- 2. Pseudonymiser les employés partis il y a plus de 5 ans
-- On hache les identifiants directs, on supprime les données sensibles
-- SHA-256 est irréversible sans la donnée originale (contrairement à MD5)
UPDATE employees
SET
  full_name   = encode(digest(full_name, 'sha256'), 'hex'),
  email       = encode(digest(email, 'sha256'), 'hex'),
  national_id = NULL,   -- suppression totale, pas de besoin ultérieur
  bank_iban   = NULL,   -- idem
  birth_date  = NULL    -- idem
WHERE hired_at < NOW() - INTERVAL '5 years'
  AND manager_id IS NULL; -- ex-employés sans successeurs actifs

-- 3. Soft-delete des fiches de paie avec expiration légale
-- On ne supprime pas immédiatement (obligation comptable 10 ans)
-- On marque la date de suppression logique et la date d'expiration réelle
UPDATE payslips
SET deleted_at = NOW(),
    expires_at = (month + INTERVAL '10 years')::DATE
WHERE id = $1;

-- Job de purge physique à scheduler (ex: cron quotidien)
DELETE FROM payslips
WHERE expires_at IS NOT NULL
  AND expires_at < CURRENT_DATE;

Palier 5 — Pour aller plus loin

Écris une vue PostgreSQL active_employees qui exclut automatiquement les lignes avec deleted_at IS NOT NULL, et une politique RLS (Row Level Security) qui empêche un tenant de lire les données d'un autre. C'est l'art. 25 RGPD (protection des données dès la conception).

Notification d'incident : RGPD 72h

En cas de violation de données personnelles (fuite, ransomware, accès non autorisé), le responsable de traitement doit notifier la CNIL dans les 72 heures après avoir pris connaissance de l'incident (art. 33 RGPD). Si le risque pour les personnes est élevé, il faut aussi les informer directement (art. 34). Le sous-traitant notifie son responsable de traitement sans délai.

Articulation NIS2 / CRA / RGPD sur un incident

Si ton entreprise est une entité NIS2 et qu'un incident touche des données personnelles, tu cumules les obligations : CSIRT dans les 24h (NIS2), CNIL dans les 72h (RGPD). Si le système vulnérable est un produit commercialisé couvert par le CRA, tu notifies aussi l'ENISA dans les 24h. Crée un arbre de décision interne avant que ça n'arrive.

Chapitre 4

AI Act : les 4 niveaux de risque

L'AI Act ne régule pas les technologies d'IA en tant que telles : il régule les usages, en fonction du risque qu'ils font peser sur les droits fondamentaux. Un même algorithme peut être interdit dans un contexte et libre dans un autre.

Calendrier d'application (mai 2026)

Depuis le 2 février 2025 : pratiques interdites (art. 5) et exigence de littératie IA (art. 4). Depuis le 2 août 2025 : obligations pour les fournisseurs de modèles d'IA à usage général (GPAI). Au 2 août 2026 : haut risque (annexe III) et transparence (art. 50). Au 2 août 2027 : systèmes IA dans les produits réglementés (annexe I).

Niveau 1 : Risque inacceptable (interdit)

Pratiques interdites sur le territoire de l'Union (art. 5). Liste limitée et précise :

  • Notation sociale par les autorités publiques (pas le secteur privé)
  • Manipulation subliminale ou exploitation des vulnérabilités (âge, handicap, situation économique)
  • Scraping massif et indiscriminé d'images faciales sur internet
  • Identification biométrique en temps réel dans l'espace public par les autorités (hors exceptions terrorisme, crimes graves)
  • Reconnaissance des émotions sur le lieu de travail et dans l'éducation (hors usages médicaux/sécurité)

Pour un·e dev

Tu croiseras rarement ces cas dans ta pratique courante. Si tu en croises un, remonte à ton DPO ou ta direction. Sanctions : jusqu'à 35 millions d'euros ou 7% du CA mondial.

Niveau 2 : Haut risque (obligations strictes)

Un système est haut risque dans deux cas :

  • Annexe I : composant de sécurité d'un produit déjà réglementé (dispositif médical, machine, jouet, équipement radio…). Application au 2 août 2027.
  • Annexe III : usages dans des domaines sensibles. C'est ici que se jouent la majorité des cas dev :
  • Biométrie : identification à distance, catégorisation, reconnaissance d'émotions
  • Infrastructures critiques : trafic routier, eau, gaz, électricité
  • Éducation : admission, évaluation des résultats, surveillance d'examens
  • Emploi et RH : tri des CV, évaluation des candidats, surveillance des employés, décisions de licenciement
  • Accès aux services essentiels : scoring de crédit, prestations sociales, assurance santé/vie
  • Application du droit : profilage par les autorités
  • Migration, asile, contrôle des frontières
  • Administration de la justice

Si ton système entre dans ces catégories, il déclenche un ensemble d'obligations lourdes (documentation technique, gestion des risques, contrôle humain, journalisation, marquage CE, enregistrement dans la base UE…). Les obligations diffèrent selon que tu es fournisseur (art. 16) ou déployeur (art. 26).

Niveau 3 : Risque limité (transparence obligatoire)

Ni interdit ni haut risque, mais obligation d'information (art. 50). Quatre cas :

  • Chatbots : informer clairement que l'utilisateur interagit avec une IA
  • Deepfakes : indiquer quand un contenu audio/vidéo a été manipulé pour ressembler à des personnes réelles
  • Reconnaissance des émotions ou catégorisation biométrique : informer les personnes exposées
  • Contenu généré par IA (texte, image, audio, vidéo) : marquage technique permettant la détection (watermarking)

Pour un·e dev

La majorité des intégrations LLM dans des produits relèvent du risque limité. C'est techniquement simple : message UI clair "Vous discutez avec un assistant IA", watermark sur les images générées, log d'interaction.

Niveau 4 : Risque minimal (libre)

Tout ce qui ne tombe pas dans les trois catégories précédentes. Exemples : filtres anti-spam, recommandations de produits standard, IA dans les jeux vidéo, optimisation interne de tri. Pas d'obligation spécifique AI Act, mais le RGPD s'applique toujours si données personnelles.

Chapitre 5

AI Act : classifier un système d'IA en pratique

La théorie des 4 niveaux, c'est bien. L'arbre de décision à appliquer concrètement, c'est ce qu'on travaille ici. L'ordre des tests compte : on descend de l'interdit vers le minimal, et on s'arrête dès qu'on a une réponse.

L'arbre de décision

Arbre de décision AI Act : tester dans l'ordre
[Système d'IA à classer]
          │
          ▼
┌──────────────────────────────────┐
│ 1. Pratique interdite (art. 5) ? │
└──────────────┬───────────────────┘
               │
        ┌──────┴──────┐
        OUI          NON
         │            │
         ▼            ▼
    INACCEPTABLE   ┌──────────────────────────────┐
    → interdit     │ 2. Cas annexe I ou III ?      │
                   └──────────────┬───────────────┘
                                  │
                           ┌──────┴──────┐
                           OUI          NON
                            │            │
                            ▼            ▼
                       HAUT RISQUE  ┌───────────────────────────┐
                       → art. 16/26 │ 3. Cas art. 50 ?          │
                                    │  (chatbot, deepfake,       │
                                    │   contenu généré…)        │
                                    └──────────────┬────────────┘
                                                   │
                                            ┌──────┴──────┐
                                            OUI          NON
                                             │            │
                                             ▼            ▼
                                      RISQUE LIMITÉ   RISQUE MINIMAL
                                      → transparence  → bonnes pratiques

Étape 1 : Tester les pratiques interdites (art. 5)

Lis l'art. 5. Si une pratique interdite s'applique, c'est terminé : système interdit, tu remontes l'alerte. En pratique, dans la grande majorité des cas dev courants, cette étape est négative.

Étape 2 : Tester le haut risque (annexe I et III)

Deux questions :

  • Le système est-il un composant de sécurité d'un produit listé en annexe I ?
  • Le système est-il utilisé dans un cas listé à l'annexe III ? (lire attentivement la formulation : elle est précise)

Dérogations annexe III (art. 6.3)

Il existe des dérogations : un système qui semble haut risque peut ne pas l'être s'il est purement préparatoire ou n'a pas d'effet juridique substantiel. Ces dérogations sont à manier avec précaution : la Commission a publié des lignes directrices progressives.

Étape 3 : Tester la transparence (art. 50)

Quatre cas principaux : interaction humain/chatbot → information explicite ; deepfake ou contenu manipulé → marquage ; reconnaissance d'émotions ou classification biométrique → information ; contenu synthétique généré → watermarking technique.

Étape 4 : Risque minimal par défaut

Si rien ne s'applique : risque minimal. Pas d'obligation AI Act stricte. Revérifie quand même le RGPD si données personnelles impliquées.

Exemple pas-à-pas : chatbot GPT-4o

  1. Art. 5 interdit ? Non : pas de notation sociale par autorité, pas de manipulation subliminale. → Non inacceptable.
  2. Annexe III haut risque ? Non : "support client" n'est pas listé. → Non haut risque.
  3. Art. 50 ? Oui : "système destiné à interagir directement avec des personnes physiques". → Obligation d'information.
  4. Conclusion : risque limité. Obligation : informer clairement l'utilisateur qu'il parle à une IA.

Exemple pas-à-pas : scoring de candidats RH

  1. Art. 5 interdit ? Non : la notation sociale interdite vise les autorités publiques, pas le secteur privé.
  2. Annexe III haut risque ? Oui : point 4.a : "emploi, gestion des travailleurs, accès à l'emploi indépendant : systèmes destinés à être utilisés pour le recrutement ou la sélection de personnes physiques". → Haut risque.
  3. Conclusion : haut risque. Obligations lourdes (documentation, contrôle humain, journalisation…). Et AIPD RGPD obligatoire en plus.

Les 4 pièges classiques de classification

  • Piège du surclassement : "Dans le doute, on met haut risque." Mauvaise idée. Le haut risque a un coût de conformité significatif. Classer factuellement, documenter le raisonnement.
  • Piège du sous-classement : "C'est juste un algo d'aide à la décision." Si l'output influence significativement une décision sur une personne (recrutement, crédit), tu es haut risque : même si la décision finale est humaine.
  • Confusion fournisseur/déployeur : utiliser l'API GPT-4o = déployeur (art. 26), pas fournisseur (art. 16). Obligations très différentes. Si tu fine-tunes et redistribues, tu deviens fournisseur.
  • Oublier l'articulation RGPD : haut risque AI Act + données personnelles = AIPD RGPD obligatoire (art. 35 RGPD). Et art. 22 RGPD si décision individuelle automatisée (droits spécifiques : intervention humaine, contestation, explication).

Chapitre 6

Accessibilité numérique : RGAA, EAA et correction courante

Depuis le 28 juin 2025, l'European Accessibility Act (EAA) étend les obligations d'accessibilité au secteur privé. Ce n'est plus une affaire de service public uniquement. Auditer et corriger l'accessibilité d'une interface, c'est une compétence dev à part entière.

Le cadre réglementaire : RGAA, EAA, WCAG

  • WCAG 2.1 niveau AA : norme internationale de référence (W3C). 78 critères de succès organisés en 4 principes : Perceptible, Utilisable, Compréhensible, Robuste.
  • RGAA 4.1.2 : référentiel français qui opérationnalise les WCAG en 106 critères vérifiables. C'est le texte de référence pour les obligations françaises.
  • EN 301 549 : norme européenne qui harmonise les exigences d'accessibilité. L'EAA l'utilise comme référence technique.
  • EAA (directive 2019/882) : transposée en France par décret 2023-931. Depuis le 28 juin 2025, les entreprises privées qui commercialisent des produits et services numériques aux consommateurs en Europe sont soumises à des obligations d'accessibilité : y compris les PME sous certaines conditions.

Obligations selon le type d'acteur

Services publics : RGAA obligatoire depuis 2020, déclaration d'accessibilité et schéma pluriannuel requis. Grandes entreprises privées (+ de 250 salariés ou + de 50M€ CA) : EAA applicable depuis juin 2025. PME : exemptées si moins de 10 employés ET moins de 2M€ de bilan, mais l'exemption est interprétée restrictivement.

Auditer avec les outils automatisés

Les outils automatisés détectent environ 20% des non-conformités RGAA au maximum. Indispensables mais très insuffisants : les 80% restants nécessitent un test manuel et un test au lecteur d'écran.

  • Lighthouse (intégré dans Chrome DevTools → onglet Lighthouse) : audit automatique, donne un score 0-100 et liste les erreurs. Pratique pour un premier état des lieux.
  • axe DevTools (extension Chrome/Firefox) : plus précis que Lighthouse sur l'accessibilité, indique les violations avec leur impact (critical, serious, moderate, minor).
  • WAVE (extension ou wave.webaim.org) : visualise les problèmes directement sur la page avec des icônes. Très lisible pour montrer les erreurs à un·e client·e.
  • Colour Contrast Analyser : vérifier les ratios de contraste (niveau AA : 4.5:1 pour le texte normal, 3:1 pour le grand texte et les éléments non-textuels).

Test manuel indispensable : la navigation clavier

  • Tab : passer d'un élément interactif au suivant. Tous les liens, boutons, champs et contrôles doivent être atteignables au clavier.
  • Shift+Tab : revenir en arrière. L'ordre de focus doit être logique (correspondre à l'ordre visuel).
  • Entrée / Espace : activer un bouton ou lien. Un composant custom (div cliquable) doit répondre aux mêmes touches.
  • Focus visible : le composant actif doit avoir un indicateur visuel clair. Ne jamais écrire outline: none sans le remplacer par un style de focus custom.
  • Pas de piège clavier : il doit toujours être possible de quitter un composant (modale, menu déroulant) avec Échap ou Tab.

Les corrections les plus fréquentes

  • Images sans alternative textuelle : tout <img> doit avoir un attribut alt. Si l'image est décorative : alt="". Si elle porte du sens : alt="description précise".
  • Formulaires sans labels : chaque champ doit avoir un <label for="id-du-champ"> associé : pas juste un placeholder (il disparaît à la saisie).
  • Contrastes insuffisants : texte gris clair sur fond blanc, texte blanc sur fond bleu clair : les combinaisons pièges. Vérifier systématiquement avec le Colour Contrast Analyser.
  • Titres non hiérarchiques : la structure des <h1> à <h6> doit être logique et ne pas sauter de niveaux. Un <h3> ne peut pas être le premier titre de page.
  • ARIA mal utilisé : ajouter role="button" sur une <div> sans gérer le focus, les événements clavier et tabindex="0" = problème. Règle : utiliser d'abord les éléments HTML natifs (<button>, <a>), ARIA en dernier recours.
  • Liens génériques : "Cliquez ici" ou "En savoir plus" sans contexte sont incompréhensibles pour un lecteur d'écran. Le texte du lien doit décrire la destination.

Intégrer axe dans la CI : ne pas attendre la livraison

Lancer axe manuellement avant chaque commit est utile. L'intégrer dans la CI (GitHub Actions, GitLab CI…) est indispensable : ça bloque la PR si une violation critique est introduite, sans dépendre de la vigilance de chacun·e.

GitHub Actions : bloquer les PR sur violation axe critique
# .github/workflows/accessibility.yml
name: Accessibility CI

on: [push, pull_request]

jobs:
  axe:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Start server
        run: npm start &
        env:
          PORT: 3000

      - name: Wait for server
        run: npx wait-on http://localhost:3000

      - name: Run axe accessibility tests
        uses: cypress-io/github-action@v6
        with:
          command: npx axe http://localhost:3000 --exit

Pour une intégration plus fine dans les tests Playwright ou Cypress :

@axe-core/playwright : intégration dans les tests Playwright
// tests/accessibility.spec.ts (Playwright)
import { test, expect } from "@playwright/test";
import AxeBuilder from "@axe-core/playwright";

test("home page has no critical accessibility violations", async ({ page }) => {
  await page.goto("/");

  const results = await new AxeBuilder({ page })
    .withTags(["wcag2a", "wcag2aa"])  // RGAA niveau A et AA
    .analyze();

  // Affiche les violations dans le rapport de test
  expect(results.violations).toEqual([]);
});

Interpréter les résultats axe correctement

Violations : erreurs confirmées, à corriger immédiatement. Incomplete ("needs review") : axe n'est pas certain : vérifier manuellement. Passes : critères vérifiés automatiquement et conformes. Inapplicable : règle non applicable à la page. Ne pas confondre "axe passe" avec "page conforme RGAA" : axe couvre ~20% des critères au maximum.

Règle des 5 minutes avant le premier commit

Avant de livrer n'importe quel composant UI : naviguer à la souris → tout fonctionne ? Naviguer au clavier → tout est atteignable et le focus est visible ? Lancer axe DevTools → zéro violation critique ? Ces 3 vérifications prennent 5 minutes et évitent 80% des non-conformités les plus graves.

TP 4.1 — Auditer un composant HTML avec axe DevTools

Modalité A · Durée estimée : 30 min · Objectif O5

Le composant HTML ci-dessous contient 5 violations RGAA délibérées. Installe l'extension axe DevTools dans Chrome/Firefox, colle le code dans un fichier HTML local, lance l'audit et produis la liste des violations priorisées.
formulaire-contact.html — 5 violations RGAA intentionnelles
<!-- formulaire-contact.html — à auditer -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Contact</title>
  <style>
    .btn { background: #aaa; color: #bbb; padding: 8px 16px; border: none; }
    input { outline: none; }
  </style>
</head>
<body>
  <img src="logo.png">

  <div onclick="openMenu()" style="cursor:pointer">Menu</div>

  <form>
    <input type="text" placeholder="Votre nom">
    <input type="email" placeholder="Votre email">
    <textarea placeholder="Votre message"></textarea>
    <button class="btn">Envoyer</button>
  </form>

  <a href="/mentions">En savoir plus</a>
  <a href="/confidentialite">En savoir plus</a>
</body>
</html>

Livrable attendu

Un tableau avec : Violation · Impact axe (critical/serious/moderate/minor) · Critère RGAA concerné · Correction à apporter. Classe par impact décroissant.

Palier 1 — Décodage

5 problèmes distincts à trouver. Ils concernent : une image, un élément interactif, des champs de formulaire, un bouton et des liens. Commence par relire le HTML ligne par ligne avant de lancer axe : certaines violations sont visibles à l'œil nu.

Palier 2 — Indices stratégiques

Image : que fait l'attribut alt quand il manque ? Div cliquable : quels attributs ARIA et quelle propriété tabindex manquent-ils ? Formulaires : la règle "pas de label, pas de formulaire accessible" — un placeholder ne remplace pas un label. Bouton : vérifie le ratio de contraste text/fond avec le Colour Contrast Analyser (norme AA : 4.5:1). Liens : deux liens avec le même texte pointant vers des destinations différentes, c'est une violation RGAA 6.1.

Palier 4 — Solution commentée

1. Image sans alt (critical) — RGAA 1.1. <img src="logo.png"><img src="logo.png" alt="Logo [Nom entreprise]">. Si décorative : alt="".

2. Div cliquable non accessible (serious) — RGAA 7.1. Ajouter role="button", tabindex="0", aria-label="Ouvrir le menu" et gérer les événements clavier (Enter/Space). Mieux : utiliser un <button> natif.

3. Champs sans label (critical) — RGAA 11.1. Ajouter un <label for="nom">Votre nom</label> associé à chaque <input id="nom">. Le placeholder seul est insuffisant (disparaît à la saisie, non lu correctement par certains lecteurs d'écran).

4. Contraste insuffisant du bouton (serious) — RGAA 3.3. #aaa sur #bbb = ratio ~1.1:1. Corriger avec texte foncé sur fond clair, ex : color: #1a1a1a; background: #4a7c59.

5. Liens génériques identiques (moderate) — RGAA 6.1. Deux "En savoir plus" avec destinations différentes = incompréhensible pour un lecteur d'écran. Corriger : <a href="/mentions">Mentions légales</a> et <a href="/confidentialite">Politique de confidentialité</a>.

TP 4.2 — Corriger les non-conformités dans le code

Modalité A · Durée estimée : 30 min · Objectif O6

À partir du composant du TP 4.1 et de ta liste de violations, réécris le HTML complet avec toutes les corrections appliquées. Relance axe pour vérifier zéro violation critique.

Palier 4 — Solution corrigée complète

formulaire-contact-corrigé.html — conforme RGAA niveau A et AA
<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Contact — FormTech</title>
  <style>
    /* Contraste AA : #1a1a1a sur #4a7c59 = ratio 5.2:1 */
    .btn { background: #4a7c59; color: #ffffff; padding: 8px 16px; border: none; cursor: pointer; }
    .btn:focus { outline: 2px solid #1a1a1a; outline-offset: 2px; }

    /* Focus visible sur tous les éléments interactifs */
    input:focus, textarea:focus { outline: 2px solid #4a7c59; outline-offset: 2px; }

    /* Masquage accessible des labels si besoin visuel */
    label { display: block; margin-bottom: 4px; font-weight: 600; }
  </style>
</head>
<body>
  <!-- RGAA 1.1 : alt présent et descriptif -->
  <img src="logo.png" alt="Logo FormTech">

  <!-- RGAA 7.1 : bouton natif plutôt que div cliquable -->
  <button type="button" aria-expanded="false" aria-controls="main-menu">
    Menu
  </button>
  <nav id="main-menu" hidden><!-- contenu du menu --></nav>

  <form>
    <!-- RGAA 11.1 : label explicitement associé à chaque champ -->
    <label for="nom">Votre nom</label>
    <input type="text" id="nom" name="nom" autocomplete="name">

    <label for="email">Votre email</label>
    <input type="email" id="email" name="email" autocomplete="email">

    <label for="message">Votre message</label>
    <textarea id="message" name="message"></textarea>

    <!-- RGAA 3.3 : contraste corrigé -->
    <button type="submit" class="btn">Envoyer</button>
  </form>

  <!-- RGAA 6.1 : intitulés de liens descriptifs et distincts -->
  <a href="/mentions">Mentions légales</a>
  <a href="/confidentialite">Politique de confidentialité</a>
</body>
</html>

Chapitre 7

Cybersécurité applicative : OWASP, NIS2 et notification d'incident

La sécurité applicative n'est pas qu'un sujet technique : elle a une dimension réglementaire directe. Une faille OWASP peut déclencher une notification CNIL. Un ransomware peut déclencher une notification NIS2. Comprendre les deux faces est le minimum pour un·e dev responsable.

OWASP Top 10 simplifié : les 5 failles à connaître en priorité

  • A01 : Broken Access Control (numéro 1 depuis 2021) : un utilisateur accède à des données ou des fonctions auxquelles il ne devrait pas avoir accès. Exemples : IDOR (Insecure Direct Object Reference) en modifiant un ID dans l'URL, accès à des routes admin sans vérification de rôle. Correction : vérifier les droits côté serveur à chaque requête, ne pas faire confiance aux paramètres côté client.
  • A02 : Cryptographic Failures : données sensibles transmises ou stockées sans chiffrement adéquat. Exemples : mots de passe en MD5 ou SHA-1, cookies de session sans flag Secure et HttpOnly, données personnelles en clair dans la base. Correction : bcrypt/Argon2 pour les mots de passe, TLS partout, chiffrement au repos pour les données sensibles.
  • A03 : Injection : données non fiables interprétées comme du code. SQL injection, LDAP injection, commandes shell. Correction : requêtes paramétrées (prepared statements), jamais de concaténation de chaîne avec des inputs utilisateurs.
  • A05 : Security Misconfiguration : configuration par défaut non sécurisée, headers HTTP manquants, comptes de debug actifs en prod. Correction : désactiver ce qui n'est pas utilisé, configurer Content-Security-Policy, X-Frame-Options, Referrer-Policy, supprimer les routes de debug.
  • A06 : Vulnerable and Outdated Components : dépendances npm/pip/maven avec vulnérabilités connues. Correction : npm audit en CI, Dependabot, politique de mise à jour régulière.

Lien OWASP / RGPD art. 32

L'art. 32 du RGPD impose des "mesures techniques et organisationnelles appropriées" pour assurer la sécurité des données personnelles. Une faille OWASP non corrigée sur un système qui traite des données personnelles peut constituer une violation de cet article : et déclencher l'obligation de notification à la CNIL.

NIS2 : qui est concerné et quelles obligations

  • Périmètre : NIS2 s'applique aux organisations des secteurs listés aux annexes I et II (énergie, transports, banques, infrastructure numérique, santé, eau, services numériques...). Deux seuils : entités essentielles (grandes organisations des secteurs critiques) et entités importantes (taille intermédiaire ou secteurs moins critiques).
  • Les 10 mesures obligatoires (art. 21) : politiques de sécurité, gestion des incidents, continuité d'activité, sécurité de la chaîne d'approvisionnement, acquisition et maintenance sécurisées des systèmes, évaluation des mesures, formation, cryptographie, sécurité des ressources humaines, authentification multi-facteur.
  • Transposition française : la loi Résilience est attendue pour 2026. L'ANSSI publie le ReCyF (Référentiel Cyber France) comme guide opérationnel.

Notification d'incident : qui notifie quoi, quand, à qui

Arbre de décision notification d'incident : cumuler les obligations si plusieurs cadres s'appliquent
Incident détecté
      │
      ▼
┌─────────────────────────────────────────┐
│ Des données personnelles sont exposées ? │
└──────────────┬──────────────────────────┘
               │
        ┌──────┴──────┐
        OUI          NON
         │            │
         ▼            │
  CNIL dans les 72h   │
  (art. 33 RGPD)      │
  Si risque élevé :   │
  informer les        │
  personnes (art. 34) │
               │      │
               └──────┘
                      │
                      ▼
      ┌───────────────────────────────────┐
      │ Entité NIS2 (essentielle ou       │
      │ importante) ?                     │
      └───────────────┬───────────────────┘
                      │
               ┌──────┴──────┐
               OUI          NON
                │            │
                ▼            ▼
        CSIRT dans 24h    Pas d'obligation
        (alerte préliminaire)  NIS2
        + 72h (notification)
        + 1 mois (rapport final)
                │
                ▼
      ┌───────────────────────────────────┐
      │ Vulnérabilité dans un produit     │
      │ commercialisé couvert par le CRA ?│
      └───────────────┬───────────────────┘
                      │
               ┌──────┴──────┐
               OUI          NON
                │
                ▼
        ENISA dans 24h
        + 72h (notification)
        + 14 jours (rapport)

CRA ≠ NIS2

CRA (Cyber Resilience Act) s'applique aux fabricants de produits numériques (logiciels, hardware connecté) : vulnérabilité dans ton code que tu commercialises → notifier l'ENISA. NIS2 s'applique aux organisations dans les secteurs critiques : incident dans ton SI → notifier le CSIRT national. Une même entreprise peut être sous les deux régimes simultanément.

Récapitulatif des délais

  • RGPD : violation de données personnelles : CNIL dans les 72h (art. 33). Personnes concernées si risque élevé (art. 34) : sans délai injustifié.
  • NIS2 : incident significatif : CSIRT dans les 24h (alerte préliminaire), puis 72h (notification complète), puis 1 mois (rapport final).
  • CRA : vulnérabilité activement exploitée : ENISA dans les 24h (early warning), puis 72h (notification), puis 14 jours (rapport complet).

TP 5.1 — Analyser un endpoint API et construire l'arbre de notification

Modalité A · Durée estimée : 60 min · Objectifs O7 + O8

Deux parties. Partie A (30 min) : identifier les vulnérabilités OWASP dans l'endpoint ci-dessous. Partie B (30 min) : construire l'arbre de décision de notification pour l'incident décrit.
endpoint-orders.ts — à auditer pour vulnérabilités OWASP
// Partie A — endpoint Node.js/Express à auditer
// Contexte : API de gestion de commandes e-commerce

app.get("/orders/:orderId", async (req, res) => {
  const { orderId } = req.params;

  // Récupérer la commande
  const query = `SELECT * FROM orders WHERE id = ${orderId}`;
  const result = await db.query(query);

  if (!result.rows.length) {
    return res.status(404).send("Not found");
  }

  const order = result.rows[0];

  // Log pour débogage en prod
  console.log("Order fetched:", JSON.stringify(order));

  return res.json(order);
});

app.post("/orders", async (req, res) => {
  const { userId, items, promoCode } = req.body;

  // Vérifier le code promo
  const promo = await db.query(
    `SELECT * FROM promos WHERE code = '${promoCode}'`
  );

  // Créer la commande (tous les utilisateurs peuvent créer pour n'importe quel userId)
  await db.query(
    "INSERT INTO orders (user_id, items, promo_id) VALUES ($1, $2, $3)",
    [userId, JSON.stringify(items), promo.rows[0]?.id]
  );

  res.status(201).json({ success: true });
});

Partie B — Scénario de notification d'incident

Le lendemain du déploiement, un·e attaquant·e exploite une des vulnérabilités. Contexte de l'entreprise : ShopFlow SAS, e-commerce B2C, 180 000 clients enregistrés avec noms + emails + historiques de commandes. L'entreprise n'est pas dans un secteur critique NIS2 et ne produit pas de logiciel commercialisé. Incident : l'attaquant·e a exfiltré 12 000 enregistrements clients (nom, email, historique de commandes). L'incident est détecté un mercredi à 14h. Construis l'arbre de décision et indique : qui notifie, quoi, à qui, et avant quelle deadline.

Palier 1 — Décodage

Partie A : 3 vulnérabilités minimum à trouver dans 2 routes. Lis chaque ligne en te demandant : est-ce que l'input utilisateur touche directement une requête SQL ? Est-ce qu'un utilisateur peut agir sur des ressources qui ne lui appartiennent pas ? Est-ce qu'on logue des données sensibles ? Partie B : deux questions à trancher — (1) y a-t-il des données personnelles exposées ? (2) l'entreprise est-elle dans le périmètre NIS2 ou CRA ?

Palier 2 — Indices stratégiques

Partie A : la concaténation de chaîne directement dans une requête SQL est systématiquement A03 Injection. Le fait qu'une route GET ne vérifie pas si la commande appartient bien à l'utilisateur authentifié est A01 Broken Access Control (IDOR). Logger JSON.stringify d'une commande complète en prod peut exposer des données personnelles dans les logs. Partie B : 12 000 personnes exposées avec nom + email = violation de données personnelles = RGPD art. 33. ShopFlow n'est pas entité NIS2 (pas dans les secteurs annexe I/II). Pas de produit logiciel commercialisé = pas CRA. Une seule obligation : CNIL dans les 72h.

Palier 4 — Solution complète

Partie A — 3 vulnérabilités :

1. A03 Injection SQL (lignes 4 et 14) : interpolation directe de orderId et promoCode dans les requêtes. Correction : requêtes paramétrées avec $1, $2.

2. A01 Broken Access Control / IDOR (ligne GET) : aucune vérification que l'utilisateur authentifié est bien le propriétaire de la commande orderId. N'importe quel utilisateur peut lire la commande de n'importe qui en changeant l'ID dans l'URL. Correction : ajouter AND user_id = req.user.id dans la requête.

3. A01 Broken Access Control (ligne POST) : userId vient du body — un utilisateur peut créer une commande pour le compte de n'importe quel autre userId. Correction : utiliser req.user.id issu du token authentifié, jamais le body.

Bonus détecté : log de données personnelles en production (A05 Security Misconfiguration) — supprimer ou pseudonymiser les logs.

Partie B — Arbre de notification : Incident détecté mercredi 14h → données personnelles exposées (12 000 clients) → CNIL dans les 72h = vendredi 14h au plus tard. L'incident implique un risque élevé pour les personnes (email + historique d'achats pouvant révéler des habitudes de santé, finances) → informer les 12 000 personnes concernées sans délai injustifié (art. 34). ShopFlow n'est pas NIS2 ni CRA → pas d'obligation CSIRT ni ENISA.

Palier 5 — Pour aller plus loin

Réécris les deux routes en corrigeant les 3 vulnérabilités. Ajoute un middleware d'authentification (vérification JWT) et un rate limiter (ex : express-rate-limit) pour limiter l'exposition en cas d'énumération d'IDs.

Chapitre 8

Éco-conception numérique : RGESN et leviers techniques

L'éco-conception numérique n'est pas encore une obligation légale au sens strict pour les acteurs privés (hors quelques cas de la loi REEN), mais le RGESN 2024 est le référentiel de référence en France. C'est aussi un argument commercial croissant et une contrainte qui s'installe dans les appels d'offres publics.

Le cadre : loi REEN et RGESN 2024

  • Loi REEN (2021) : Réduction de l'Empreinte Environnementale du Numérique. L'art. 25 impose une déclaration d'écoconception pour les services publics numériques : pas encore pour le privé, mais c'est la direction réglementaire.
  • RGESN 2024 : publié par l'ARCEP le 17 mai 2024. 78 critères organisés en 8 thématiques. 3 niveaux de priorité (haute, moyenne, basse). C'est le texte opérationnel de référence en France.
  • Eco Index (GreenIT.fr) : outil d'évaluation de l'empreinte d'une page web. Donne une note A-G similaire aux étiquettes énergétiques.

Les 5 leviers techniques prioritaires

  • Optimisation des médias : les images et vidéos représentent 70-80% du poids d'une page. Utiliser WebP/AVIF plutôt que JPEG/PNG, dimensionner les images à la taille d'affichage réelle, lazy loading (loading="lazy"), éviter l'autoplay vidéo.
  • Minimisation des requêtes réseau : chaque requête HTTP a un coût énergétique. Regrouper les ressources, utiliser le cache efficacement (Cache-Control, ETag), supprimer les trackers et analytics non essentiels.
  • Sobriété fonctionnelle : la fonctionnalité la plus sobre est celle qu'on ne développe pas. Challenger chaque feature : est-ce vraiment utilisé ? Le RGESN encourage à mesurer l'utilisation réelle avant de maintenir.
  • Terminaux supportés : supporter les navigateurs et appareils anciens pendant longtemps permet de prolonger la durée de vie du matériel. Évaluer les impacts de la dette technique sous cet angle.
  • Polices web : les custom fonts ont un coût de chargement. font-display: swap, sous-ensembles (subsetting), préférer les polices système quand c'est possible.

Analyse du cycle de vie simplifiée (ACV)

L'ACV d'un service numérique identifie les phases les plus impactantes : fabrication des terminaux (représente souvent 70-80% de l'impact total sur la durée de vie), utilisation côté utilisateur (terminal, réseau), utilisation côté serveur (datacenter). Cette hiérarchie a une implication pratique : prolonger la durée de vie des terminaux (en supportant les appareils anciens) est souvent plus impactant que d'optimiser ton serveur.

3 critères RGESN à intégrer dès la conception

1. Mesurer l'usage avant de développer (RGESN 1.1) : analytics léger pour savoir ce qui est vraiment utilisé. 2. Optimiser les images côté serveur (RGESN 4.x) : générer automatiquement les formats WebP/AVIF et les bons breakpoints. 3. Limiter les scripts tiers (RGESN 7.x) : chaque script analytics, tag manager, chatbot externe = requête réseau + exécution CPU côté client.

TP 6.1 — Appliquer les leviers RGESN à une page fictive

Modalité A · Durée estimée : 40 min · Objectif O9

La page fictive ci-dessous a un bilan environnemental catastrophique. Identifie les 5 leviers RGESN prioritaires à activer et propose une correction concrète et mesurable pour chacun.
page-accueil.html — bilan RGESN catastrophique
<!-- page-accueil.html — à auditer RGESN -->
<!DOCTYPE html>
<html>
<head>
  <!-- 3 polices Google Fonts chargées -->
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&family=Open+Sans:wght@300;400;600;700&family=Lato:wght@300;400;700&display=block">

  <!-- Tag manager + analytics + chatbot -->
  <script src="https://www.googletagmanager.com/gtm.js?id=GTM-XXXX"></script>
  <script src="https://analytics.example.com/tracker.js"></script>
  <script src="https://cdn.chatbot.io/widget.js"></script>
  <script src="https://cdn.ab-testing.io/sdk.js"></script>
</head>
<body>
  <!-- Hero avec vidéo en autoplay -->
  <video autoplay loop muted playsinline>
    <source src="hero-video-4k.mp4" type="video/mp4">
  </video>

  <!-- 12 images JPEG non optimisées, chargées toutes en même temps -->
  <div class="gallery">
    <img src="photo-team-1-original.jpg" width="1920" height="1080" style="width:300px">
    <img src="photo-team-2-original.jpg" width="1920" height="1080" style="width:300px">
    <!-- ... 10 autres images identiques ... -->
  </div>

  <!-- Carrousel qui précharge 20 slides en mémoire -->
  <div id="testimonials"></div>
  <script>
    // Fetch de 20 témoignages au chargement, même si l'utilisateur ne scrolle pas
    fetch('/api/testimonials?limit=20').then(r => r.json()).then(renderAll);
  </script>
</body>
</html>

Livrable attendu

Un tableau avec 5 lignes : Levier RGESN · Problème identifié · Correction proposée · Gain estimé (poids, requêtes, CPU). Priorise par impact.

Palier 4 — Solution commentée

1. Médias surdimensionnés (RGESN 4.3) — Images JPEG 1920×1080 affichées en 300px. Correction : générer des formats WebP/AVIF à la bonne taille avec <picture> + srcset. Gain estimé : -70 à -90% du poids des images.

2. Vidéo autoplay 4K (RGESN 4.1) — La vidéo se lance sans interaction utilisateur et boucle indéfiniment. Correction : retirer autoplay, proposer un poster statique + bouton play. Gain : -95% de données transférées pour les utilisateurs qui ne regardent pas.

3. Scripts tiers non essentiels (RGESN 7.2) — 4 scripts tiers chargés inconditionnellement (GTM, analytics, chatbot, A/B testing). Correction : charger uniquement si consentement, et de façon différée (defer/async). Supprimer l'A/B testing si non actif. Gain : -3 à -5 requêtes réseau au chargement.

4. Chargement différé des images (RGESN 4.4) — 12 images chargées au démarrage même si hors viewport. Correction : ajouter loading="lazy" à toutes les images sauf la première. Gain : seules 2-3 images sont chargées au premier rendu.

5. Polices web excessives (RGESN 6.x) — 3 familles de polices, toutes les graisses chargées. Correction : choisir 1 police, 2 graisses max, avec subsetting (&display=swap&text=...) ou polices système (font-family: system-ui). Gain : -300 à -600 Ko de fonts.

Bonus : l'API testimonials charge 20 items au démarrage (RGESN 1.x — sobriété fonctionnelle). Correction : pagination, lazy loading au scroll, ou réduction à 3 items visibles.

Chapitre 9

Synthèse : Audit multi-cadre d'un produit

Les cadres réglementaires ne s'appliquent jamais seuls sur un produit réel. Un e-commerce avec recommandation IA, du paiement en ligne et des analytics cumule RGPD, AI Act, EAA et potentiellement NIS2. La compétence finale : produire un état des lieux structuré et un plan de mise en conformité priorisé.

La méthode d'audit multi-cadre

  1. Cartographier le produit : type de données traitées, fonctionnalités IA, public cible, secteur d'activité, taille de l'entreprise. Cette fiche de départ détermine quels cadres s'appliquent.
  2. Appliquer les critères d'entrée de chaque cadre : RGPD (données personnelles ?), EAA (produit/service numérique au public ?), NIS2 (secteur critique ? seuils de taille ?), AI Act (système d'IA ? quel niveau de risque ?), RGESN (service public ? ou démarche volontaire ?).
  3. Pour chaque cadre applicable, lister les obligations par rôle (responsable de traitement, déployeur AI…). Ne pas chercher l'exhaustivité : identifier les 5-10 obligations majeures de chaque cadre.
  4. Prioriser par risque : occurrence × impact × niveau de sanction. Une faille RGPD sur des données de santé (données sensibles, AIPD obligatoire) prime sur un contraste insuffisant en RGAA (important mais moins sanctionné).
  5. Produire un plan de mise en conformité : 3 colonnes : obligation, action technique, délai. Classer par priorité. Inclure les hypothèses faites et les points à valider avec le DPO/RSSI.

Grille d'audit type

Template d'audit multi-cadre : à adapter selon le produit
## Audit de conformité : [Nom du produit]
**Date** : [date]  **Auditeur·rice** : [nom]

### 1. Identité du produit
- Type : [e-commerce / SaaS B2B / app mobile / site vitrine...]
- Données traitées : [personnelles ? sensibles ? financières ?]
- Fonctions IA : [oui/non : description]
- Public : [B2C / B2B / service public]
- Entreprise : [taille, secteur]

### 2. Cadres applicables
| Cadre | Applicable | Raison |
|-------|-----------|--------|
| RGPD  | OUI       | traite des données personnelles |
| EAA   | OUI       | produit numérique au public, >10 sal. |
| NIS2  | NON       | secteur non listé en annexe I/II |
| AI Act| OUI       | moteur de recommandation (risque limité) |
| RGESN | VOL.      | démarche volontaire |

### 3. Non-conformités identifiées
| Priorité | Cadre | Obligation | Non-conformité | Action | Délai |
|----------|-------|-----------|----------------|--------|-------|
| CRITIQUE | RGPD  | Art. 13-14 | Aucune politique de confidentialité | Rédiger + publier | 2 semaines |
| HAUTE    | RGPD  | Art. 6 | Base légale cookies analytics non documentée | Audit + DPA si besoin | 1 mois |
| HAUTE    | EAA   | RGAA A | Images sans alt sur 12 produits | Ajouter alt programmatiquement | 1 semaine |
| MOYENNE  | AI Act| Art. 50 §1 | Chatbot sans mention "assistant IA" | Modifier UI | 3 jours |
| BASSE    | RGESN | 4.x | Images JPEG non convertis en WebP | Config build | 1 semaine |

### 4. Hypothèses et points à valider
- [ ] Vérifier avec le DPO si l'AIPD est requise pour le moteur de reco
- [ ] Confirmer la base légale retenue pour les analytics avec le DPO
- [ ] Vérifier si l'entreprise dépasse les seuils NIS2 pour les services cloud

Les articulations à ne pas manquer

  • Haut risque AI Act + données personnelles → AIPD RGPD obligatoire. Les deux s'appliquent en même temps. Le DPO doit être impliqué.
  • Incident de sécurité → RGPD art. 33 + potentiellement NIS2. Créer un arbre de décision interne avant que l'incident arrive (voir chapitre Cybersécurité).
  • RGAA + RGPD sur les formulaires : un formulaire doit être accessible ET gérer correctement le consentement pour les données collectées.
  • RGESN + RGPD sur les données d'usage : les analytics qu'on voudrait garder pour améliorer l'éco-conception sont eux-mêmes des données personnelles sous RGPD. Trouver la base légale et minimiser.

Ce que tu sais faire maintenant

Identifier les cadres applicables à un projet · Classer un système d'IA AI Act · Cartographier les données RGPD · Auditer l'accessibilité RGAA · Construire un arbre de décision incident · Appliquer les leviers RGESN · Produire un audit multi-cadre et un plan de mise en conformité priorisé. Tu n'es pas juriste. Tu es dev : et tu tiens une conversation sérieuse avec un·e DPO, RSSI ou expert·e accessibilité.

TP 7.1 — Audit multi-cadre : MediConnect SaaS

Modalité B · Durée estimée : 90 min · Objectif O12 · Sans corrigé type — plusieurs approches valides

Tu vas produire un audit multi-cadre complet pour un produit fictif et un plan de mise en conformité priorisé sur 3 mois. C'est le TP de synthèse : il mobilise tous les cadres vus dans la formation.

Contexte — MediConnect SaaS. Une startup française (18 salariés, 3,2 M€ de CA) édite une plateforme web de gestion de dossiers médicaux pour des cabinets de médecins généralistes. La plateforme :

  • Stocke les dossiers patients : nom, prénom, date de naissance, numéro de sécu, antécédents médicaux, ordonnances
  • Intègre un module IA qui analyse les symptômes saisis par le médecin et propose un diagnostic différentiel
  • Est accessible via une interface web publique (compte médecin requis)
  • Utilise Google Analytics et un chatbot IA de support client
  • A subi une fuite de données il y a 6 mois (200 dossiers exposés, notifiée à la CNIL)

Livrable attendu

Produis un document Markdown avec :

1. Matrice d'applicabilité : pour chaque cadre (RGPD, AI Act, EAA, NIS2/CRA, RGESN), réponds : applicable ? Pourquoi ? Quel rôle MediConnect joue-t-il ?

2. Top 5 des non-conformités identifiées : pour chaque non-conformité, indique le cadre, l'article, et l'impact (risque légal + risque métier).

3. Plan de mise en conformité 3 mois : 3 colonnes — Action · Responsable (dev/DPO/direction) · Délai. Classe par priorité (🔴 bloquant / 🟡 important / 🟢 améliorable).

Grille d'auto-évaluation

Avant de valider ton audit, réponds à ces 5 questions :

1. RGPD : as-tu identifié que les données médicales sont des données de santé (art. 9) et que MediConnect est responsable de traitement ? As-tu mentionné l'obligation AIPD (art. 35) pour le traitement de données de santé à grande échelle ?

2. AI Act : as-tu classé le module IA de diagnostic dans la bonne catégorie de risque ? (Indice : un outil d'aide à la décision médicale figure à l'annexe III AI Act, domaine médical.)

3. EAA : as-tu vérifié les seuils d'applicabilité ? (18 salariés + 3,2 M€ CA = pas exemptée EAA, car l'exemption PME requiert <10 salariés ET <2 M€.)

4. Priorisation : les non-conformités RGPD sur des données de santé sont-elles en tête de ta liste, avant les non-conformités accessibilité ?

5. Réalisme : les actions que tu proposes sont-elles faisables par une équipe de 18 personnes en 3 mois, ou as-tu sur-estimé la capacité ?

Pistes de réflexion (au lieu d'un corrigé)

Sur l'AI Act : un système d'aide au diagnostic médical est listé à l'annexe III point 5 (systèmes IA dans les domaines de la santé). C'est haut risque. MediConnect est déployeur (utilise l'IA d'un fournisseur tiers) ou fournisseur (si elle développe son propre modèle) : le rôle change radicalement les obligations.

Sur le RGPD : données de santé (art. 9) + fuite précédente = AIPD obligatoire si pas encore faite, DPO recommandé (voire obligatoire si volume suffisant), mesures de sécurité renforcées art. 32.

Sur la priorisation : une PME ne peut pas tout corriger en même temps. Le bon réflexe : (1) ce qui est illégal maintenant (données de santé sans base légale art. 9, IA haut risque sans évaluation conformité) ; (2) ce qui expose à des sanctions immédiates ; (3) ce qui améliore sans urgence légale (RGESN).

🛠️ Exercice optionnel

Classifier 3 systèmes d'IA

Tu travailles dans une agence qui développe des produits pour plusieurs clients. Trois systèmes d'IA viennent de passer en revue de conformité. Pour chacun, tu dois appliquer l'arbre de décision AI Act.

Ta mission

Pour chacun des 3 systèmes suivants, détermine le niveau de risque AI Act, justifie avec les articles précis, identifie le rôle de l'entité, et liste 2-3 obligations principales :

  1. Filtre anti-spam : service de messagerie d'entreprise qui filtre automatiquement les emails entrants. Développé en interne sur une bibliothèque open source de classification de texte.
  2. Assistant de génération d'images : outil interne qui génère des visuels pour les réseaux sociaux de la marque, via l'API DALL-E 3. Les images représentent des produits (jamais de personnes réelles).
  3. Système de détection de fraude bancaire : développé par un éditeur tiers, utilisé par une banque pour bloquer automatiquement les transactions suspectes. La banque n'a pas accès au code source.

Tu bloques ? Des indices, à dévoiler quand tu en as besoin.

Indice 1

Indice masqué.

Indice 2

Indice masqué.

Indice 3

Indice masqué.

✅ QCM de fin de cours

Teste tes acquis

11 questions, plusieurs réponses parfois possibles. Coche tout ce qui te semble juste, puis valide pour voir ton score et les explications.

  1. 1

    Laquelle de ces données N'EST PAS une donnée personnelle au sens du RGPD ?

  2. 2

    Un site e-commerce veut envoyer une newsletter promotionnelle à ses clients existants. Quelle est la base légale la plus appropriée ?

  3. 3

    Une entreprise intègre l'API GPT-4o dans son chatbot de support client. Quel est le niveau de risque AI Act et quel est le rôle de l'entreprise ?

  4. 4

    Un logiciel de scoring automatique de CV est utilisé par un cabinet RH pour présélectionner des candidats. Ce système est :

  5. 5

    Une startup SaaS (entité NIS2 importante) subit un incident de sécurité qui expose des données clients. Dans quels délais doit-elle notifier ?

  6. 6

    Une agence web héberge un e-commerce client sur son infrastructure et traite les données clients pour son compte. Quel est le rôle de l'agence au sens RGPD ?

  7. 7

    Tu lances axe DevTools sur une page et tu obtiens 3 'violations' et 5 'incomplete'. Que fais-tu en priorité ?

  8. 8

    Un champ de formulaire n'a pas de label associé mais affiche un placeholder visible. Quel est le problème ?

  9. 9

    Un endpoint API construit une requête SQL ainsi : const q = 'SELECT * FROM users WHERE email = ' + req.body.email. Quelle est la correction appropriée ?

  10. 10

    Tu reçois une maquette avec des images produit en JPEG (2 Mo chacune) affichées en 300×300px sur desktop. Que recommandes-tu ?

  11. 11

    Un SaaS RH intègre un module de scoring de CV et collecte les données personnelles des candidats. Quels cadres réglementaires sont concernés simultanément ?

Tu peux laisser des questions sans réponse, elles compteront comme fausses.

Tu veux ce cours pour ton équipe ?

Je peux adapter et animer ce cours pour tes formateur·ices ou tes apprenant·es, en présentiel ou en distanciel. Parlons-en pendant l'audit gratuit.

Réserver un audit gratuit →