TIL

CORS

SOP (Same-Origin Policy)

CORS 동작 과정

시나리오 1 - Preflight

시나리오 2 - Simple Request

일반적으로 Rest API 방식으로 Json 데이터를 주고 받는 경우가 많기에 Preflight 방식이 대부분 사용된다고 보면 된다.

시나리오 3 - Credentialed Request

Spring 서버에서 CORS 허용하기

스프링 MVC에서의 설정


@Configuration
public class WebConfig implements WebMvcConfigurer {
   
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8080", "http://localhost:8081")
                .allowedMethods("GET", "POST")
                .allowCredentials(true)
                .maxAge(3000); 
    }
}

스프링 시큐리티 사용 시 설정

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .cors()
                .configurationSource(corsConfigurationSource())    

        // ...
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.setAllowedOriginPatterns(List.of(corsAllowedOrigins.split(",")));
        corsConfig.setAllowedMethods(List.of("HEAD","POST","GET","DELETE","PUT", "OPTIONS"));
        corsConfig.setAllowedHeaders(List.of("*"));
        corsConfig.setAllowCredentials(true);
        corsConfig.setExposedHeaders(List.of(HttpHeaders.LOCATION, HttpHeaders.SET_COOKIE));

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);
        return source;
    }

CORS 테스트 해보기

curl \
--verbose \
--request OPTIONS \
'http://localhost:8080/api/test' \
--header 'Origin: http://localhost:3000' \
--header 'Access-Control-Request-Headers: Origin, Accept, Content-Type' \
--header 'Access-Control-Request-Method: DELETE'

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F#%F0%9F%92%AC_%EA%B2%B0%EA%B5%AD_cors_%ED%95%B4%EA%B2%B0%EC%B1%85%EC%9D%80%EC%84%9C%EB%B2%84%EC%9D%98%ED%97%88%EC%9A%A9%EC%9D%B4_%ED%95%84%EC%9A%94