본문 바로가기
Spring/Spring Security

Spring Security 기본 구조

by YellowCow 2023. 7. 8.

로그인(인증) 처리를 하기 위해서는

클라이언트가 Request를 보냈을 때

Request를 처리하는 Controller에 도달하기 전에

클라이언트의 Authentication(인증)이 실행되어야 하므로

Spring Security는 Servlet의 Filter를 이용하여 구현된다

(자세한 개념은 Filter에 대한 개념을 찾아볼 것)

 

일반적으로 Filter는 아래와 같이 구성된다

 

필터 구현 예)

public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //filter 구현내용..


	//doFilter메서드를 이용하여 filterChain을 구성한다
	//doFilter로 다음에 호출될 필터를 호출하게 된다
	//doFilter가 계속 호출되면서 filter 호출 chain을 생성
        chain.doFilter(request,response);
    }
}

 

DelegatingFilterProxy

Filter를 등록하려면, Servlet Container를 통해 등록해야한다고 한다

앞에서 나온 Filter경우, Servlet Container를 통해 등록이 가능하다

하지만, Spring Security를 이용하기 위해서는

Spring에서 정의된 Bean들을 Servlet Container에 적재해야 한다

Spring에서 정의된 Bean은 Servlet Container에서 인식할 수 없으므로 적재가 불가능하다

이를 위해 DelegatingFilterProxy를 FilterChain에 삽입하여 사용한다

 

FilterChainProxy

FilterChainProxy는 SecurityFilterChain을 등록할 수 있게 하기 위해 사용된다

굳이 FilterChainProxy를 사용하는 이유에 대해서는 뒤에서 설명하겠다

FilterChainProxy는 Spring Bean이므로 아래와 같이 DelegatingFilterProxy로 감싸져 있다

 

FilterChainProxy을 이용하면 아래와 같은 이득을 얻을 수 있다

  1. Spring Security의 Starting Point를 제공한다
    • 모든 Security Filter는 FilterChainProxy를 통하여 호출되므로 어떤 문제가 생겼을 때, FilterChainProxy 내부에 Debugging Point를 설정하여 Debugging을 실시할 수 있다
  2. FilterChainProxy가 Spring Security의 Starting Point 이므로 필수작업들을 FilterChainProxy를 통하여 한 곳에서 처리가능
    • Ex) 메모리 누수를 방지하기 위해 SecurityContext 초기화, HttpFireWall 등
  3. URL이 아닌 Request 객체의 다른 속성에 따라서도 Filter가 호출되도록 할 수 있다
    • 기존의 Filter는 URL을 기준으로만 호출될 수 있었다 Security Filter의 경우, RequestMatcher 인터페이스를 통해 Request객체의 다른 어떤 속성으로도 호출 기준을 삼을 수 있다

 

Security Filter

Security Filter는 Security와 관련된 작업(Authentication(인증))을 처리하는 Filter이다

SecurityFilterChain API를 이용하여 FilterChainProxy에 등록된다.

 

Security Filter 우선순위

일반적으로, Filter는 순서가 달라지면 다음에 호출될 Filter에 영향을 줄 수 있다

때문에, Spring Security에서는 Security Filter의 우선순위를 아래와 같이 명시하고 있다

  • ForceEagerSessionCreationFilter
  • ChannelProcessingFilter
  • WebAsyncManagerIntegrationFilter
  • SecurityContextPersistenceFilter
  • HeaderWriterFilter
  • CorsFilter
  • CsrfFilter
  • LogoutFilter
  • OAuth2AuthorizationRequestRedirectFilter
  • Saml2WebSsoAuthenticationRequestFilter
  • X509AuthenticationFilter
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • OAuth2LoginAuthenticationFilter
  • Saml2WebSsoAuthenticationFilter
  • UsernamePasswordAuthenticationFilter
  • OpenIDAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • DefaultLogoutPageGeneratingFilter
  • ConcurrentSessionFilter
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter
  • BasicAuthenticationFilter
  • RequestCacheAwareFilter
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RememberMeAuthenticationFilter
  • AnonymousAuthenticationFilter
  • OAuth2AuthorizationCodeGrantFilter
  • SessionManagementFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor
  • SwitchUserFilter

 

댓글