Headers HTTP de sécurité : le guide complet pour un site web protégé en 2026
En bref : les headers HTTP de sécurité sont une défense passive contre 80 % des attaques web automatisées (XSS, clickjacking, sniffing, injection de contenu). Leur configuration prend 30 minutes. Leur absence est un motif d'affaiblissement en cas de contrôle CNIL suite à une fuite. Voici les 7 headers essentiels, leur rôle, et comment les activer sur Apache, Nginx et cPanel.
Pourquoi les headers HTTP sont critiques
Les headers HTTP de sécurité sont des instructions que votre serveur envoie au navigateur à chaque réponse. Ils disent au navigateur : « Fais confiance à X, refuse Y, bloque Z ». Cela crée une couche de protection supplémentaire entre le navigateur et votre site.
Concrètement, sans ces headers :
- Votre site peut être intégré dans une iframe frauduleuse (clickjacking) et voler des clics de vos utilisateurs.
- Un script injecté via XSS peut voler les cookies de session de vos utilisateurs.
- Un visiteur peut tomber sur du HTTP en clair si un attaquant exploite une faille DNS.
- Votre politique CSP absente laisse passer tout script externe, même malveillant.
Et en cas de fuite de données, la CNIL examine vos headers. Leur absence = négligence = amende alourdie.
Les 7 headers essentiels (par ordre de priorité)
1. Strict-Transport-Security (HSTS) Facile
Rôle : force le navigateur à utiliser HTTPS pour toutes les futures requêtes vers votre domaine, empêchant le downgrade vers HTTP.
Configuration recommandée :
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Effet : une fois qu'un navigateur a vu ce header, il refusera pendant 1 an toute tentative de connexion HTTP vers votre domaine.
2. X-Content-Type-Options Facile
Rôle : empêche le navigateur de « deviner » le type MIME d'un fichier. Par exemple, un fichier uploadé en .jpg mais contenant du JavaScript ne sera pas exécuté.
X-Content-Type-Options: nosniff
Effet : protection contre les attaques par confusion de type (MIME sniffing attacks).
3. X-Frame-Options Facile
Rôle : interdit à d'autres sites d'intégrer le vôtre dans une iframe. Protection directe contre le clickjacking.
X-Frame-Options: SAMEORIGIN
Effet : votre site ne peut être intégré que dans une iframe provenant de votre propre domaine.
4. Referrer-Policy Facile
Rôle : contrôle les informations envoyées dans le header Referer lorsqu'un utilisateur clique sur un lien sortant. Protège contre la fuite de données via URL.
Referrer-Policy: strict-origin-when-cross-origin
Effet : envoie l'origine complète pour les liens internes, mais seulement le domaine pour les liens externes.
5. Permissions-Policy Moyen
Rôle : anciennement Feature-Policy. Contrôle quelles API navigateur sont accessibles à votre site (caméra, micro, géolocalisation…).
Permissions-Policy: geolocation=(), microphone=(), camera=()
Effet : même si un script injecté tente d'accéder au micro de l'utilisateur, le navigateur refusera.
6. Content-Security-Policy (CSP) Difficile
Rôle : liste blanche des sources autorisées pour scripts, styles, images, etc. La défense la plus puissante contre les XSS, mais la plus complexe à configurer.
Configuration minimale (à adapter à votre site) :
Content-Security-Policy: default-src 'self';
script-src 'self' 'unsafe-inline' https://www.googletagmanager.com;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
img-src 'self' data: https:;
connect-src 'self';
⚠️ Attention : une CSP trop stricte peut casser votre site (scripts analytics, polices Google, iframes). Commencez en mode Report-Only pour détecter les blocages sans impacter les utilisateurs :
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
7. Cross-Origin-Opener-Policy (COOP) Moyen
Rôle : isole votre site des autres pages ouvertes dans le même contexte (protection contre Spectre et autres attaques CPU).
Cross-Origin-Opener-Policy: same-origin
Effet : même si un utilisateur ouvre votre site depuis un onglet compromis, les deux environnements restent isolés.
Configuration concrète selon votre serveur
Apache / .htaccess (hébergement mutualisé OVH, cPanel, etc.)
Créez ou éditez le fichier .htaccess à la racine de votre site :
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
Header always set Cross-Origin-Opener-Policy "same-origin"
# CSP : à tester en Report-Only d'abord !
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src 'self' data: https:;"
</IfModule>
Nginx
Dans votre fichier de configuration de site :
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
PHP (si pas d'accès au serveur)
Ajoutez au tout début de vos fichiers PHP principaux (ou dans un include chargé partout) :
<?php
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('Referrer-Policy: strict-origin-when-cross-origin');
header('Permissions-Policy: geolocation=(), microphone=(), camera=()');
?>
Comment tester votre configuration
Trois outils gratuits pour vérifier vos headers :
- SecurityHeaders.com — note votre site de A+ à F, détaille chaque header manquant.
- Mozilla Observatory — observatory.mozilla.org, analyse plus poussée avec recommandations.
- VeriSite (shameless plug) — scan de conformité complet : headers + RGPD + RGAA + LCEN en 30 secondes.
Tester progressivement : activez un header à la fois et vérifiez que rien ne casse (surtout pour CSP). Surveillez la console navigateur (F12) pour détecter les blocages.
Les erreurs les plus fréquentes
- HSTS activé sans être prêt : si vous désactivez HTTPS plus tard, les utilisateurs ne pourront plus accéder au site pendant 1 an. Testez d'abord avec
max-age=60(1 minute) puis augmentez. - CSP trop restrictive : casse Google Fonts, Analytics, pixels publicitaires. Commencez en Report-Only + analysez les reports.
- X-Frame-Options en concurrence avec frame-ancestors CSP : les navigateurs privilégient CSP, donc X-Frame-Options devient purement déclaratif quand les deux sont définis.
- Oubli du
alwaysen Nginx : sans ce mot-clé, les headers ne sont envoyés qu'en 2xx, pas en 4xx/5xx (donc pas sur les pages d'erreur).
🔒 Vérifier vos headers en 30 secondes
VeriSite teste automatiquement vos 7 headers de sécurité + 29 autres critères de conformité. Rapport immédiat avec le code exact pour corriger.
Scanner mon site