Backend/Spring

[Spring] Spring Security Architecture에 대해서

mirae.kwak 2022. 9. 1. 17:37
728x90

Spring Security Architecture

Conceptual Architecture

거시적인 관점에서 Spring Security는 웹 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는지 확인함

  • AuthenticationManager 사용자 인증 관련 처리
  • AccessDecisionManager 사용자가 보호받는 리소스에 접근할 수 있는 적절한 권한이 있는지 확인

https://www.slideshare.net/analizator/spring-security-framework

  • AuthenticationManager : 사용자 인증과 관련된 처리를 담당 - 인증
  • Access Decision Manager : 사용자가 적절한 권한을 가지고 있는지 확인 - 인가

 

FilterChainProxy (Spring Security 필터 체인)

Spring Security의 실제적인 구현은 서블릿 필터 (javax.servlet.Filter 인터페이스 구현체)를 통해 이루어짐

  • 서블릿 필터는 웹 요청을 가로챈 후 전처리 또는 후처리를 수행하거나, 요청 자체를 리다이렉트 하기도 함
    • 서블릿 필터 = 필터 구현체들의 집합

FilterChainProxy 세부 내용은 WebSecurityConfigurerAdapter 추상 클래스를 상속하는 구현체에서 설정함(보통 @EnableWebSecurity 어노테이션도 함께 사용)

  • 웹 요청은 이러한 필터 체인을 차례대로 통과하게 됨
    • 웹 요청은 모든 필터를 통과하게 되지만, 모든 필터가 동작하는 것은 아님
    • 각 필터는 웹 요청에 따라 동작 여부를 결정할 수 있고, 동작할 필요가 없다면 다음 필터로 웹 요청을 즉시 넘김
  • 요청을 처리하고 응답을 반환하면 필터 체인 호출 스택은 모든 필터에 대해 역순으로 진행
  • 보통 springSecurityFilterChain 이라는 이름으로 Bean 등록됨

 

웹 요청은 어떻게 FilterChainProxy로 전달될까?

  • 웹 요청을 수신한 서블릿 컨테이너는 해당 요청을 DelegatingFilterProxy(javax.servlet.Filter 인터페이스 구현체)로 전달함
    • DelegatingFilterProxy는 요청을 delegate로 전달함
    • DelegatingFilterProxy Bean은 SecurityFilterAutoConfiguration 클래스에서 자동으로 등록됨
    • DelegatingFilterProxy는 실제적으로 웹 요청을 처리할 Target Filter Bean을 지정해야함
      • Target Filter Bean은 바로 앞에서 알아본 FilterChainProxy

  • 서버를 띄우면 필터체인목록(spring security filter chain과는 전혀 다름)이 존재
  • 필터체인목록 중에 DelegatingFilterProxy가 껴있음
  • DelegatingFilterProxy에 웹 요청이 도착하게 되면 가리키고 있던 Spring SecurityFilterChain으로 전달
  • SecurityFilterChain은 Spring Security Filter 목록을 가져와서 요청 처리

 

Spring Security FilterChainProxy를 구성하는 filter 목록

필터이름 설명
ChannelProcessingFilter 웹 요청이 어떤 프로토콜로(http 또는 https) 전달되어야 하는지 처리
SecurityContextPersistenceFilter SecurityContextRepository를 통해 SecurityContext를 Load/Save 처리
LogoutFilter 로그아웃 URL로 요청을 감시하여 매칭되는 요청이 있으면 해당 사용자를 로그아웃 시킴
UsernamePasswordAuthenticationFilter ID/비밀번호 기반 Form 인증 요청 URL(기본값:/login)을 감시하여 사용자를 인증함
DefaultLoginPageGeneratingFilter 로그인을 수행하는데 필요한 HTML을 생성함
RequestCacheAwareFilter 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용됨
SecurityContextHolderAwareRequestFilter 서블릿 3 API 지원을 위해 HttpServletRequst를 HttpServletRequestWrapper 하위 클래스로 감쌈
RememberMeAuthenticationFilter 요청의 일부로 remember-me 쿠키 제공 여부를 확인하고, 쿠키가 있으면 사용자 인증을 시도함
AnonymousAuthenticationFilter 해당 인증 필터에 도달할 때 까지 사용자가 아직 인증되지 않았다면, 익명 사용자로 처리하도록 함
ExceptionTranslationFilter 요청을 처리하는 도중 발생할 수 있는 예외에 대한 라우팅과 위임을 처리함
FilterSecurityInterceptor 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임

 

 

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

 

  • RequestCacheAwareFilter 사용 예시

 

 

[Spring] RequestCacheAwareFilter 사용하기

RequestCacheAwareFilter FilterChainProxy를 구성하는 주요 Security Filter 중 하나로 로그인 성공 이후 가로채어진 사용자의 원래 요청으로 이동하기 위해 사용된다. 익명의 사용자(로그인 안한 사용자)가 보

miraekwak.tistory.com

 

728x90