[Spring Security] 초기화 시 HttpSecurity, WebSecurity 역할

심현민·2025년 9월 12일
1

Spring

목록 보기
14/18
post-thumbnail

오늘은 우리가 익숙하게 사용하는 HttpSecurity와, 뒤에서 모든 것을 조율하는 WebSecurity가 초기화 과정에서 어떤 역할을 하는지 파헤쳐보려 합니다. "그냥 설정하면 잘 되던데?"라고 생각하셨다면, 이번 글을 통해 그 뒤에 숨겨진 탄탄한 구조를 함께 엿보는 재미를 느끼실 수 있을 겁니다.

HttpSecurity

HttpSecurity는 Spring Security 설정을 위한 일종의 빌더(Builder)입니다. 우리는 이 객체를 통해 "어떤 URL에 어떤 권한이 필요한지", "어떤 필터를 추가할지", "로그인/로그아웃 처리는 어떻게 할지"와 같은 구체적인 보안 규칙을 코드로 작성합니다.

주요 역할은 다음과 같습니다.

  • 메서드 체이닝: authorizeHttpRequests(), addFilterBefore() 등 직관적인 메서드를 체인 형식으로 호출하여 보안 정책을 설정합니다.
  • SecurityFilterChain 생성: 설정이 완료된 후 build() 메서드를 호출하면, 지금까지 정의된 내용을 바탕으로 SecurityFilterChain 객체를 생성하여 Spring 컨테이너에 빈(Bean)으로 등록합니다.

아래 코드는 각각 /api/**/admin/** 경로에 대해 서로 다른 보안 정책을 가진 SecurityFilterChain 빈을 2개 생성하는 예시입니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
        http
            .securityMatcher("/api/**") 
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            // ... API 관련 필터 및 설정
        return http.build();
    }

    @Bean
    public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception {
        http
            .securityMatcher("/admin/**") 
            .authorizeHttpRequests(auth -> auth.anyRequest().hasRole("ADMIN"))
            // ... Admin 관련 필터 및 설정
        return http.build();
    }
}

여기서 중요한 점은, HttpSecurity의 역할은 SecurityFilterChain이라는 '설계도'를 만드는 것까지라는 점입니다. 이 설계도를 실제로 적용하는 것은 다른 컴포넌트의 몫입니다.


SecurityFilterChain

SecurityFilterChainHttpSecurity가 만들어낸 결과물로, 특정 경로에 적용될 필터들의 체인(목록)매칭 조건을 담고 있는 객체입니다.

SecurityFilterChain의 핵심 요소는 두 가지입니다.

  • List<Filter> getFilters(): 해당 요청이 매칭되었을 때 실제로 동작할 필터들의 목록입니다. CorsFilter,UsernamePasswordAuthenticationFilter 등 우리가 아는 대부분의 시큐리티 필터가 여기에 포함됩니다.

  • boolean matches(HttpServletRequest request): 들어온 요청이 이 필터 체인에 의해 처리되어야 하는지를 판단하는 메서드입니다. http.securityMatcher()로 지정한 경로와 일치하는지를 확인합니다.

즉, SecurityFilterChain은 "이 조건에 맞는 요청이 오면, 이 필터 목록을 순서대로 실행해라"라는 하나의 완성된 보안 정책 단위입니다.


WebSecurityFilterChainProxy

HttpSecurity가 각자의 설계도를 만들었다면, 이제 누군가가 이 설계도들을 모아 실제 보안 시스템을 구축해야 합니다. 바로 그 역할을 WebSecurityFilterChainProxy가 담당합니다.

  1. 수집: Spring Security가 초기화될 때, WebSecurity는 애플리케이션에 존재하는 모든 SecurityFilterChain 빈을 수집합니다. 여러 개의 보안 정책 묶음(설계도)을 한데 모으는 총괄 감독의 역할을 합니다.

  2. 건축 및 등록: WebSecurity는 수집한 SecurityFilterChain 목록을 사용하여 단 하나의 필터, 바로 FilterChainProxy를 생성합니다. 이 FilterChainProxy가 Spring Security의 실질적인 시작점으로, 서블릿 컨테이너에 등록되는 유일한 필터입니다.

FilterChainProxy의 동작 방식은 다음과 같습니다.

모든 클라이언트 요청은 가장 먼저 FilterChainProxy를 통과합니다. FilterChainProxy는 자신이 가지고 있는 SecurityFilterChain 목록을 순서대로 순회하며 각 체인의 matches() 메서드를 호출합니다.

matches 메서드는 한마디로 다음 문장과 같이 동작합니다.
"이 요청이 당신이 처리할 요청인가요?"

이를 통해 match 되는 즉, 가장 먼저 true를 반환하는 SecurityFilterChain을 찾으면, 해당 체인에 속한 필터들을 실행하고 나머지 체인들은 더 이상 확인하지 않습니다.


역할 요약 및 핵심

Spring Security의 초기화 과정은 각 컴포넌트의 역할이 명확하게 나뉜 잘 짜인 위임 구조입니다.

  • HttpSecurity: 개별 보안 정책을 정의
  • SecurityFilterChain: HttpSecurity가 만들어낸, 필터 목록과 매칭 조건을 담고 있음
  • WebSecurity: 모든 SecurityFilterChain을 모아 FilterChainProxy를 생성
  • FilterChainProxy: 모든 요청을 가장 먼저 받아 적절한 SecurityFilterChain에 작업을 위임

이 구조를 이해하면, 복잡한 보안 요구사항을 설정하거나 문제가 발생했을 때 어디를 살펴봐야 할지 명확한 그림을 그릴 수 있습니다.

profile
혼자 성장하는 것보다 함께 성장하는 것을 선호합니다.

0개의 댓글