11.1 시큐리티 구조와 필터 체인 개요
스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 인중(Authentication) 과 인가(Authorization) 를 담당하는 강력한 프레임워크입니다. 스프링 시큐리티의 핵심 동작 원리는 서블릿 필터(Servlet Filter) 체인을 기반으로 합니다.
1. 인증(Authentication) vs 인가(Authorization)
보안의 가장 기초가 되는 두 개념입니다.
- 인증(Authentication):"당신은 누구인가?"를 확인하는 과정 (로그인)
- 인가(Authorization):"당신은 이 자원에 접근할 권한이 있는가?"를 확인하는 과정 (권한 제어)
2. 보안 필터 체인 (Security Filter Chain)
스프링 시큐리티는 여러 개의 필터가 사슬(Chain)처럼 연결되어 요청을 가로채고 처리합니다.
- FilterChainProxy: 스프링 시큐리티의 핵심 진입점으로, 여러
SecurityFilterChain중에서 요청에 맞는 체인을 선택합니다. - SecurityFilterChain: 특정 URI 패턴으로 들어오는 요청에 대해 적용될 필터들의 목록입니다.
주요 기본 필터들
- SecurityContextPersistenceFilter:
SecurityContextRepository에서SecurityContext를 로드하거나 저장합니다. - UsernamePasswordAuthenticationFilter: 아이디/패스워드 기반의 폼 로그인을 처리합니다.
- ExceptionTranslationFilter: 보안 예외(
AuthenticationException,AccessDeniedException)를 처리하고 적절한 응답을 생성합니다. - 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빈 설정을 통해 보안 정책을 커스터마이징할 수 있습니다.