> ./exec Web_dev.sh — GUIDE

Site web conforme RGPD : liste de contrôle pour les PME

Léa — Frontend Engineer LéaFrance · Frontend Engineer 09-07-2026 9 min de lecture WEB-DEV

Une amende RGPD commence à 2 % du chiffre d'affaires annuel mondial. Pour une entreprise réalisant 5.000.000 EUR de chiffre d'affaires annuel, cela représente un plancher de 100.000 EUR. La cause, étonnamment fréquente, n'est pas une violation de données sophistiquée, mais un composant web standard : une police chargée depuis un CDN externe, un bandeau cookie sans logique d'opt-in réelle, un formulaire de contact sans mention au titre de l'article 13.

Ce guide présente huit points de contrôle vérifiables directement dans le code ou la configuration serveur. Chaque section précise ce qui doit être mesuré et quel outil permet de visualiser le statut.


Point de contrôle 1 : HTTPS et TLS 1.3

L'article 32 du RGPD exige des "mesures techniques appropriées" pour protéger les données à caractère personnel. Une connexion HTTP non chiffrée ne satisfait pas ce critère.[1] TLS 1.0 et 1.1 sont considérés comme obsolètes depuis 2021 et ne doivent plus être utilisés. L'Office fédéral allemand de la sécurité des technologies de l'information (BSI) recommande TLS 1.3 avec des suites de chiffrement ECDHE modernes et exclut explicitement les certificats SHA-1.[4]

Configuration Nginx minimale :

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

Validation : le SSL Labs Server Test attribue la note A+ lorsque HSTS et TLS 1.3 sont correctement configurés. Une alternative consiste à exécuter curl -I https://votre-domaine.fr et à vérifier l'en-tête Strict-Transport-Security dans la réponse.


Point de contrôle 2 : implémenter correctement le consentement aux cookies

La Conférence des autorités de contrôle indépendantes de la protection des données fédérales et des Länder (DSK) a précisé dans ses lignes directrices sur les téléservices : les cookies non strictement nécessaires ne peuvent être déposés qu'après un consentement actif et éclairé de l'utilisateur. Les cases pré-cochées, un bouton "OK" sans option "Refuser" équivalente ou des liens d'opt-out dissimulés ne satisfont pas ces exigences.[2]

Concrètement : les scripts tiers ne doivent être insérés dans le DOM qu'après l'événement de consentement.

// Charger les scripts UNIQUEMENT après consentement
function loadAnalytics() {
  const script = document.createElement('script');
  script.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXXX';
  script.async = true;
  document.head.appendChild(script);
}

document.addEventListener('consent:analytics', loadAnalytics);

Un gestionnaire de consentement (Usercentrics, Cookiebot, Borlabs Cookie) implémente automatiquement ce mécanisme d'événements. Point critique : le gestionnaire de consentement lui-même ne doit pas déposer de cookies de traçage avant la décision de l'utilisateur. Cela peut sembler évident, mais c'est une erreur de configuration fréquente dans les implémentations bon marché.

Vérification Lighthouse : la section "Third-party resources" du rapport Lighthouse et l'onglet Réseau de Chrome DevTools indiquent combien de requêtes sont émises dès le premier chargement de la page. Chaque script externe antérieur à l'événement de consentement représente une violation potentielle.


Point de contrôle 3 : intégrer Google Fonts en local

Le Tribunal régional de Munich I a jugé en janvier 2022 que la transmission automatique de l'adresse IP du visiteur à Google lors du chargement de polices depuis le CDN Google constitue une violation du RGPD.[3] La solution technique est simple. L'outil google-webfonts-helper fournit les fichiers WOFF2 pour une diffusion locale.

/* styles/fonts.css */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/fonts/inter-v13-latin-regular.woff2') format('woff2');
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/fonts/inter-v13-latin-700.woff2') format('woff2');
}

font-display: swap n'est pas un détail facultatif. Il empêche le FOIT (Flash of Invisible Text) et améliore sensiblement la valeur LCP. Dans nos propres tests : réduction du LCP de 0,3 à 0,8 seconde après le passage du CDN Google à une diffusion locale des polices.[5]


