Spring Security 아키텍처

개발자가 되자·2024년 9월 19일

참고 문서 : Spring 공식 문서

1. A Review of Filters

  • ※. 스프링 시큐리티는 Servlet Container와 통합되기 때문에
    Servlet Container가 동작하는 어떤 어플리케이션에서도 동작

Client가 애플리케이션에 Request를 보내면 Container는 요청 URL에 따라 HttpServletRequest를 처리해야 하는 필터와 서블릿을 포함하는 FilterChain을 생성한다.
(하나의 서블릿은 최대 하나의 HttpServletRequest와 HttpServletResponse를 처리 가능)

※. 이떄 다운스트림 필터는 호출되지 않아야 한다. 그 이유는 다운스트림 필터(후행 필터)는 선행 필터에서 서블릿까지 가지 않고 응답을 내려줄 수 있기 떄문에 각각의 필터의 요청과 응답을 수정할 수 있기 때문이다.

※. 필터는 다운스트림 필터와 서블릿에만 영향을 주기 때문에 필터의 호출되는 순서는 중요

2. DelegatingFilterProxy

스프링 시큐리티가 제공하는 Servlet Container(웹 컨테이너)의 생명주기와 Spring ApplicationContext간의 연결하는 역할의 Filter 구현체

  • DelegatingFilterProxy 등장 이전
    => 필터는 스프링 컨테이너가 아니라 서블릿 컨테이너(웹 컨테이너)에 관리되었다. 그럼므로 필터를 빈으로 등록 및 주입이 불가능 했다. 그러나 DI 같은 기술이 필요하여 빈으로 주입할 수 있도록 도와주는 DelegatingFilterProxy가 개발되었다.

  • DelegatingFilterProxy의 역할
    => 서블릿 컨테이너에서 관리되는 프록시용 필터로써 우리가 만든 커스텀 필터를 가지고 있다. 이때 커스텀 필터는 스프링 컨테이너의 빈으로 등록되며 빈에 대한 요청이 오면 DelegatingFilterProxy가 요청을 받아 커스텀 필터에게 해당 요청을 위임한다.

  • DelegatingFilterProxy의 동작 방식 (Spring 기반)
    1. Filter 구현체가 스프링 빈으로 등록
    2. ServletContext가 Filter 구현체를 갖는 DelegatingFilterProxy를 생성
    3. ServletContext가 DelegatingFilterProxy를 서블릿 컨테이너에 필터로 등록
    4. 요청이 오면 DelegatingFilterProxy가 필터 구현체에게 요청을 위임하여 필터 처리를 진행

  • Spring boot에서의 필터 구현체 빈 등록
    => Spring Boot는 자신이 직접 서블릿 컨테이너를 관리하기 때문에 DelegatingFilterProxy 없이 커스텀 필터를 필터 체인에 등록해준다.

3. FilterChainProxy

시큐리티에서 제공되는 특별한 Filter로 SecurityFilterChain을 통해 많은 필터 인스턴스에게 위임이 가능하다. 참고로 FilterChainProxy은 Bean이다.

좀 더 자세히 설명하면 SecurityFilterChain을 통해 요청에 대한 적절한 인증 과정을 처리하는데 그렇기 하기 위해서는 분기점이 필요하다 ( 이 역할을 FilterChainProxy이 해준다)

4. SecurityFilterChain

최소 한 개 이상의 SecurityFilter가 있으며, 현재 요청에 대해 어떤 Spring 보안 필터 인스턴스를 호출해야 하는지 결정하기 위해 FilterChainProxy에서 사용

5. Security Filters

SecurityFilterChain API와 함께 FilterChainProxy에 존재한다. 또한 실제로 인증 및 인가 등 보안에 관련된 로직이 존재하는 필터 또한 수 많은 보안 필터에 의해 처리되는데 개발자는 이 필터를 커스텀마이징한다.

  • FilterChainProxy을 DelegatingFilterProxy에 등록하는 데 주는 이점
    1. FilterChainProxy내에 디버깅 포인트를 추가하여 쉽게 디버깅을 할 수 있다.
    2. 메모리 누수를 막기 위해 Security Context를 삭제하거나 HttpFirewall를 통해 특정 공격에 의해 방어
    3. URL을 기반이 아니라 RequestMatcher 인터페이스를 통해 HttpServletRequest의 다른 요소들을 기반으로 다양한 SecurityFilterChain 호출이 가능

6. Handling Security Exceptions

ExceptionTranslationFilter가 AccessDeniedException과 AuthenticationException를 처리하여 HTTP Response를 반환

  • 동작 방식
    1. AccessDeniedException과 AuthenticationException이 발생하면 Exception Translation Filter가 동작
    2. 인증되지 않았거나 인증 오류가 나면 SecurityContextHoler를 지우고, 기존 요청은 인증이 되었을 때 다시 수행될 수 있도록 RequestCache에 저장 (AuthenticationEntryPoint를 통해 로그인 화면으로 이동 등의 credentials 을 요구)
    3. AccessDeniedException의 경우 AccessDeniedHandler가 호출
profile
취업준비생

0개의 댓글