inblog logo
|
Rieul's Index
    Spring

    Spring Security CORS 비활성화: SecurityFilterChain

    Spring Security에서 CORS 비활성화 방법을 소개합니다. React와 Spring Boot 프로젝트에서 발생하는 CORS 오류를 해결하는 과정을 다룹니다.
    ImRieul's avatar
    ImRieul
    Mar 03, 2024
    Spring Security CORS 비활성화: SecurityFilterChain
    Contents
    문제: CORS 오류시도1: Spring Security에서 CORS 정책 비활성화시도2: 변경된 Spring Security 정책에 따른 해결심화: SecurityFilterChain 사용참고 링크
    2년 전 만들어놓은 프로젝트를 다시 찾아보면서 여러 문제를 맞이하고 있습니다.
    제 생각에는 AWS, Docker로 서버 세팅까지 해놨으니 다시 올리면 그대로 성공할 줄 알았는데요.
    급하게 만드느라고 고려하지 않은 것들이 문제로 드러났습니다. 이 문제도 동일합니다.
     
    • 프로젝트는 React, Spring boot로 프론트와 백엔드를 구분해서 만들었습니다.
    • AWS 프리티어를 모두 사용해서, Cloudtype을 사용했습니다.
    • Spring Security 의존성은 비밀번호 암호화를 위해 사용하고 있었습니다.
     

    문제: CORS 오류

    로컬에서 프론트엔드 서버와 백엔드 서버끼리 소통할 때는 문제가 없었는데, 서버에 올라가고 나서 CORS 정책으로 인해 요청이 차단되는 문제가 발생했습니다.
    이 문제는 이전에 해결한 뒤 Front - Back 서버를 분리하면서 만난 CORS 정책라는 제목으로 이 블로그에 정리해뒀습니다.
    @EnableJpaAuditing @SpringBootApplication public class ServerBackendApplication implements WebMvcConfigurer { publicstaticvoidmain(String[] args) { SpringApplication.run(ServerBackendApplication.class, args); } @OverridepublicvoidaddCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins( "http://localhost:3000", "https://web-advise-clothes-front-am952nlt1gbj1t.sel5.cloudtype.app" ) .allowedMethods("GET", "POST", "PUT", "DELETE"); } }
    이미 해결된 코드인데 왜 다시 똑같이 발생하는 걸까? 고민하며 찾아보니 Spring MVC과 Spring Security에서 CORS 설정이 따로 있는 것을 알게 되었습니다. 제 코드는 Spring MVC에서 Origin을 등록하는 정책이었습니다.
     

    시도1: Spring Security에서 CORS 정책 비활성화

    @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.cors().disable() // CORS 비활성화 시도 .httpBasic().disable() .csrf().disable(); } }
    httpBasic().disable(), csrf().disable()은 이전에 해놓은 설정이기 때문에, 위에 .cors().disable() 코드를 추가했습니다. 하지만 작동하지 않았습니다.
     

    시도2: 변경된 Spring Security 정책에 따른 해결

    이번엔 왜 disable이 되지 않는지 찾아본 결과, Spring 블로그에서 찾아볼 수 있었습니다. 아래 권장사항대로 Spring Security의 CORS를 비활성화 했습니다.
    @Override protected void configure(HttpSecurity http) throws Exception { http .cors(AbstractHttpConfigurer::disable) .httpBasic().disable() .csrf().disable(); }
    이후 배포하니 프론트 서버에서 CORS 정책으로 막히지 않게 되었습니다.
     

    심화: SecurityFilterChain 사용

    문제의 원인을 찾던 중 WebSecurityConfigurerAdapter를 설계에 결함이 있어 사용하지 않는다고 합니다. 이유는 아래와 같습니다.
    • 설정을 조용히 처리함
    • 보안 구성이 메서드 인수로 Bean을 전달하는 모범 사례를 따르지 않는다는 것. (종속성을 파악하기 어려움 등.)
    권장 사항에 따라 SecurityFilterChain 빈을 등록해서 Spring Security 설정을 했습니다.
    @Configuration @EnableWebSecurity public class SecurityConfig { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.cors(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable); returnhttp.build(); } }
     

    참고 링크

    1. 시도
      1. Spring Security - Lambda DSL
        Configuration Migrations
    1. 심화
      1. Spring Security without the WebSecurityConfigurerAdapter
        Deprecate WebSecurityConfigurerAdapter #10822
    Share article
    Contents
    문제: CORS 오류시도1: Spring Security에서 CORS 정책 비활성화시도2: 변경된 Spring Security 정책에 따른 해결심화: SecurityFilterChain 사용참고 링크

    Rieul's Index

    RSS·Powered by Inblog