Spring Security - CORS 정책 지정 ( Global Config [ WebMvcConfigurer ] / Local Config [ @CrossOrigin ] )

TopOfTheHead·2026년 5월 30일

Spring Security

목록 보기
26/26

CORS 관련 Spring Security 흐름

브라우저
  ↓
Spring Security Filter Chain
  ↓
DispatcherServlet
  ↓
WebMvcConfigurer(CorsConfig)
  ↓
Controller
  • 필터 레벨 CORS 설정 : WAS에서 요청 수신 시 필터체인에 의해 CORS 처리 활성화 및 검증 수행

  • Spring MVC 레벨 CORS 설정 : Dispatcher Servlet 이후 WebMvcConfigurer에서 CORS 정책 설정
    WebMvcConfigurer에서 설정된 CORS 정책을 기반으로 필터 레벨에서 요청을 검증

필터 레벨에서 FilterChainCORS 관련 설정
SecurityFilterChain 관련 @Configuration 클래스에서 설정을 수행

Spring Security에서는 기본적으로 다른 Origin으로부터의 Cross-Origin Request를 차단
필터 레벨에서 CORS 관련 설정을 수행하지 않는 경우, Spring Security Filter에 의해 다른 출처브라우저 로부터의 요청을 차단

httpSecurity.authorizeHttpRequests(
      auth -> auth
      .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
      //
 )

요청인가검사를 수행하는 경우 Preflight Request에 대해 모두 허용하도록 설정.


httpsecurity객체.cors(콜백함수)
HttpRequest에 대한 CORS 정책을 지정하는 메서드
WebMvcConfigurer를 통한 CORS 정책을 지정하도록 설정이 가능

	@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity){
        return httpSecurity
                .cors(Customizer.withDefaults())
  				// ...
	}
  • httpSecurity객체.cors(cors-> cors.disable())
    필터레벨에서의 CORS 활성화를 차단하여 모든 출처로 부터의 요청을 허용
    운영환경에서는 반드시 지양해야하며 오직 개발 환경에서만 수행

  • httpSecurity객체.cors(Customizer.withDefaults())
    CORS에 관련된 Spring 기본 설정으로 설정하면서 CORS 활성화
    withDefaults()Customizer Class정적메서드

    。해당 기능 설정 시 Spring MVC 레벨에서의 WebMvcConfigurer에서 설정한 CORS 정책Spring Security가 참고 후 필터에서 검증을 통해 Cross-Origin Request요청 허용
    CORS 정책에서 설정된 Origin, Method, Header 등을 기반으로 요청검증허용

CORS Configuration 종류
Spring MVC 활용 시 Cross-Origin Request 허용하는 기법

전역으로 설정하는 Global ConfigurationLocal Configuration이 존재.

Global Configuration :
어플리케이션 내 모든 Controller , REST Controller에 설정된 CORS 정책을 일괄적으로 적용하도록 설정

  • WebMvcConfigurer를 통해 CORS 정책을 정의 후 Spring Bean로서 등록
    CORS 정책을 정의한 WebMvcConfigurer 구현체Spring Bean으로 등록 시 Spring Security가 참고 후 필터에서 요청을 검증
    addCorsMappings() 구현메서드익명클래스 방식으로 구현한 구현체 생성 후 Spring Bean으로 등록

    CORS ConfigurationWebMvcConfigurer의 instance를 Spring Bean으로 반환하는 @Bean Method 구현.
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class BasicAuthSecurityConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            // addCorsMappings()를 Override하여 작성하며
            // 매개변수로 전달된 CorsRegistry instance를 통해 Cross-Origin Request의 CORS Configuration 수행.
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**") // 모든 URL Pattern에 대하여 CORS 허용.
                        .allowedMethods("*") // 모든 HTTP Method에 대하여 CORS 허용
                        .allowedOrigins("http://localhost:3000") // ReactOrigin에 대해서만 CORS 허용.
						.allowedHeaders("*")
            			.allowCredentials(true)
                        .exposedHeaders("Authorization")
                        .maxAge(3600);
            }
        };
    }
 }

익명클래스 방식을 통해 addCorsMappings()오버라이딩하여 WebMvcConfigurer 인터페이스 구현체를 생성 및 Spring Bean으로 등록

WebMvcConfigurer
Spring MVC의 세부적인 Configuration사용자 정의하는 구현 메서드를 제공하는 인터페이스

Spring Boot은 기본적으로 Auto Configuration을 제공하지만, 세부설정이 필요할 경우 WebMvcConfigurer을 통해 정의.
인터페이스 구현체Spring Bean으로 등록하면서 CORS Configuration , Interceptor 추가 , Static Resource Mapping , View Controller Configuration를 수행

Security 설정을 수행한 WebMvcConfigurer 구현체Spring Bean으로 등록 시 Spring Security가 참고 후 필터에서 요청을 검증


