Erweiterte Security Header in Spring Boot
Origin-Agent-Cluster, X-DNS-Prefetch-Control und weitere Header per OncePerRequestFilter setzen -- für maximale Security-Haertung.
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.
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.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);
}
}Der Wert von Origin-Agent-Cluster ist ?1 (Structured Field Boolean). Dies ist keine normale Header-Syntax -- der Browser erwartet exakt dieses Format.
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.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();
}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.
// 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);
}
}Header verifizieren
Prüfen Sie alle erweiterten Header per curl. Alle vier Header müssen gesetzt sein.
# 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: noneHä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.
Wie steht Ihre Domain bei Erweiterte Header?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.