Partie 1 de la série « Sécurité web dans l'UE : 10 étapes pour une meilleure note »
Le problème en 30 secondes
Votre site web dispose d'un certificat TLS. Très bien. Mais quand un utilisateur tape http://votre-domaine.com — que se passe-t-il ?
Sans HSTS : Le navigateur se connecte en clair. Le site redirige vers HTTPS. Mais dans les millisecondes entre la requête HTTP et la redirection, un attaquant sur le même réseau (Wi-Fi d'un café, aéroport, hôtel) peut détourner la connexion. Man-in-the-middle, vol de cookies, détournement de session — tout cela est trivial.
Avec HSTS : Le navigateur sait déjà que ce domaine n'accepte que le HTTPS. Il se connecte directement de manière chiffrée. Pas de requête HTTP, pas de redirection, pas de fenêtre d'attaque.
Un en-tête. Une ligne. Et 72,4% des sites web européens ne l'ont pas.
Ce que disent les données
D'après le Benchmark SiteGuardian couvrant plus de 700 000 sites web européens :
- 27,6% ont HSTS activé
- 75,7% redirigent vers HTTPS — mais sans HSTS, la redirection est attaquable
- 24,3% ne redirigent même pas, malgré un certificat valide
Cela signifie : trois sites web sur quatre disposant d'un certificat TLS ne l'utilisent pas de manière cohérente. Le certificat est là, la protection non.
Qu'est-ce que HSTS exactement ?
HTTP Strict Transport Security (RFC 6797) est un en-tête de réponse HTTP qui dit au navigateur :
« Connecte-toi à ce domaine pendant les X prochaines secondes exclusivement en HTTPS. Ignore complètement le HTTP. »
L'en-tête ressemble à ceci :
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 an (en secondes). Le navigateur mémorise l'instruction pendant cette durée.includeSubDomains— s'applique à tous les sous-domaines (api.votre-domaine.com, mail.votre-domaine.com, etc.)
Après la première visite, le navigateur se connecte directement en HTTPS à chaque requête suivante — sans le détour par HTTP.
Comment activer HSTS
Apache (.htaccess ou vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Prérequis : mod_headers doit être activé.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Le always à la fin garantit que l'en-tête est envoyé même sur les pages d'erreur (4xx, 5xx).
Caddy
Caddy configure HSTS automatiquement lorsque HTTPS est actif. Rien à faire.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Ou avec le package helmet :
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
Les plugins « Really Simple SSL » ou « HTTP Headers » activent HSTS en un clic. Alternativement, ajoutez-le dans le .htaccess (voir Apache ci-dessus).
Hébergement géré (Cloudflare, AWS, Platform.sh, etc.)
La plupart des hébergeurs ne configurent pas HSTS par défaut. Vérifiez votre tableau de bord sous « Paramètres SSL/TLS » ou « En-têtes HTTP ». Si l'option n'est pas disponible, créez un fichier .htaccess à la racine du site.
Trois erreurs à éviter
1. Définir un max-age trop court
max-age=86400 (1 jour) ne protège que les utilisateurs ayant visité le site dans les dernières 24 heures. Commencez par 30 jours (2592000), puis passez à 1 an (31536000) une fois que tout fonctionne.
2. Oublier includeSubDomains
Sans includeSubDomains, vos sous-domaines restent accessibles en HTTP. Si mail.votre-domaine.com ou intranet.votre-domaine.com n'ont pas de TLS, n'ajoutez includeSubDomains qu'une fois que tous les sous-domaines supportent HTTPS — sinon ils cesseront de fonctionner.
3. Activer HSTS sans une redirection HTTPS fonctionnelle
HSTS exige que votre site web soit réellement accessible en HTTPS. Testez avant d'activer : naviguez vers https://votre-domaine.com. Si vous voyez une erreur, corrigez d'abord la configuration du certificat TLS.
HSTS Preload : l'étape suivante
Lorsque HSTS fonctionne et que vous êtes certain que tous les sous-domaines supportent HTTPS, demandez l'inclusion dans la liste HSTS preload :
- Configurez l'en-tête ainsi :
max-age=31536000; includeSubDomains; preload - Soumettez votre domaine sur : hstspreload.org
La liste preload est intégrée dans Chrome, Firefox, Safari et Edge. Les domaines sur la liste sont toujours chargés en HTTPS — même lors de la toute première visite, avant que le navigateur n'ait jamais vu l'en-tête HSTS.
Lien avec NIS2 et le RGPD
HSTS n'est mentionné par son nom dans aucune loi. Mais :
-
NIS2 Art. 21(2)(d) exige la « sécurité dans l'acquisition, le développement et la maintenance des réseaux et systèmes d'information, y compris la gestion et la divulgation des vulnérabilités ». Un en-tête HSTS manquant est une vulnérabilité connue et trivialement exploitable.
-
RGPD Art. 32 exige des « mesures techniques appropriées » pour protéger les données personnelles. Le chiffrement du transport sans HSTS, c'est comme une serrure sans verrou — cela semble sécurisé, mais s'ouvre d'un seul geste.
Vérifiez votre domaine
Activez HSTS, attendez 5 minutes et analysez votre domaine :
L'analyse vous montrera immédiatement si HSTS est correctement configuré, si includeSubDomains est actif et si votre domaine remplit les conditions pour la liste preload.
La semaine prochaine dans la Partie 2 : DMARC — de none à reject. Pourquoi policy=none ne protège personne, et comment atteindre une politique DMARC efficace en trois étapes.
Cet article fait partie de la série « Sécurité web dans l'UE : 10 étapes pour une meilleure note ». Données du SiteGuardian EU Web Security Benchmark couvrant plus de 700 000 sites web européens.