1. Spring Boot 실행시 SecurityConfig 작동 흐름
(1) 애플리케이션 시작
- @Configuration 클래스들이 스캔된다.
- @Bean 메소드들이 호출 되어 SecurityFilterChain , AuthentticationManager , PasswordEncoder 등이 컨테이너에 등록된다.
- Spring Boot는 자동으로 DelegatingFilterProxy 를 Servlet Filter로 등록한다.
-> 이게 SecurityFilterChain과 연결된다.
(2) 요청 진입시
- 모든 HTTP 요청은 DispatcherServlet 으로 가기전에 FilterChainProxy(SecurityFilterChain)을 먼저 거친다.
- 따라서 인증/인가 로직은 컨트롤러(@RestController)에 도달하기 전에 필터에서 처리된다.
2. SecurityFilterChain 구조 개요
[클라이언트 요청]
↓
[DelegatingFilterProxy]
↓
[FilterChainProxy]
↓
[SecurityFilterChain]
├── CorsFilter
├── CsrfFilter
├── LogoutFilter
├── UsernamePasswordAuthenticationFilter
├── JwtAuthenticationFilter (직접 추가 가능)
├── SecurityContextPersistenceFilter
├── ExceptionTranslationFilter
└── FilterSecurityInterceptor
↓
[DispatcherServlet → Controller]
3. 주요 보안 필터들의 역할 요약
(1) CorsFilter
- 역할 : CORS 정책 검사
- 주요 동작/메소드 : CorsConfigurationSource에서 설정들을 읽어옴
(2) CsrfFilter
- 역할 : CSRF 토큰 검증
- 주요 동작/메소드 : POST/PUT/DELETE 요청 시 토큰 일치 여부 검사
(3) LogoutFilter
- 역할 : 로그아웃 처리
- 주요 동작/메소드 : /logout 요청시 세션 무효화 및 SecurityContext 초기화
(4) UsernamePasswordAuthenticationFilter
- 역할 : 기본 로그인 필터 (폼 로그인 처리)
- 주요 동작/메소드 : /login 요청을 가로채서 attempptAuthentication() 실행 -> AuthenticationManager 인증 시도
(5) JwtAuthenticationFilter
- 역할 : JWT 토큰 검증 (커스텀 가능)
- 주요 동작/메소드 : 헤더의 Authorization : Bearer 토큰을 추출 후 검증 -> SecurityContext에 등록
(6) SecurityContextPersistenceFilter
- 역할 : SecurityContext 로드 및 저장
- 주요 동작/메소드 : 세션에서 기존 인증정보를 읽어오거나 , 요청 종료 후 다시 세션에 저장
(7) ExceptionTranslationFilter
- 역할 : 인증/인가 예외 처리
- AuthenticationEntryPoint(401) 및 AccessDeniedHandler(403) 호출
(8) FilterSecurityInterceptor
- 역할 : URL 접근 권한 검사
- 주요 동작/메소드 : .authorizeHttpRequests() 설정 기반으로 접근 제어 수행
4. 주요 컴포넌트 클래스들의 역할
(1) SecurityFilterChain
- 역할 : 보안 필터 순서와 URL 접근 정책 정의
- 주요 함수 :
.authorizeHttpRequests() : URL별 접근 권한 설정
.csrf() : CSRF 보호 설정 / .disable()로 REST API 환경에서 비활성화
.formLogin() : 기본 로그인 폼 설정 / .disable()로 REST API 환경에서 비활성화
.sessionManagement() : 세션 생성 정책 정의
(2) AuthenticaitonManager
- 역할 : 인증의 핵심 처리기. UserDetailsService 로부터 사용자 검증 수행
- 주요 함수 :
(3) AuthenticationProvider
- 역할 : 실제 인증 로직 담당. DB , LDAP , OAuth 등
- 주요 함수 :
(4) UserDetailsService
- 역할 : 사용자 정보를 DB 등에서 조회
- 주요 함수 :
(5) PasswordEncoder
- 역할 : 비밀번호 암호화/검증 담당
- 주요 함수 :
(6) SecurityContextHolder
- 역할 : 현재 인증정보를 저장하는 ThreadLocal 저장소
- 주요 함수 :
(7) AuthenticationEntryPoint
- 역할 : 인증 실패(401) 시 실행되는 핸들러
- 주요 함수 :
(8) AccessDenieHandler
- 역할 : 인가 실패(403) 시 실행되는 핸들러
- 주요 함수 : handle()
(9) OAuth2SuccessHandler
- 역할 : OAuth2 로그인 성공 후 추가 처리
- 주요 함수 :
(10) CustomOAuth2UserService
- 역할 : 소셜 로그인 사용자 정보 커스터마이징
- 주요 함수 :
[클라이언트] → POST /login (username, password)
↓
[UsernamePasswordAuthenticationFilter]
→ Authentication 객체 생성
→ AuthenticationManager.authenticate() 호출
↓
[AuthenticationProvider]
→ UserDetailsService.loadUserByUsername() 호출
→ 비밀번호 검증 (PasswordEncoder.matches)
↓
[인증 성공 시]
→ SecurityContextHolder.getContext().setAuthentication(auth)
→ 세션에 SPRING_SECURITY_CONTEXT 저장
↓
[Controller 접근 가능]
6. 커스텀 JWT 구조의 기본 동작 흐름 (JWT 필터 추가 시)
[클라이언트] → Authorization: Bearer
↓
[JwtAuthenticationFilter] (addFilterBefore로 등록)
→ 헤더에서 JWT 추출
→ JwtUtil로 검증
→ 사용자 정보 조회 후 Authentication 생성
→ SecurityContextHolder에 등록
↓
[SecurityContextPersistenceFilter]
→ SecurityContext 유지
↓
[Controller 진입]
7. SecurityConfig 클래스 주요 함수 역할 정리
- filterChain
전반적인 보안 정책 설정 (CORS, CSRF, URL 접근, OAuth2, 예외 처리 등)
- jwtAuthenticationFilter()
JWT 인증용 필터 Bean 등록
- authenticationManager()
Spring 내부 AuthenticationManager Bean 주입용
- passwordEncoder()
비밀번호 암호화기 등록 (BCrypt)
8. Httpsecurity 설정에 자주 쓰이는 주요 메서드
- .csrf().disable()
REST API 환경에서 CSRF 보호 비활성화
- .formLogin().disable()
기본 로그인 폼 비활성화
- .httpBasic().disable()
Basic 인증 비활성화
- .logout().disable()
로그아웃 기능 비활성화
- .cors().configurationSource()
CORS 정책 수동 설정
- .sessionManagement().sessionCreationPolicy()
세션 생성 정책 설정
- .authorizeHttpRequests()
URL별 접근 권한 설정
- .exceptionHandling().authenticationEntryPoint()
인증 실패 시 응답 정의
- .exceptionHandling().accessDeniedHandler()
인가 실패 시 응답 정의
- .oauth2Login()
OAuth2 로그인 설정
- .addFilterBefore()
커스텀 필터 추가 시 지정 필터 앞에 삽입
9. Spring Security 주요 컴포넌트 정리
(1) SecurityFilterChain (전체 보안 필터 순서 및 정책 정의)
Spring Security의 핵심 구조
요청이 들어올 때 거치는 보안 필터 순서와 정책을 정의한다.
URL별 접근 권한 설정 ,
CSRF 보호 설정 ,
기본 로그인 폼 설정 ,
HTTP Basic 인증 설정
로그아웃 처리 정책 ,
CORS 정책 설정 ,
세션 생성 정책 ,
인증/인가 실패 시 응답 핸들러 지정 ,
커스텀 필터 등록 등등
(2) AuthenticationManager (인증의 중앙 관리)
Spring Security의 인증 중앙 관리자
AuthenticationProvider 들에게 인증을 위임하고 결과를 반환한다.
Authentication authToken =
new UsernamePasswordAuthenticationToken(username, password);
Authentication result = authenticationManager.authenticate(authToken);
(3) AuthenticationProvider (실제 인증 로직 수행)
실제 인증 로직을 수행하는 클래스
비밀번호 비교나 사용자 검증은 여기서 진행된다.
(4) UserDetailsService (사용자 정보 조회)
DB나 외부 API로부터 사용자 정보를 로드하는 역할.
(5) PasswordEncoder (비밀번호 해시 처리)
비밀번호 암호화와 검증을 담당.
(6) SecurityContextHolder (인증 정보 저장소)
현재 로그인한 사용자의 인증정보를 ThreadLocal에 저장
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
(7) AuthenticationEntryPoint (인증 실패 처리)
인증되지 않은 사용자가 보호된 자원에 접근할 때 실행됨.
(8) AccessDeniedHandler (인가 실패 처리)
인가(권한)가 부족한 사용자가 접근할 때 실행됨.
(9) OAuth2SuccessHandler (소셜 로그인 성공 후 처리)
OAuth2 로그인 성공 시 실행되어 , JWT 발급/회원등록/리다이렉트 등의 후처리를 담당
(10) CustomOAuth2UserService (소셜 사용자 정보 매핑)
Google , GitHub 등 OAuth2 Provider에서 받은 사용자 정보를 가공 및 매핑