3. Spring Security 기본 동작 흐름
Last updated
Last updated
Client의 요청 시작:
클라이언트(예: 브라우저 또는 API 호출)가 서버로 HTTP 요청을 보냅니다.
FilterChain의 시작:
요청은 FilterChain을 통해 처리됩니다. Spring Security는 여러 개의 Filter 객체로 구성된 필터 체인을 활용합니다.
Filter0
와 같은 일반 필터가 먼저 실행되며, 이후 Spring Security의 주요 역할을 수행하는 DelegatingFilterProxy로 요청이 전달됩니다.
DelegatingFilterProxy와 FilterChainProxy:
Spring Security는 서블릿 컨테이너의 필터(DelegatingFilterProxy
)를 이용해 요청을 Spring Security의 실제 필터 체인으로 위임합니다.
FilterChainProxy는 Spring Security의 핵심 역할을 담당하며, 이 단계에서 요청은 Spring Security의 SecurityFilterChain으로 위임됩니다.
SecurityFilterChain의 처리:
SecurityFilterChain은 Spring Security의 보안 로직이 포함된 필터 체인입니다.
SecurityFilterChain은 여러 개의 필터(SecurityFilter0
, SecurityFilter1
, ..., SecurityFilterN
)로 구성되며, 다음과 같은 작업을 수행합니다:
인증(Authentication): 요청한 사용자가 적절히 인증되었는지 확인합니다.
인가(Authorization): 인증된 사용자가 해당 요청을 수행할 권한이 있는지 검증합니다.
세션 관리: 사용자 세션을 확인하거나 생성합니다.
CSRF 방어: CSRF 공격을 방지하기 위한 검사를 수행합니다.
필터 체인을 거친 후 Servlet으로 요청 전달:
SecurityFilterChain의 모든 필터가 요청을 처리한 뒤, 요청은 애플리케이션의 서블릿(Servlet
)으로 전달됩니다.
여기서 컨트롤러 또는 다른 비즈니스 로직이 실행됩니다.
응답의 반환:
서블릿에서 생성된 응답은 역으로 FilterChain을 거쳐 클라이언트에게 반환됩니다.
이 과정에서 SecurityFilterChain이 응답을 수정하거나 추가 보안 작업을 수행할 수도 있습니다.
DelegatingFilterProxy는 Spring Security의 엔트리 포인트로, Spring 컨텍스트에 정의된 FilterChainProxy
를 호출하여 보안 필터 체인을 실행합니다.
FilterChainProxy는 등록된 SecurityFilterChain 객체들을 순서대로 실행하며, 보안과 관련된 인증, 인가, 세션 관리 등을 처리합니다.
Spring Security의 구조는 요청과 응답의 흐름에서 보안 계층을 추가적으로 제공하여 애플리케이션을 보호합니다.
클라이언트는 요청을 서버로 전송하는 주체입니다. 일반적으로 브라우저, 모바일 앱, 또는 API 클라이언트가 될 수 있습니다.
HTTP 요청이 서버로 전달되며, 이 요청은 보안 검사를 거치게 됩니다.
FilterChain은 Java Servlet 표준에서 제공하는 개념으로, 요청이 서블릿으로 전달되기 전에 특정 작업을 처리할 수 있도록 여러 필터를 체인처럼 연결한 구조입니다.
Spring Security는 이 FilterChain을 활용하여 보안 기능을 구현합니다.
이 그림에서는 여러 필터(Filter0
, Filter2
등) 중 하나로 DelegatingFilterProxy
가 포함되어 있습니다.
DelegatingFilterProxy는 Spring Security에서 Servlet 필터와 Spring 컨텍스트를 연결하는 브릿지 역할을 합니다.
실제로는 web.xml
이나 Java Config에 정의된 필터로, Spring 컨텍스트 내에 있는 FilterChainProxy를 호출합니다.
Spring Security가 Java 표준 필터와 통합되도록 하는 핵심 컴포넌트입니다.
FilterChainProxy는 Spring Security의 핵심 필터로, 요청을 실제로 보안 처리하는 SecurityFilterChain으로 위임합니다.
요청 경로와 설정에 따라 적합한 SecurityFilterChain을 선택합니다.
예: /admin
요청은 Admin 전용 필터 체인, /user
요청은 일반 사용자용 필터 체인.
SecurityFilterChain은 보안 관련 필터들의 체인입니다.
Spring Security의 모든 보안 로직은 여기에 포함된 여러 Security Filter를 통해 구현됩니다.
구성 요소:
SecurityFilter0, SecurityFilter1, ..., SecurityFilterN: 아래와 같은 필터들이 포함될 수 있습니다.
AuthenticationFilter: 사용자의 인증(로그인)을 처리합니다.
AuthorizationFilter: 인증된 사용자의 권한을 확인합니다.
CsrfFilter: CSRF 공격을 방지합니다.
LogoutFilter: 로그아웃 요청을 처리합니다.
ExceptionTranslationFilter: 보안 예외를 처리합니다.
SessionManagementFilter: 세션을 관리하고 인증 정보를 유지합니다.
Filter0
과 Filter2
는 일반적인 서블릿 필터입니다. Spring Security와는 관계없이 추가적인 기능(예: 로깅, 요청 검증 등)을 수행할 수 있습니다.
예: Gzip 필터, 요청 로깅 필터 등.
Servlet은 애플리케이션의 비즈니스 로직이 실행되는 최종 컴포넌트입니다.
보안 검사를 모두 통과한 요청이 컨트롤러나 서비스 계층으로 전달되기 전에 여기에 도달합니다.
Spring MVC에서는 이 Servlet이 DispatcherServlet
으로 동작하며, 컨트롤러의 요청을 처리합니다.
Spring Security에서 자주 사용되는 필터들은 아래와 같습니다:
AuthenticationFilter: 사용자의 로그인 정보(예: 아이디, 비밀번호)를 처리하고 인증 상태를 설정합니다.
AuthorizationFilter: 사용자의 권한을 검사하여 리소스 접근 가능 여부를 확인합니다.
CsrfFilter: CSRF 공격을 방지합니다.
ExceptionTranslationFilter: 보안과 관련된 예외를 처리하고 적절한 응답을 반환합니다.
SessionManagementFilter: 세션 인증 정보를 관리하고 세션 고정을 방지합니다.
LogoutFilter: 로그아웃 요청을 처리하며, 인증 정보를 정리합니다.
클라이언트의 요청은 일반적인 FilterChain을 거쳐 DelegatingFilterProxy에 도달하며, Spring Security의 FilterChainProxy로 위임됩니다.
이후 SecurityFilterChain 내의 다양한 필터들이 요청을 처리한 뒤, 요청이 Servlet
으로 전달됩니다.
각 객체는 요청 흐름에서 인증, 인가, 보안 관리, 응답 처리 등 중요한 역할을 수행합니다.