Java/Spring Security

CORS 설정

마손리 2023. 6. 7. 20:16

CORS(Cross Origin Resource Sharing)

CORS란 서로 다른 출처의 요청이더라도 서버의 리소스를 사용할 수 있도록 해주는 설정이다.

 

항상 SecurityFilterChain에 csrf().disable() 만을 사용하다가 팀 프로젝트를 앞두고 좀더 보안이 강화된 CORS 설정이 필요할 것 같아 알아보게 되었다.

 

찾아낸 방법으로는 3가지가 있었다.

  1. Spring MVC의 Controller에 직접 CORS 설정
  2. Spring MVC에서 WebMvcConfigurer를 구현하는 설정 bean 등록
  3. 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