Point de contrôle 4 : formulaires de contact et obligation d'information

Tout formulaire collectant des données à caractère personnel doit, immédiatement avant l'envoi, faire référence à la politique de confidentialité. L'information doit être visible avant que l'utilisateur n'envoie le formulaire, et pas uniquement dans un document lié.[1]

<p class="form-privacy-hint">
  En envoyant ce formulaire, vous acceptez le traitement de vos données
  pour le traitement de votre demande.
  Plus d'informations : <a href="/politique-confidentialite">Politique de confidentialité</a>.
</p>

Le principe de minimisation des données prévu à l'article 5, paragraphe 1, point c) du RGPD s'applique à la structure des champs : un formulaire de contact requiert un nom et une adresse e-mail. Le numéro de téléphone et le nom de l'entreprise doivent être marqués comme champs optionnels.[1] Les champs obligatoires non indispensables à la finalité du formulaire augmentent le risque de non-conformité.


Point de contrôle 5 : accords de sous-traitance (AS)

Tout prestataire externe traitant des données à caractère personnel pour le compte d'une organisation doit faire l'objet d'un accord de sous-traitance (AS). Cela ne concerne pas uniquement l'hébergeur, mais l'ensemble des outils en contact avec les données des visiteurs ou clients :

  • Hébergeurs (Hetzner, IONOS, AWS, Azure)
  • Prestataires e-mail (Mailchimp, Brevo, Microsoft 365)
  • Services d'analyse (Google Analytics 4, Matomo Cloud, Hotjar)
  • Services de formulaires (Formspree, HubSpot, Typeform)
  • Fournisseurs CDN (Cloudflare, Fastly, Akamai)

La plupart des grands fournisseurs proposent des modèles d'accord de sous-traitance standardisés dans leur portail client. Les accords manquants ou expirés figurent parmi les constats les plus fréquents lors des audits RGPD. Un simple tableau reprenant le prestataire, la finalité du traitement, le statut de l'accord de sous-traitance et la date de dernière vérification constitue une documentation minimale suffisante.


Point de contrôle 6 : en-tête Content Security Policy

Un en-tête CSP définit les ressources que le navigateur est autorisé à charger et les destinations vers lesquelles il peut envoyer des données. Il ne s'agit pas d'un renforcement de sécurité facultatif, mais d'une mesure technique au sens de l'article 32 du RGPD, qui prévient tout transfert de données non autorisé vers des tiers.

En-tête de base strict pour Nginx :

add_header Content-Security-Policy "
  default-src 'self';
  script-src  'self';
  style-src   'self' 'unsafe-inline';
  font-src    'self';
  img-src     'self' data:;
  connect-src 'self';
  frame-ancestors 'none';
" always;

Après le passage aux polices locales et à la diffusion de ressources propres, font-src peut être restreint à 'self'. Chaque domaine supplémentaire dans les directives représente un point de fuite de données externe potentiel. L'onglet Sécurité de Chrome DevTools affiche directement en console les violations CSP.

Référence chiffrée : un en-tête CSP complet avec default-src 'self' bloque en moyenne 8 à 14 requêtes tierces lors du premier chargement sur un site marketing typique.


Point de contrôle 7 : journaux serveur et anonymisation des adresses IP

Les journaux des serveurs web contiennent par défaut des adresses IPv4 et IPv6 complètes. Une adresse IP complète constitue une donnée à caractère personnel. Sans base légale ou anonymisation, son stockage enfreint l'article 5 du RGPD.[1]

Configuration Nginx avec anonymisation des IP via map :

map $remote_addr $remote_addr_anon {
  ~(?P<ip>\d+\.\d+\.\d+)\.\d+$  $ip.0;
  ~(?P<ip>[^:]+:[^:]+):          $ip::;
  default                        0.0.0.0;
}

log_format anonymized '$remote_addr_anon - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent';

access_log /var/log/nginx/access.log anonymized;

Il est également recommandé de configurer une rotation des journaux sur 7 jours maximum (logrotate avec rotate 1 et daily). En pratique, une fenêtre de 48 heures suffit à des fins de débogage. Une conservation plus longue nécessite une base légale explicite et une inscription au registre des activités de traitement.


