철갑이의 이모저모

[spring] 스프링 시큐리티(Spring Security) - 개념 및 동작 구조 본문

spring

[spring] 스프링 시큐리티(Spring Security) - 개념 및 동작 구조

철갑 2022. 8. 3. 21:44
728x90

▶ 시작 전 보안과 관련된 용어 정리

  • 인증(authentication) : 사용자가 누구인지 확인하는 단계
  • 인가(authorization) : 인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근시 해당 리소스에 접근할 권리가 있는지 확인하는 과정
  • 접근 주체(principal) : 애플리케이션의 기능을 사용하는 주체 
  • 권한 : 인증을 통해 검증된 사용자가 애플리케이션의 동작을 수행할 수 있도록 허락되있는지를 결정


▶ 스프링 시큐리티(Spring Security)란?

애플리케이션의 인증, 인가, 권한 등의 보안 기능을 제공하는 스프링 하위 프로젝트

 

▶ 스프링 시큐리티의 동작 구조

스프링 시큐리티는 서블릿 필터(Servlet Filter)를 기반으로 동작하기 때문에 filter에 대해 알고 가는 것이 좋습니다. 아래 그림은 단일 HTTP 요청에 대한 처리 동작입니다. 클라이언트에서 요청을 보내면 서블릿 컨테이너는 URI를 확인해 HttpServlet 요청을 처리해야 하는 필터 및 서블릿을 매핑해 필터 체인을 만듭니다.

(1) FilterChain

스프링 시큐리티는 사용하려는 필터체인을 서블릿 컨테이너의 필터 사이에 동작시키기 위해 아래와 같이 DelegatingFilterProxy를 사용합니다. DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 ApplicationContext 사이에서 다리 역할을 수행하는 필터 구현체 입니다.

(2) SecurityFilterChain

FilterChainProxy는 Spring Bean 이기 때문에 DelegatingFilterProxy 내부에 존재합니다. 또한 DelegatingFilterProxy로부터 요청을 위임받고 실질적으로 보안처리를 하게 됩니다. 그리고 스프링 시큐리티에서 제공하는 필터로 SpringSecurityFilterChain를 통해 많은 보안 필터를 사용할 수 있습니다. 

▶ 보안필터 체인

보안필터 체인에서 사용하는 필터는 여러 종류가 있습니다. 공식 문서에서 소개하는 필터의 실행 순서는 아래와 같습니다.

  • 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

위의 필터체인은 @Order 어노테이션을 통해 순서를 정의할 수 있습니다. 별도의 설정이 없으면 인증을 처리하는 기본필터인 UsernamePasswordAuthenticationFilter가 실행됩니다.

▶ 스프링 시큐리티 인증 처리 과정

UsernamePasswordAuthenticationFilter의 처리과정은 아래와 같습니다.

UsernamePasswordAuthenticationFilter를 통한 인증과정

  1. Client로부터 요청을 받으면 Servlet Filter에서 SecurityFilterChain으로 작업이 위임되고 그 중 UsernamePasswordAuthenticationFilter에서 인증을 처리합니다.
  2. AuthenticationFilter는 HttpServletRequest에서 username과 password를 추출해 토큰을 생성합니다.
  3. 그 후 AuthenticationManager에게 토큰을 전달합니다. 
  4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰을 전달합니다.
  5. AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달합니다.
  6. UserDetailsService는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체를 생성합니다.
  7. 생성된 UserDetails 객체는 AuthenticationFilter로 전달되고, 해당 Provider에서 인증을 수행하고 성공하게 되면 ProviderManager로 권한을 담은 토큰을 전달합니다.
  8. ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달합니다.
  9. AuthenticationFilter는 검증된 토큰을 SecurityContextHoler에 있는 SecurityContext에 저장합니다.

 

참고

스프링 부트 핵심 가이드

https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-filters-review

 

Architecture :: Spring Security

Spring Security’s Servlet support is based on Servlet Filters, so it is helpful to look at the role of Filters generally first. The picture below shows the typical layering of the handlers for a single HTTP request. The client sends a request to the appl

docs.spring.io

 

728x90