Spring Security docs로 공부하기 (#02)

0

Spring Security

목록 보기
2/5

이번 섹션에서는 Servlet 기반 애플리케이션 내에서 Spring Security고수준 아키텍쳐에 대해서 설명한다.

참조의 인증, 권한 부여, 악용에 대한 보호를 사용할 때 아키텍쳐에 대한 높은 수준의 이해를 요구한다고 한다.


A Review of Filters

Spring SecurityServlet 지원은 Servlet을 기반으로 하므로 Filter의 역할을 먼저 살펴보는 것이 도움이 된다.

아래의 Filter 그림은 단일 HTTP 요청에 대한 처리기의 일반적인 계층화를 보여준다.

클라이언트는 애플리케이션에 요청을 보내고 컨테이너는 FilterChain를 포함하고 요청 URI의 경로를 기반으로 처리한다.


DelegatingFilterProxy

Spring은 Servlet FilterDelegatingFilterProxy컨테이너의 라이프사이클과 Spring의 ApplicationContext를 지원한다.

DelegatingFilterProxy서블릿 컨테이너스프링 컨테이너(어플리케이션 컨텍스트) 사이의 링크를 제공하는 ServletFilter이다.
특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임한다.

Why? 서블릿 필터(서블릿 컨테이너)시큐리티 필터(스프링 컨테이너)는 서로 다른 컨테이너에서 생성되고 동작하기 때문에 이를 연결해줄 것이 필요함

다음은 DelegatingFilterProxy의 동작 방식이다.

DelegatingFilterProxy에서 Bean Filter를 찾은 다음 ApplicationContext를 호출한다.

무슨말인지 잘 이해가 안될 수 있지만 아래 그림을 보면 이해가 좀 더 쉬울 것이다.

참고로 DispatcherServlet보다 DelegatingFilterProxy의 우선순위가 더 높다.

따라서 DispatcherServlet이 요청을 다 가로채갈일은 없다고 보면된다.

DelegatingFilterProxy 의사 코드

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	Filter delegate = getFilterBean(someBeanName);
	delegate.doFilter(request, response);
}

정리해서 DelegatingFilterProxy까지 적용된 요청의 동작 순서는 RequestFilter(Servlet 컨테이너)를 거치다가 DelegatingFilterProxy를 만나면 ApplicationContext(Spring 컨테이너)로 이동해서 인증을 마저 진행한다.

사진으로 보면 다음과 같다.


FilterChainProxy

Spring SecurityServlet 지원은 FilterChainProxy를 통해 많은 인스턴스에 위임할 수 있는 특수한 기능도 포함되어 있다.

Spring 컨테이너로 도착한 요청은 DelegatingFilterProxy로부터 요청을 위임 받고 실제로 보안을 처리한다.

사용자의 요청을 필터 순서대로 호출하여 전달한다. 사용자 정의 필터를 생성해서 기존의 필터 전후로 추가 가능하다.

마지막 필터까지 인증인가 예외가 발생하지 않으면 보안을 통과한다.


SecurityFilterChain과 Security Filters

FilterChainProxy에서 잠깐 살펴 봤던것과 같이 마지막 필터까지 인증인가 예외가 발생하지 않으면 보안을 통과한다.

스프링 시큐리티에서 제공하는 필터는 다음과 같다.

  • ForceEagerSessionCreationFilter
  • 채널 처리 필터
  • WebAsyncManagerIntegrationFilter
  • SecurityContextPersistenceFilter
  • 헤더라이터 필터
  • CorsFilter
  • CSRF 필터
  • 로그아웃 필터
  • OAuth2AuthorizationRequestRedirectFilter
  • Saml2WebSso 인증 요청 필터
  • X509 인증 필터
  • AbstractPreAuthenticatedProcessingFilter
  • CasAuthenticationFilter
  • OAuth2Login 인증 필터
  • Saml2WebSso 인증 필터
  • UsernamePasswordAuthenticationFilter
  • OpenID인증 필터
  • 기본 로그인 페이지 생성 필터
  • 기본 로그아웃 페이지 생성 필터
  • 동시 세션 필터
  • DigestAuthenticationFilter
  • BearerTokenAuthenticationFilter
  • BasicAuthenticationFilter
  • 요청 캐시 인식 필터
  • SecurityContextHolderAwareRequestFilter
  • JaasApiIntegrationFilter
  • RememberMeAuthenticationFilter
  • 익명 인증 필터
  • OAuth2AuthorizationCodeGrantFilter
  • 세션 관리 필터
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor
  • SwitchUserFilter

0개의 댓글