배경

스프링의 HTTP 통신 과정

스프링의 HTTP 통신 과정

  1. 클라이언트가 HTTP 요청을 서버에 전송한다.
  2. 서블릿 컨테이너에서 요청을 읽어 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  3. Spring Context에 데이터를 전달하기 전, FilterChain을 실행한다.
  4. 이후 요청을 DispatcherServlet으로 전달한다. 이때부터 Spring Context로 전환된다.
  5. DispatcherServlet은 URL 기반 라우팅을 통해 Controller로 요청을 전달한다.
  6. 비즈니스 로직 수행 후, 생성된 HTTP 응답을 서블릿 컨테이너를 통해 클라이언트로 응답한다.

※ 시큐리티 필터 체인은 스프링 MVC(DispathcerServlet, Controller, @RestControllerAdvice)보다 앞단에 위치한다. 따라서 필터에서 예외가 터지면 MVC 단까지 가지 못한채 에러가 반환된다.

스프링 시큐리티의 시작점, FilterChainProxy

스프링 시큐리티의 시작점, FilterChainProxy

DelegatingFilterProxy 의 구현체를 보면 SecurityFilterChain이 아닌 FilterChainProxy로 되어 있다. FilterChainProxy는 스프링 시큐리티의 시작점이자 핵심 요소로, 여러 SecurityFilterChain을 관리하고, 방화벽 처리, SecurityContext 메모리 관리 등 스프링 시큐리티 과정에 필요한 작업을 수행한다. 위 작업이 완료된 후, FilterChainProxy는 보안 작업을 위해 적절한 SecurityFilterChain을 호출하여 개발자 지정한 보안 Filter들을 순차적으로 실행한다.

스프링 시큐리티 필터 종류

image.png

  1. LogoutFilter

    설정된 로그아웃 URL로 오는 요청을 확인해 로그아웃 처리하는 필터

  2. AnonymoustAuthenticationFilter

    필터 호출 시점까지 인증되지 않는 경우 익명 사용자 전용 객체 AnonymoustAuthentication을 만들어 SecurityContext에 넣어주는 필터

  3. OAuth2LoginAuthenticationFilter

    OAuth2 로그인 인증을 처리한다. 사용자가 OAuth2 공급자로부터 인증 후 돌아올 때 사용된다.

  4. UsernamePasswordAuthenticationFilter

    폼 기반 로그인에서 사용자 아이디와 비밀번호를 인증한다. 로그인 성공 또는 실패 시 이벤트를 발생시킨다. 세션을 막아두면 필터는 동작하지 않는다.

  5. AuthorizationFilter

    AuthorizationManager를 사용하여 URL을 통해 사용자의 리소스 접근에 대한 액세스를 제한하는 인증 필터 권한 부여 필터

  6. ExceptionTranslationFilter

    요청을 처리하는 중에 발생할 수 있는 예외를 위임 또는 전달하는 필터

  7. AuthorizationFilter