Backend/Spring

[SpringBoot] CORS 설정

땅지원 2023. 1. 24. 22:56

CORS(Cross Origin Resource Sharing)

Origin 이 다른 경우에 자원을 주고 받을 수 있도록 하는 http 통신 프로토콜

요청하는 클라이언트와 응답해야하는 서버의 Origin 이 다른 경우 CSRF(Cross-Site Request Forgery)

 XSS(Cross-Site Scripting) 같은 공격에 취약하기 때문에, 특정 Origin 과 request method 에만 요청을 허용하기 위함이다.

 

CORS 정책 설정은 Spring MVC 와 Spring Security 두 프레임워크에서 모두 설정이 가능하다.

 

둘 중 하나만 설정해도 충분한데, 가장 중요한 점은 Spring Security 가 가장 앞단에서 사용자 요청을 처리하기 때문에, Spring Security 에서 cors 를 활성화 시키자

 

 

1. Spring MVC

Spring MVC에서 CORS를 적용하는 방법은 크게 총 2가지로 나뉜다.

  1. 부분적으로 컨트롤러에서 CORS를 설정하는 방법 (Annotation based)
  2. 전역적으로 Spring MVC 설정에서 CORS를 설정하는 방법

 

Handler 메소드에 @CrossOrigin 애노테이션을 붙이는 방법
@RestController
@RequestMapping("/account")
public class AccountController {
 
    @CrossOrigin
    @RequestMapping(method = RequestMethod.GET, path = "/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
 
    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

 

JavaConfig를 통해 CORS 전역 설정(WebConfiguration.java)
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
                .allowedOrigins("http://www.example.com")
                .allowedMethods("*")
                .allowCredentials(false)
                .maxAge(3000);
    }
}

 

2. Spring Security

Spring Security에서 CORS를 다루는 가장 확실하고 쉬운 방법은 CorsFilter를 사용하는 것이다. 사용자는 다음과 같이 CorsConfigurationSource를 제공하여 CorsFilter를 Spring Security와 통합 할 수 있다.

Spring Security 사용시 CORS에 걸리지 않으려면 Authentication Filter 인증 보다 앞단계의 필터/인터셉터에서 path 검증로직이 일어나야만 한다.

 

The CORS configuration in Spring Security
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();

        configuration.addAllowedOrigin("http://localhost:3000");
        configuration.addAllowedOrigin("https://test.ssafy.io:3000");
        configuration.addAllowedOrigin("https://test.ssafy.io");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return source;
    }
}