본문 바로가기
🌷 Spring/개념

[SpringSecurity] @EnableWebSecurity, SecurityFilterChain 개념과 예시

by ._.sori 2025. 8. 28.

 

 

@EnableWebSecurity는
언제 쓰는걸까?

 

 

 

 

 

@EnableWebSecurity

  • 어노테이션을 등록하여 스프링 시큐리티를 활성화하고 웹 보안 설정을 구성하는데 사용한다.
  • 즉, 등록하면 보안과 관련된 빈을 사용할 수 있게 된다.
  • @EnableWebSercurity는 자동으로 스프링 시큐리티 필터 체인을 생성하고 웹 보안을 활성화한다.
  • 보통 @Configuration과 함께 사용한다.
  • 예전에는 WebSecurityConfigurerAdapter와 @EnableWebSecurity 조합이 기본이었다.
  • 지금은 WebSecurityconfigurerAdapter를 쓰지 않게되면서 SecurityFilterChain 빈을 직접 등록하는 방식이 표준이 되었다.

 

 

SecurityFilterChain

  • 실제 보안 규칙(인가/인증/CSRF/CORS 등)을 정의한 빈
  • 요청이 들어오면 가장 먼저 FilterChainProxy가 실행된다.
  • 이 Proxy가 들어온 요청 URL을 보고 어떤 SercurityFilterChain을 적용할지 고른다.
  • 인증(폼 로그인, JWT 토큰 검증, OAuth2 등), 인가(URL에 접근할 권한), CSRF(크로스 사이트 요청 위조 방지 결정), CORS(다른 도메인에서 요청을 허용할지), 세션관리, 헤더 설정 등을 구성 요소로 넣는다.

 

 

 


 

 

 

 

코드 예시

@Configuration
@EnableWebSecurity 
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                // CSRF 보호 끔, 개발 중이라서 꺼버렸어요
                .csrf(csrf -> csrf.disable())
                // 인가, URL에 대한 요청에 대해 누구나 접근 가능한 혹은 인증이 필요한지 정의
                .authorizeHttpRequests(authz -> authz
                        // 누구나 접근 가능하도록 허용함
                        .requestMatchers("/api/register").permitAll()
                        .requestMatchers("/api/login").permitAll()
                        .requestMatchers("/h2-console/**").permitAll()
                        .requestMatchers("/oauth/kakao").permitAll()
                        .anyRequest().permitAll() 
                )
                // 헤더 설정, H2(DB) 콘솔을 iframe으로 띄우기 위해 설정
                .headers(headers
                        -> headers.frameOptions(frameOptions -> frameOptions.disable()))
                // CORS 허용하겠다고 일단 정의하고, 실제 허용 목록은 별도 Bean을 제공한다는 것.
                .cors(cors -> {});
                
        return http.build();
    }
    
    // 비밀번호 해시 빈, 회원가입 시 해시 저장하고 로그인 시 해시 비교에 필요함.
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
백엔드와 프론트엔드를 나눠 개발하면서, 도메인 주소가 달라 생긴 문제를 해결하기 위해 SecurityConfig 파일을 설정했다. 그리고 데이터베이스와 패스워드 관련하여 생긴 문제도 해결했다.