HTTP Security Headers
Contexte
Les headers HTTP de sécurité sont des directives envoyées par le serveur pour indiquer au navigateur comment se comporter. Ils constituent une couche de défense contre les attaques web courantes.
Headers essentiels
Content-Security-Policy (CSP)
Contrôle les sources autorisées pour les scripts, styles, images, etc. :
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'
Protège contre : XSS — bloque l'exécution de scripts injectés.
Strict-Transport-Security (HSTS)
Force le navigateur à utiliser HTTPS :
Strict-Transport-Security: max-age=31536000; includeSubDomains
Protège contre : downgrade attacks et man-in-the-middle.
X-Content-Type-Options
Empêche le navigateur de deviner le type MIME :
X-Content-Type-Options: nosniff
Protège contre : MIME sniffing attacks.
X-Frame-Options
Empêche l'intégration de la page dans une iframe :
X-Frame-Options: DENY
Protège contre : clickjacking.
Referrer-Policy
Contrôle les informations envoyées dans le header Referer :
Referrer-Policy: strict-origin-when-cross-origin
Protège contre : fuite d'informations sensibles dans les URLs.
Permissions-Policy
Contrôle l'accès aux fonctionnalités du navigateur :
Permissions-Policy: camera=(), microphone=(), geolocation=()
Désactive les accès non nécessaires à la caméra, micro, géolocalisation.
Récapitulatif
| Header | Protège contre | Valeur recommandée |
|---|---|---|
| CSP | XSS | default-src 'self' |
| HSTS | Downgrade, MITM | max-age=31536000; includeSubDomains |
| X-Content-Type-Options | MIME sniffing | nosniff |
| X-Frame-Options | Clickjacking | DENY |
| Referrer-Policy | Fuite d'info | strict-origin-when-cross-origin |
| Permissions-Policy | Accès non autorisé | Désactiver les features inutiles |
Implémentation Spring Security
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.headers(headers -> headers
.contentSecurityPolicy(csp -> csp
.policyDirectives("default-src 'self'; script-src 'self'"))
.httpStrictTransportSecurity(hsts -> hsts
.maxAgeInSeconds(31536000)
.includeSubDomains(true))
.frameOptions(frame -> frame.deny())
.contentTypeOptions(Customizer.withDefaults())
.referrerPolicy(referrer -> referrer
.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN))
.permissionsPolicy(permissions -> permissions
.policy("camera=(), microphone=(), geolocation=()"))
);
return http.build();
}
Vérification
Outils pour vérifier les headers en production :
curl -I https://mon-api.com— inspecter les headers de réponse- securityheaders.com — scan automatisé avec score
- les DevTools du navigateur (onglet Network → Response Headers)
À retenir
- les security headers sont une défense en profondeur, pas un remplacement de la validation
- CSP est le plus puissant mais aussi le plus complexe à configurer
- HSTS est indispensable dès que HTTPS est en place
- Spring Security configure certains headers par défaut, mais il faut les ajuster