WebMvcConfigurer 구현 메소드 종류

  • addCorsMappings(CorsRegistry registry)
    Spring에서 CORS 정책을 설정하는 WebMvcConfigurer 구현 메서드
    ▶ 특정 OriginCross-Origin Request어플리케이션컨트롤러에서 전역적으로 허용하도록 설정 가능

    CorsRegistry 객체를 매개변수로 가져오므로, 해당 CorsRegistry객체를 이용해 CorsRegistry의 Method를 활용하여 CORS정책을 설정.

CorsRegistry :
WebMvcConfigureraddCorsMappings() 구현메서드에 의해 Spring MVC에서 CORS 정책을 설정 시 사용하는 클래스
WebMvcConfigurer InterfaceaddCorsMappings(CorsRegistry registry) 메서드를 통해 CORS 정책을 지정


CorsRegistry Method
。해당 메서드를 통해 CORS 정책을 지정

  • CorsRegistry객체.allowedOrigins("Origin1", "Origin2" , ...)
    Spring Boot에서 CORS를 허용할 Origin을 지정하는 Method.

    CorsRegistry객체.allowedOrigins("http://localhost:3000")
    。특정 Origin에 대해서만 CORS 허용.

    CorsRegistry객체.allowedOrigins("*")
    。모든 Origin에 대해서 CORS 허용.
    Origin 화이트리스트 방식을 통해 지정해야하므로, 반드시 지양

  • CorsRegistry객체.addMapping("/URLpattern")
    Origin을 기반으로 Cross-Origin RequestCORS를 허용할 URL 패턴을 지정.

    ex ) CorsRegistry객체.addMapping("/api/**") :
    Origin/api/ 로 시작하는 모든 Cross-Origin Request에 대하여 CORS 허용

  • CorsRegistry객체.allowedMethods("GET", "POST" , ...)
    Cross-Origin Request에서 CORS를 허용할 HTTP Method 지정.
    "GET" , "POST" , "PUT" , "DELETE" , "PATCH"

  • CorsRegistry객체.allowedHeaders("Content-Type" , "Authorization" , ...)
    Cross-Origin Request에서 CORS를 허용할 Header를 지정하는 Method.
    CorsRegistry객체.allowedHeaders("*") : 모든 header에 대해서 CORS 허용.

  • CorsRegistry객체.allowCredentials(Boolean)
    Cookie, 세션 등의 인증정보를 포함한 Cross-Origin Request에 대하여 CORS 허용여부 설정.
    쿠키 / 세션을 사용하지 않는 경우 설정하지 않아도 된다.
    ex ) 인증 헤더를 사용하는 JWT 토큰

    Refresh TokenHttpOnly 쿠키로 전달 및 요청하는 경우 반드시 활성화

    CorsRegistry객체.allowCredentials(true) 설정 시 CorsRegistry객체.allowedOrigins("*")를 사용할 수 없으며, 반드시 특정 Origin만 지정하여 설정해야한다.

  • CorsRegistry객체.exposedHeaders("Authorization")
    브라우저JavascriptAuthorization Header에 포함된 데이터를 읽을 수 있도록 설정.
    브라우저CORS에 의해 기본적으로 HTTP Response헤더JS에 의해 읽을 수 없도록 설정하므로, 허용하도록 설정해야한다.

    。주로 JWT 토큰HTTP ResponseAuthorization Header로 응답 시 사용

  • CorsRegistry객체.maxAge(초)
    CORSPreflight 요청 결과브라우저가 얼마나 캐싱할지 설정.
    캐싱결과를 기준으로 동일한 Origin에서 동일한 요청 메서드를 사용해 요청Preflight Request를 생략함으로써 성능 향상

Local Configuration :
。특정 Controller , REST Controller@CrossOrigin을 선언하여 Cross Origin Request를 허용설정.
Global Configuration와 달리 특정 Controller에만 국한.

  • @CrossOrigin
    Spring Framework에서 CORS를 허용하는 용도의 어노테이션으로 origins를 통해 정의된 도메인으로부터의 Cross-Origin Request의 허용여부를 결정.
    @Controller , @RestController가 선언된 Class 앞에 정의하여 origins 속성에 의해 허용된 도메인으로부터 해당 ControllerAPI호출CORS를 허용.

    origins="URL" 속성을 통해서 Cross-Origin Request를 허용할 특정 도메인을 지정.
    origins 속성을 지정하지 않는 경우 모든 도메인으로부터의 Cross-Origin Request를 허용.
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
            // Controller Class에 Cross Origin 선언.
@CrossOrigin(origins="http://localhost:3000")
public class Security_Filter_Chain {
    @GetMapping(path="/todos")
    public List<Todo> returnTodos(){
        return TODOS;
    }
}
profile
공부기록 블로그

0개의 댓글