https://docs.spring.io/spring-security/reference/index.html
해당 포스팅은 필터 구성
, 프레임워크 구조
, 책임
, 협력
같은 주제에 포커스가 되어있으며 보안
은 다루지 않습니다.
Spring Security(이하 Security)는 Authentication
, Authorization
, Protection Against Exploits
의 관심사를 다루는 보안의 책임
을 가지는 프레임워크 입니다.
대략적인 구조는 Tomcat의 Filter Chain에 javax.servlet.Filter를 상속한 DelegatingFilterProxy
를 주입하여 몇 가지의 추가적인 중간 과정을 수행한 후 Spring Container
의 Filter
들에게 요청을 위임합니다.
그러면 Seucirty Filter
의 책임
인 '신원을 확인하기', '공격에 대하여 보호하기'같은 일들을 수행하게 됩니다.
이제부터 어떻게 이루어지고, 어떻게 사용이 되는지 알아보겠습니다.
Overview에서 몇 가지의 추가적인 중간 과정에 관한 내용을 다루며
아래 이미지는 오브젝트끼리 어떻게 협력하는지 보여줍니다.
DelegationgFilterProxy
는 보안 관심사에 대하여 작업을 요청합니다.
부가적인 특징
Servlet과 Spring을 연결합니다.
위 협력과정에서 노란색 스티커는 org.springframework.security.web소속이며
파란색 스티커는 org.springframework.web.filter소속입니다.
Security에 정의된 빈은 Servlet에 등록되지 못합니다.
FilterChainProxy
는 Securty Filter Chain에게 너가 담당하는 요청인지 물어보며 Filter List를 요구하고 Filter에게 필터링을 지시합니다.
부가적인 특징
Filtering작업의 시작점을 제공합니다. 협력관계의 중간에서 많은 오브젝트들과 대화합니다.
FilterChain
은 RequestMatcher를 통해 임의의 요청에 대하여 Support하는지
검사하고 보유한 Filter를 반환합니다.
부가적인 특징
간단한 구조이며 자신(FilterChain)이 임의의 요청에 대한 Filter List를 가지고 있습니다.
Filter
는 자신의 보안 관심사에 대하여 필터링을 합니다.
실직적으로 'Authentication', 'Authorization' , 'Protection Against Exploits'에
관하여 필터링합니다.
public interface SecurityFilterChain {
boolean matches(HttpServletRequest request);
List<Filter> getFilters();
}
SecurityFilterChain은 2가지 행동만 가지며요청을 확인
하고 필터를 제공
합니다.
Spring Security는 기본적으로 1개의 SecurityFilterChain
을 소유하며
SecurityFilterChain
안에 다수의 필터가 존재합니다.
추가적인 설정을 하지않는다면 모든 요청에 필터체인에 포함된 모든 필터가 사용됩니다.
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시에 선택하면 좋은 필터
GenericFilterBean
범용적으로 사용AbstractAuthenticationProcessingFilter
인증처리를 위해 사용OncePerRequestFilter
요청 당 1번의 실행