[Spring Boot] @configuration과 WebMvcConfigurer의 addCorsMapping
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패턴을 좀 더 깊게 공부해봐야겠다.
출처
- docs.spring.io WebMvcConfigurer
- tistory pangture @EnableWebMvc와 WebMvcConfiguer
- gitbook incheol @EnableWebMvc
- tistory xxxelppa Spring Web MVC 설정 @EnableWebMvc, WebMvcConfigurer