Security Filter Chain 쉽게 알기

minseok·2023년 3월 25일
0

https://docs.spring.io/spring-security/reference/index.html



  • 시작하기 전
  • Security Filter Chain 구조 개요
  • 협력과정
  • SecurityFilterChain
  • Filter





시작하기 전

해당 포스팅은 필터 구성, 프레임워크 구조, 책임, 협력같은 주제에 포커스가 되어있으며 보안은 다루지 않습니다.








Security Filter Chain 구조 개요

Spring Security(이하 Security)는 Authentication, Authorization , Protection Against Exploits의 관심사를 다루는 보안의 책임을 가지는 프레임워크 입니다.

대략적인 구조는 Tomcat의 Filter Chain에 javax.servlet.Filter를 상속한 DelegatingFilterProxy를 주입하여 몇 가지의 추가적인 중간 과정을 수행한 후 Spring ContainerFilter들에게 요청을 위임합니다.

그러면 Seucirty Filter책임인 '신원을 확인하기', '공격에 대하여 보호하기'같은 일들을 수행하게 됩니다.

이제부터 어떻게 이루어지고, 어떻게 사용이 되는지 알아보겠습니다.








협력과정

Overview에서 몇 가지의 추가적인 중간 과정에 관한 내용을 다루며
아래 이미지는 오브젝트끼리 어떻게 협력하는지 보여줍니다.

DelegationgFilterProxy보안 관심사에 대하여 작업을 요청합니다.

부가적인 특징
Servlet과 Spring을 연결합니다.
위 협력과정에서 노란색 스티커는 org.springframework.security.web소속이며
파란색 스티커는 org.springframework.web.filter소속입니다.
Security에 정의된 빈은 Servlet에 등록되지 못합니다. 

FilterChainProxySecurty Filter Chain에게 너가 담당하는 요청인지 물어보며 Filter List를 요구하고 Filter에게 필터링을 지시합니다.

부가적인 특징
Filtering작업의 시작점을 제공합니다. 협력관계의 중간에서 많은 오브젝트들과 대화합니다.

FilterChainRequestMatcher를 통해 임의의 요청에 대하여 Support하는지
검사하고 보유한 Filter를 반환합니다.

부가적인 특징
간단한 구조이며 자신(FilterChain)이 임의의 요청에 대한 Filter List를 가지고 있습니다.

Filter자신의 보안 관심사에 대하여 필터링을 합니다.

실직적으로 'Authentication', 'Authorization' , 'Protection Against Exploits'에
관하여 필터링합니다.








Security Filter Chain

public interface SecurityFilterChain {

	boolean matches(HttpServletRequest request);

	List<Filter> getFilters();

}

SecurityFilterChain은 2가지 행동만 가지며요청을 확인하고 필터를 제공합니다.

Spring Security는 기본적으로 1개의 SecurityFilterChain을 소유하며
SecurityFilterChain안에 다수의 필터가 존재합니다.
추가적인 설정을 하지않는다면 모든 요청에 필터체인에 포함된 모든 필터가 사용됩니다.








Filter

Filter는 자신의 보안 관심사에 관하여 필터링을 합니다.

Filter의 기본적인 코드 구조

public void doFilter(
	ServletRequest req, 
    ServletResponse res, 
    FilterChain chain) throws IOException, ServletException {

	1. logic이 구현된다.
    
    2. chain.doFilter(request, response);
}

logic 파트는 Filter들 마다 상이하게 구현되며
FilterChainProxy를 받아서 chain.doFilter(request, response)
호출하면 다음 Security Filter를 실행하게 됩니다.

관련되는 디자인 패턴 : intercepting filter pattern
https://www.baeldung.com/intercepting-filter-pattern-in-java




상속할 필터를 어떻게 고를까?

되도록이면 Abstract Class Filter를 사용하자.
Spring Security는 커스텀하도록 적당히 완성된 Filter를 제공합니다.
ex : AbstractAuthenticationProcessingFilter

GenericFilterBean을 상속할 수 있지만
Seucirty FilterChain, Filter에 대하여 이해도가 필요하기 때문에
목적에 부합하는 Filter가 제공되는지 우선 찾아보기를 추천합니다.

Filter Custom시에 선택하면 좋은 필터

  1. GenericFilterBean 범용적으로 사용
  2. AbstractAuthenticationProcessingFilter 인증처리를 위해 사용
  3. OncePerRequestFilter 요청 당 1번의 실행
profile
즐겁게 개발하기

0개의 댓글