CORS(Cross Origin Resource Sharing)
CORS란 서로 다른 출처의 요청이더라도 서버의 리소스를 사용할 수 있도록 해주는 설정이다.
항상 SecurityFilterChain에 csrf().disable() 만을 사용하다가 팀 프로젝트를 앞두고 좀더 보안이 강화된 CORS 설정이 필요할 것 같아 알아보게 되었다.
찾아낸 방법으로는 3가지가 있었다.
- Spring MVC의 Controller에 직접 CORS 설정
- Spring MVC에서 WebMvcConfigurer를 구현하는 설정 bean 등록
- Spring Security에서 설정 bean 등록
방법 1. Spring MVC의 Controller에 직접 CORS 설정
제일 직관적인 방법이다.
@RestController
@CrossOrigin(origins = "http://example.com:80", methods = RequestMethod.GET)
public class MemberController{
...
...
}
특정 컨트롤러에 @CrossOrigin 에너테이션을 사용하여 명시해준다.
만약 어트리뷰션을 추가하지 않는다면 모든 origin에서 접근이 가능하다.
방법 2. Spring MVC에서 WebMvcConfigurer를 구현하는 설정 bean 등록
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Oberride
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/v1/**")
.allowedOrigins("http://example.com:80")
.allowedMethods("GET","POST");
}
}
위와 같이 WebMvcConfigurer를 구현하는 설정 bean을 등록하여 모든 경로의 CORS 설정을 한곳에서 관리해줄 수 있다.
방법 3. Spring Security에서 설정 bean 등록
@Configuration
public class SecurityConfiguration {
private final JwtTokenizer jwtTokenizer;
private final CustomAuthorityUtils authorityUtils;
private final MemberAuthenticationSuccessHandler memberAuthenticationSuccessHandler;
public SecurityConfiguration(JwtTokenizer jwtTokenizer, CustomAuthorityUtils authorityUtils, MemberAuthenticationSuccessHandler memberAuthenticationSuccessHandler) {
this.jwtTokenizer = jwtTokenizer;
this.authorityUtils = authorityUtils;
this.memberAuthenticationSuccessHandler = memberAuthenticationSuccessHandler;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http
...
...
.cors(Customizer.withDefaults()) // 혹은 .cors()
...
...
return http.build();
}
@Bean
CorsConfigurationSource corsConfiguration(){
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedOrigins(List.of("http://example.com:80"));
corsConfiguration.setAllowedMethods(List.of("GET","POST","PATCH","DELETE"));
corsConfiguration.setAllowedHeaders(List.of("*"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
}
CorsConfigurationSource를 반환하는 메서드를 bean으로 등록하고 필요에 맞게 설정해준다.
이후 HttpSecurity.cors() 혹은 .cors(Customizer.withDefaults)) 로 SecurityFilterChain에 설정해주면 끝이다.
'Java > Spring Security' 카테고리의 다른 글
JWT (0) | 2023.05.17 |
---|---|
DelegatingPasswordEncoder (0) | 2023.05.15 |
SecurityFilterChain과 AuthenticationProvider 구현 (0) | 2023.05.13 |
Spring Security의 인증 처리 흐름 (0) | 2023.05.13 |
Servlet Filter 구현 (0) | 2023.05.13 |