본문으로 건너뛰기
Advertisement

11.1 시큐리티 구조와 필터 체인 개요

스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 인중(Authentication)인가(Authorization) 를 담당하는 강력한 프레임워크입니다. 스프링 시큐리티의 핵심 동작 원리는 서블릿 필터(Servlet Filter) 체인을 기반으로 합니다.

1. 인증(Authentication) vs 인가(Authorization)

보안의 가장 기초가 되는 두 개념입니다.

  • 인증(Authentication):"당신은 누구인가?"를 확인하는 과정 (로그인)
  • 인가(Authorization):"당신은 이 자원에 접근할 권한이 있는가?"를 확인하는 과정 (권한 제어)

2. 보안 필터 체인 (Security Filter Chain)

스프링 시큐리티는 여러 개의 필터가 사슬(Chain)처럼 연결되어 요청을 가로채고 처리합니다.

  • FilterChainProxy: 스프링 시큐리티의 핵심 진입점으로, 여러 SecurityFilterChain 중에서 요청에 맞는 체인을 선택합니다.
  • SecurityFilterChain: 특정 URI 패턴으로 들어오는 요청에 대해 적용될 필터들의 목록입니다.

주요 기본 필터들

  1. SecurityContextPersistenceFilter:SecurityContextRepository에서 SecurityContext를 로드하거나 저장합니다.
  2. UsernamePasswordAuthenticationFilter: 아이디/패스워드 기반의 폼 로그인을 처리합니다.
  3. ExceptionTranslationFilter: 보안 예외(AuthenticationException, AccessDeniedException)를 처리하고 적절한 응답을 생성합니다.
  4. FilterSecurityInterceptor: 요청의 최종 인가 여부를 판단합니다.

3. 시큐리티 설정 (SecurityConfig)

최신 스프링 부트(Spring Boot 3.x 이상)에서는 추상화된 빈 설정을 권장합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화 (API 서버의 경우)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll() // 누구나 접근 가능
.anyRequest().authenticated() // 그 외 모든 요청은 인증 필요
)
.formLogin(Customizer.withDefaults()); // 기본 폼 로그인 활성화

return http.build();
}
}

🎯 핵심 요점

  • 스프링 시큐리티는 필터 체인 방식으로 동작합니다.
  • 인증 은 신원 확인, 인가 는 권한 확인입니다.
  • SecurityFilterChain 빈 설정을 통해 보안 정책을 커스터마이징할 수 있습니다.
Advertisement