Point de contrôle 8 : Lighthouse comme système d'alerte précoce RGPD

Lighthouse ne mesure pas la conformité RGPD au sens juridique, mais les requêtes tierces dans son rapport sont directement corrélées au profil de risque d'un site web. Chaque script externe, chaque police chargée depuis un CDN, chaque pixel de traçage représente un transfert de données vers un tiers.

Valeurs cibles pour un site web conforme au RGPD avec de solides Core Web Vitals :[5]

Métrique Valeur cible Outil de mesure
LCP (Largest Contentful Paint) inférieur à 2,5 s Lighthouse, CrUX
INP (Interaction to Next Paint) inférieur à 200 ms Chrome DevTools Performance
CLS (Cumulative Layout Shift) inférieur à 0,1 Lighthouse
Requêtes tierces (premier chargement) 0 Onglet Réseau
Octets tiers (premier chargement) 0 Ko Onglet Réseau

Lors du premier chargement de la page, avant toute interaction utilisateur, les requêtes vers des tiers doivent être réduites à zéro. C'est la traduction technique de l'obligation de consentement.[5]

Commande CLI pour des vérifications automatisées dans le pipeline CI/CD :

npx lighthouse https://votre-domaine.fr \
  --only-categories=performance \
  --output=json \
  --output-path=./lighthouse-report.json

Intégrez cette étape dans chaque cycle de déploiement. Les nouvelles requêtes tierces sont ainsi détectées avant d'atteindre la production.


Cadence d'audit

Un contrôle RGPD ponctuel ne suffit pas. Chaque mise à jour de dépendance, chaque nouveau plugin, chaque intégration de traçage supplémentaire peut modifier le statut de conformité. Cadence recommandée :

  • Mensuel : analyse Lighthouse de la page d'accueil et des principales pages de destination, comparaison des requêtes tierces avant et après consentement
  • Trimestriel : vérification complète de l'ensemble des prestataires tiers par rapport à la liste des accords de sous-traitance avec date de contrôle
  • À chaque release : test de l'en-tête CSP en environnement de préproduction, vérification via l'onglet Réseau lors du premier chargement
  • Annuel : audit RGPD complet de toutes les activités de traitement, incluant le registre des activités de traitement

L'effort consacré aux analyses mensuelles est inférieur à 30 minutes une fois l'intégration Lighthouse CI en place. Une décision d'amende coûte considérablement plus, en temps et en euros.


Sources

[1] Parlement européen et Conseil de l'Union européenne, Règlement (UE) 2016/679 relatif à la protection des personnes physiques à l'égard du traitement des données à caractère personnel (Règlement général sur la protection des données), Journal officiel de l'Union européenne L 119, 4 mai 2016, p. 1 à 88. https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX%3A32016R0679

[2] Conférence des autorités de contrôle indépendantes de la protection des données fédérales et des Länder (DSK), Lignes directrices des autorités de contrôle pour les fournisseurs de téléservices à compter du 1er décembre 2021, version 1.1, mars 2022. https://www.datenschutzkonferenz-online.de/media/oh/20220405_oh_telemedien.pdf

[3] Tribunal régional de Munich I, jugement du 20 janvier 2022, référence 3 O 17493/20, concernant la transmission d'adresses IP à Google LLC par l'intégration de Google Fonts via CDN.

[4] Office fédéral de la sécurité des technologies de l'information (BSI), Directive technique BSI TR-02102-2 : Méthodes cryptographiques, recommandations et longueurs de clés, partie 2 : Utilisation de Transport Layer Security (TLS), version 2024-01. https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.html

[5] Google LLC, Core Web Vitals, documentation de référence sur LCP, INP et CLS, web.dev/vitals, consulté le 9 juillet 2026. https://web.dev/vitals/

Léa — Frontend Engineer

LéaFrance

Frontend Engineer

Architecture frontend, performance, composants reutilisables, animations.

Besoin d'aide sur Web & Dev?

Premier échange gratuit, forfait après audit.

INIT_CONSULTATION() →