Cross-Origin Headers in Spring Boot
COOP, COEP und CORP per OncePerRequestFilter konfigurieren -- für Cross-Origin-Isolation, SharedArrayBuffer-Zugriff und Spectre-Schutz.
Cross-Origin-Isolation in Spring Boot
Die drei Cross-Origin Header -- COOP (Opener-Policy), COEP (Embedder-Policy) und CORP (Resource-Policy) -- isolieren Ihren Browsing-Context und schuetzen gegen Spectre-Seitenkanalangriffe. Zusammen sind sie 30 von 166 Punkten im Wolf-Agents Web Security Check wert.
Spring Security bietet keine eingebaute DSL für Cross-Origin-Header. Sie benoetigen einen OncePerRequestFilter, der alle drei Header manuell setzt. Bei WebFlux-Anwendungen verwenden Sie stattdessen einen WebFilter. Die CORS-Konfiguration per CorsConfigurationSource muss mit den Cross-Origin-Headern abgestimmt werden.
Cross-Origin Header per Filter setzen
Erstellen Sie einen OncePerRequestFilter, der COOP, COEP und CORP auf jede Response setzt. Spring Security registriert @Component-Filter automatisch in der FilterChain. COOP same-origin isoliert den Browsing-Context, COEP require-corp erzwingt CORP auf allen eingebetteten Ressourcen.
// CrossOriginHeaderFilter.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 CrossOriginHeaderFilter
extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws Exception {
// Cross-Origin-Opener-Policy
response.setHeader(
"Cross-Origin-Opener-Policy",
"same-origin");
// Cross-Origin-Embedder-Policy
response.setHeader(
"Cross-Origin-Embedder-Policy",
"require-corp");
// Cross-Origin-Resource-Policy
response.setHeader(
"Cross-Origin-Resource-Policy",
"same-origin");
filterChain.doFilter(request, response);
}
}Wenn Sie SharedArrayBuffer benoetigen (z.B. für WebAssembly-Threads), müssen alle drei Header gesetzt sein. Ohne Cross-Origin-Isolation blockiert der Browser den Zugriff auf SharedArrayBuffer.
CORS-Konfiguration abstimmen
Die Spring-Security-CORS-Konfiguration per CorsConfigurationSource kontrolliert Cross-Origin-Requests auf Server-Seite. Die Cross-Origin-Header kontrollieren das Verhalten im Browser. Beide müssen aufeinander abgestimmt sein -- sonst erlaubt der Server Requests, die der Browser blockiert, oder umgekehrt.
// SecurityConfig.java -- CORS mit Cross-Origin Headers
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http)
throws Exception {
http.cors(cors -> cors
.configurationSource(corsConfigurationSource()))
.headers(headers -> headers
.frameOptions(fo -> fo.deny()));
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(List.of(
"https://example.com"));
config.setAllowedMethods(List.of(
"GET", "POST"));
config.setAllowedHeaders(List.of("*"));
UrlBasedCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}WebFlux-Alternative
In Spring WebFlux-Anwendungen verwenden Sie einen WebFilter statt OncePerRequestFilter. Die reaktive API nutzt ServerWebExchange und ServerHttpResponse. Die Header-Werte bleiben identisch.
// WebFlux: CrossOriginWebFilter.java
@Component
public class CrossOriginWebFilter
implements WebFilter {
@Override
public Mono<Void> filter(
ServerWebExchange exchange,
WebFilterChain chain) {
ServerHttpResponse response = exchange.getResponse();
HttpHeaders headers = response.getHeaders();
headers.set("Cross-Origin-Opener-Policy",
"same-origin");
headers.set("Cross-Origin-Embedder-Policy",
"require-corp");
headers.set("Cross-Origin-Resource-Policy",
"same-origin");
return chain.filter(exchange);
}
}Header verifizieren
Prüfen Sie alle drei Cross-Origin-Header mit curl. Alle drei müssen gesetzt sein, damit Cross-Origin-Isolation aktiv ist.
# Cross-Origin Headers pruefen
curl -sI http://localhost:8080 | grep -i cross-origin
# Erwartete Ausgabe:
cross-origin-opener-policy: same-origin
cross-origin-embedder-policy: require-corp
cross-origin-resource-policy: same-originHäufige Fehler bei Cross-Origin Headers in Spring Boot
CORS-Config kollidiert mit Cross-Origin-Headern
@CrossOrigin-Annotationen oder CorsConfigurationSource erlauben Cross-Origin-Requests, aber COEP require-corp blockiert Ressourcen ohne CORP-Header. Stellen Sie sicher, dass externe Ressourcen den Cross-Origin-Resource-Policy: cross-origin-Header setzen.
Payment-iFrames brechen mit COEP
Stripe, PayPal und andere Payment-Provider setzen keinen CORP-Header. Mit COEP require-corp werden deren iFrames blockiert. Verwenden Sie credentialless statt require-corp oder setzen Sie COEP nur auf Seiten ohne Payment-Widgets.
WebFlux verwendet andere Filter-API
In Spring WebFlux funktioniert OncePerRequestFilter nicht. Verwenden Sie stattdessen WebFilter mit ServerWebExchange. Die Servlet-basierte Filter-API ist in reaktiven Anwendungen nicht verfügbar.
SharedArrayBuffer funktioniert trotz Headern nicht
Alle drei Header müssen korrekt gesetzt sein. Fehlt ein Header, ist Cross-Origin-Isolation nicht aktiv. Prüfen Sie in den DevTools unter window.crossOriginIsolated ob die Isolation greift.
Compliance-Relevanz
Cross-Origin-Header schuetzen gegen Spectre-Seitenkanalangriffe und sind für moderne Webanwendungen mit sensiblen Daten essentiell.
Wie steht Ihre Domain bei Cross-Origin Headers?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.