Erweiterte Security Header in Spring Boot

Origin-Agent-Cluster, X-DNS-Prefetch-Control und weitere Header per OncePerRequestFilter setzen -- für maximale Security-Haertung.

Spring Boot · Schritt für Schritt

Erweiterte Security Header in Spring Boot

Neben den Standard-Security-Headern gibt es erweiterte Header, die zusaetzliche Schutzmechanismen bieten: Origin-Agent-Cluster für Prozessisolation, X-DNS-Prefetch-Control gegen DNS-Leak und X-Permitted-Cross-Domain-Policies gegen Flash/PDF-Angriffe. Zusammen sind sie 4 von 166 Punkten im Wolf-Agents Web Security Check wert.

Spring Security bietet keine eingebaute DSL für diese Header. Sie benoetigen einen OncePerRequestFilter, der alle erweiterten Header auf jede Response setzt. Am besten kombinieren Sie alle Custom-Header in einem einzigen Filter, um die FilterChain uebersichtlich zu halten.

1Schritt 1 von 3

OncePerRequestFilter für erweiterte Header

Erstellen Sie einen OncePerRequestFilter, der alle erweiterten Header setzt. Origin-Agent-Cluster: ?1 aktiviert die Prozessisolation im Browser, X-DNS-Prefetch-Control: off verhindert DNS-Prefetching, das IP-Adressen an Dritte leaken kann.

AdvancedHeaderFilter.javaProduktiv
// AdvancedHeaderFilter.java
package com.example.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.stereotype.Component;

@Component
public class AdvancedHeaderFilter
        extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain) throws Exception {

        // Origin-Agent-Cluster: Prozessisolation
        response.setHeader(
            "Origin-Agent-Cluster",
            "?1");

        // X-DNS-Prefetch-Control: DNS-Prefetch steuern
        response.setHeader(
            "X-DNS-Prefetch-Control",
            "off");

        // X-Download-Options: IE Download-Schutz
        response.setHeader(
            "X-Download-Options",
            "noopen");

        // X-Permitted-Cross-Domain-Policies
        response.setHeader(
            "X-Permitted-Cross-Domain-Policies",
            "none");

        filterChain.doFilter(request, response);
    }
}
Structured Field Values

Der Wert von Origin-Agent-Cluster ist ?1 (Structured Field Boolean). Dies ist keine normale Header-Syntax -- der Browser erwartet exakt dieses Format.

2Schritt 2 von 3

Zusammenspiel mit Spring Security DSL

Spring Security setzt einige Header automatisch per DSL: X-Content-Type-Options, X-Frame-Options, HSTS und Referrer-Policy. Die erweiterten Header müssen per OncePerRequestFilter ergaenzt werden. Beide Mechanismen arbeiten zusammen -- der Filter überschreibt keine Spring-Security-Header.

SecurityConfig.javaProduktiv
// SecurityConfig.java -- Spring Security Built-in Header
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http)
        throws Exception {
    http.headers(headers -> headers
        // Spring Security Built-in Header (bereits Default)
        .contentTypeOptions(Customizer.withDefaults())
        .frameOptions(fo -> fo.deny())
        .httpStrictTransportSecurity(hsts -> hsts
            .includeSubDomains(true)
            .maxAgeInSeconds(31536000))
        .referrerPolicy(rp -> rp.policy(
            ReferrerPolicyHeaderWriter.ReferrerPolicy
                .STRICT_ORIGIN_WHEN_CROSS_ORIGIN))
        // Fuer erweiterte Header: AdvancedHeaderFilter
    );
    return http.build();
}
Der Wolf-Agents Web Security Check prüft alle erweiterten Header und bewertet sie mit insgesamt bis zu 4 Punkten.
3Schritt 3 von 3

Produktions-Filter mit allen Headern

Kombinieren Sie alle erweiterten Header in einem produktionsoptimierten Filter mit @Profile("prod"). So können Sie in der Entwicklung eine lockerere Konfiguration verwenden, während die Produktion maximal gehaertet ist.

ProdHeaderFilter.javaProduktiv
// Profil-basierte Header-Konfiguration
@Component
@Profile("prod")
public class ProdHeaderFilter
        extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain) throws Exception {

        // Alle erweiterten Header auf einmal
        response.setHeader("Origin-Agent-Cluster",
            "?1");
        response.setHeader("X-DNS-Prefetch-Control",
            "off");
        response.setHeader("X-Download-Options",
            "noopen");
        response.setHeader(
            "X-Permitted-Cross-Domain-Policies",
            "none");

        // Cross-Origin Header (siehe Kapitel)
        response.setHeader(
            "Cross-Origin-Opener-Policy",
            "same-origin");
        response.setHeader(
            "Cross-Origin-Embedder-Policy",
            "require-corp");
        response.setHeader(
            "Cross-Origin-Resource-Policy",
            "same-origin");

        filterChain.doFilter(request, response);
    }
}
4Verifizierung

Header verifizieren

Prüfen Sie alle erweiterten Header per curl. Alle vier Header müssen gesetzt sein.

TerminalVerifizierung
# Erweiterte Header pruefen
curl -sI http://localhost:8080 | grep -iE \
  "origin-agent|x-dns|x-download|x-permitted"

# Erwartete Ausgabe:
origin-agent-cluster: ?1
x-dns-prefetch-control: off
x-download-options: noopen
x-permitted-cross-domain-policies: none

Häufige Fehler bei erweiterten Headern in Spring Boot

Origin-Agent-Cluster Wert falsch formatiert

Der Wert muss ?1 sein (Structured Field Boolean), nicht true oder 1. Falsche Werte werden vom Browser ignoriert und die Prozessisolation greift nicht.

X-DNS-Prefetch-Control bricht Performance

Das Deaktivieren von DNS-Prefetching erhoet die Latenz beim ersten Request zu externen Domains. Waegen Sie Sicherheit gegen Performance ab -- für Anwendungen ohne externe Ressourcen ist off optimal.

Mehrere Filter setzen denselben Header

Wenn mehrere OncePerRequestFilter den gleichen Header setzen, überschreibt der letzte Filter den Wert. Konsolidieren Sie alle Custom-Header in einem einzigen Filter.

Filter-Reihenfolge nicht beachtet

Die Reihenfolge von Filtern in der SecurityFilterChain beeinflusst, welche Header gesetzt werden. Verwenden Sie @Order oder FilterRegistrationBean für eine deterministische Reihenfolge.

Compliance-Relevanz

Erweiterte Security Header vervollständigen die Header-Haertung und werden von Security-Scannern als Best Practice bewertet.

OWASP ASVS -- V14.4 fordert umfassende Security-Header-Konfiguration für alle Webanwendungen.
NIS2 -- Art. 21(e) fordert Sicherheit bei Entwicklung und Wartung von Netz- und Informationssystemen.
BSI -- APP.3.1 empfiehlt die Konfiguration aller verfügbaren Security-Header für maximalen Schutz.

Wie steht Ihre Domain bei Erweiterte Header?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.