Cross-Origin Headers in Spring Boot

COOP, COEP und CORP per OncePerRequestFilter konfigurieren -- für Cross-Origin-Isolation, SharedArrayBuffer-Zugriff und Spectre-Schutz.

Spring Boot · Schritt für Schritt

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.

1Schritt 1 von 4

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.javaProduktiv
// 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);
    }
}
SharedArrayBuffer erforderlich?

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.

2Schritt 2 von 4

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.javaProduktiv
// 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;
}
Der Wolf-Agents Web Security Check prüft alle drei Cross-Origin-Header und bewertet sie mit insgesamt bis zu 30 Punkten.
3Schritt 3 von 4

WebFlux-Alternative

In Spring WebFlux-Anwendungen verwenden Sie einen WebFilter statt OncePerRequestFilter. Die reaktive API nutzt ServerWebExchange und ServerHttpResponse. Die Header-Werte bleiben identisch.

CrossOriginWebFilter.javaWebFlux
// 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);
    }
}
4Schritt 4 von 4

Header verifizieren

Prüfen Sie alle drei Cross-Origin-Header mit curl. Alle drei müssen gesetzt sein, damit Cross-Origin-Isolation aktiv ist.

TerminalVerifizierung
# 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-origin

Hä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.

OWASP ASVS -- V14.5.3 fordert Cross-Origin-Isolation für Anwendungen mit sensiblen Daten und SharedArrayBuffer-Nutzung.
NIS2 -- Art. 21(e) fordert Sicherheit bei der Entwicklung und Wartung von Netz- und Informationssystemen.
BSI -- APP.3.1 empfiehlt aktuelle Security-Header zur Absicherung von Webanwendungen.

Wie steht Ihre Domain bei Cross-Origin Headers?

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