Aller au contenu

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

Voir aussi