Backend/공부,개념

[Spring Boot] @configuration과 WebMvcConfigurer의 addCorsMapping

지수쓰 2021. 8. 26. 00:33
반응형

TIL 42일차 

cross origin 설정을 해줄 때, 전역적으로 config클래스를 만들어 설정해줄 수 있다.
그리고 앞으로 spring security를 사용하게 될 때도 config파일을 작성했던 기억이 있는데 예전에 할땐 너무 베끼듯이 사용해서 작은 단위라도 어노테이션이나 사용하는 인터페이스의 의미를 알고 넘어가보려고 한다!


@Configuration vs @Component

@Component는 개발자가 직접 작성한 클래스를 bean으로 등록하고자할 때 사용한다.

 

@Configuration은 @Component를 포함하는데, 외부 라이브러리 또는 내장 클래스를 bean으로 등록하고자할 때, 1개이상의 @Bean을 제공하는 클래스에 붙여 사용한다.

 

WebMvcConfigurer

WebMvcConfigurer는 inteface이다.

@EnableWebMvc를 통해 Spring MVC를 위한 커스터마이즈드된 java-based configuration을 정의한다.

addCorsMapping(CorsRegistry registry)

since version : 스프링 4.2

global corss origin request process를 설정한다.

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8080")
                .allowedOrigins("http://localhost:8080");
    }
}
  • addMapping은 작성한 controller의 mapping의 패턴을 설정해준다.
  • allowedOrigins은 요청을 허용하는 클라이언트의 주소이다.
    • return값이 CorsRegistration이므로 chaining으로 설정해줄 수 있다.
CorsRegistration addMapping(String pathPattern)Enable cross-origin request handling for the specified path pattern.
   
CorsRegistration allowCredentials(boolean allowCredentials)Whether the browser should send credentials, such as cookies along with cross domain requests, to the annotated endpoint.
CorsRegistration allowedHeaders(String... headers)Set the list of headers that a pre-flight request can list as allowed for use during an actual request.
CorsRegistration allowedMethods(String... methods)Set the HTTP methods to allow, e.g.
CorsRegistration allowedOriginPatterns(String... patterns)Alternative to allowedOrigins(String...) that supports more flexible patterns for specifying the origins for which cross-origin requests are allowed from a browser.
CorsRegistration allowedOrigins(String... origins)Set the origins for which cross-origin requests are allowed from a browser.
CorsRegistration combine(CorsConfiguration other)Apply the given CorsConfiguration to the one being configured via CorsConfiguration.combine(CorsConfiguration) which in turn has been initialized with CorsConfiguration.applyPermitDefaultValues().
CorsRegistration exposedHeaders(String... headers)Set the list of response headers other than "simple" headers, i.e.
protected CorsConfiguration getCorsConfiguration()
protected String getPathPattern()
CorsRegistration maxAge(long maxAge)Configure how long in seconds the response from a pre-flight request can be cached by clients.

webMvcConfigurer와 config와 관련되어 @EnableWebMvc 어노테이션이 많이 나오는 것 같아서 알아보았다. 

@EnableWebMvc

이 어노테이션을 사용하면 WebMvcConfigurer타입의 빈을 이용해 mvc 설정을 추가로 생성할 수 있다.


Test

@Configuration @Bean, @EnableWebMvc중 cors를 설정해줄 때 지금 상태에서 기본적으로 필요한 어노테이션이 뭔지 파악이 되지 않아서 임시 node 서버를 만들어 요청을 보내보았다.

일단 아무 설정도 안해주면 CORS에러가 생긴다.

ccess to XMLHttpRequest at 'http://localhost:8080/items' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
App.js:13 Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:84)

OK

@CrossOrigin(origins = "*", allowCredentials = "false")
@RequestMapping("/items")
public class ItemController {
}
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8080")
                .allowedOrigins("http://localhost:8080")
                .allowedOrigins("http://localhost:3000")
                .allowCredentials(true);
    }
}

Fail

@CrossOrigin(origins="http://localhost:3000",allowCredentials = "*")
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8080")
                .allowedOrigins("http://localhost:8080");
    }
}

@Configuration이 있어도 없어도 이 위에 @CorssOrigin을 붙이는건 실패한다.

@Crossorigin은 @Controller에 함께 추가하던지 , 전역적인 설정이 필요하면 @Configuration어노테이션을 붙인 config파일로 설정해야할 것 같다.

public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8080")
                .allowedOrigins("http://localhost:8080")
                .allowedOrigins("http://localhost:3000")
                .allowCredentials(true);
    }
}
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://127.0.0.1:8080")
                .allowedOrigins("http://localhost:8080")
                .allowedOrigins("http://localhost:3000")
                .allowCredentials(true);
    }
}

@Configuration이 없어서 실패했다.

 

@EnableWebMvc가 import하는 메소드들을 bean으로 만들어주는데, 이를 커스터마이징 하고싶을 땐 WebMvcConfiguer를 implements해서 추가할 수 있다.

기존 설정된 bean 설정을 유지하고, 기능을 단순히 추가할 때는 WebMvcConfigurer를 구현하고 @Configuration 을 추가한 클래스를 만들면 된다.

 

기존과 다르게 Spring MVC를 제어하려한다면 @EnableWebMvc를 추가하면 된다.



지금 필요한 정도만 파악해보았는데, spring의 구조와 mvc패턴을 좀 더 깊게 공부해봐야겠다.

출처