반응형
요약: Filter를 사용해서 CORS 문제를 해결하였음
1. WebMvcConfigure 상속
- 결과: CORS 문제를 해결하지 못하였다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
corsRegistry.addMapping("/**")
// .allowedOrigins("http://localhost:3000")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
2. Spring Security
- 검색 결과, Spring Security를 프로젝트에서 사용 중이면 WebMvcConfigure를 상속한 1번 코드 부분이 실행되지 않는다고 한다.
- 결과: CORS 문제를 해결하지 못하였다.
@Configuration
@EnableWebSecurity // Spring Security Filter 가 Spring Filter Chain 에 등록이 된다.
public class SecurityConfig { // WebSecurityConfigurerAdapter is deprecated
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
// Security 는 기본적으로 세션을 사용
// 여기서는 세션을 사용하지 않기 때문에 세션 설정을 Stateless 로 설정
http
.httpBasic().disable()
.authorizeRequests()
.mvcMatchers(HttpMethod.OPTIONS, "/**").permitAll() // Preflight Request 허용해주기
.and()
.cors().configurationSource(corsConfigurationSource())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// form 기반의 로그인에 대해 비활성화
.formLogin().disable();
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("http://localhost:3000");
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
3. Filter 사용
- 결과: CORS 문제를 해결하였다.
@Slf4j
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomCorsFilter extends OncePerRequestFilter {
// CorsFilter 가 이미 Spring Security 에 존재하므로, 구분하기 위해 'Custom' 을 붙임
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
log.info(">> CustomCorsFilter is called");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization, x-xsrf-token");
// allow cors preflight
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(request, response);
}
}
}
CustomCorsFilter와 WebMvcConfig에서 관련 코드들을 추가해서 해결.
- 처음에는
CorsFilter
로 필터 명칭을 사용하려고 하였으나, Spring Security의 Filter 중 이미CorsFilter
가 존재해서 중복을 방지하기 위해 명칭을CustomCorsFilter
로 사용.- 다른 블로그를 참고하니, 보통 WebMvcConfig만 CORS를 설정하면 되던데, 나의 경우 Filter를 제외하면 UserControllerTest에서 오류가 발생해서 두 부분을 모두 추가함.
- 사실상
CustomCorsFilter
에서 CORS를 해결해주는 것으로 보이며, 이 부분을 주석처리한 뒤 테스트하면 CORS 이슈가 발생한다. - https://github.com/Moojun/cors-test-repo 를 통해 CORS 여부를 테스트 가능하다.
반응형
'멘질멘질] 2023 졸업 프로젝트' 카테고리의 다른 글
Junit5] 테스트에서 *.properties 정보 읽어오지 못하는 경우 해결 방법 (0) | 2023.06.13 |
---|---|
JPA Repository Test] @SpringBootTest vs @DataJpaTest (0) | 2023.06.09 |
Spring Boot] 프로젝트를 진행하는 과정에서 원칙 정리 (0) | 2023.06.09 |
GitHub Action, Docker, EC2를 사용한 Spring Boot 프로젝트 배포 자동화 (0) | 2023.06.09 |
AWS] 시작 전 초기 세팅 (0) | 2023.06.09 |