스프링 시큐리티에 아키텍쳐에 대해 하나씩 알아보고자 합니다.
처음은 DelegatingFilterProxy, FilterChainProxy로 서블릿 컨테이너와 스프링 컨테이너의 분리로 인해 발생하는 아키텍쳐에 대해 알아보려 합니다.
기반 지식
먼저 서블릿 컨테이너와 스프링 컨테이너를 도식화한 모습은 아래와 같습니다.
[출처: mangkyu.tistory.com/18]
web context는 서블릿 컨테이너가 포함된 부분으로 톰캣같은 WAS서버가 담당합니다.
인증/인가에 대한 다양한 요구사항 처리
서블릿 필터
는 서블릿 스펙에 정의된 기술로 서블릿 컨테이너
에서 생성되고 실행되는 객체입니다.
그러므로 스프링 컨테이너
에 접근해서 스프링 빈(Bean)
을 주입해서 사용할 수가 없습니다.
하지만 인증/인가에 대한 다양한 요구사항을 처리하려면, 사용자 DB의 데이터를 조회하는 등, 스프링 빈을 사용해야만 합니다.
그래서 서블릿과 스프링 시큐리티는 각기 다른 저장소인 서블릿 컨테이너와 스프링 컨테이너 간에 객체 주입을 할 수 없는 부분을 아래와 같이 처리하였습니다.
- 서블릿은 서블릿 필터의 작동을 추상화하였습니다.
서블릿 필터는FilterChainProxy
라는 스프링 빈에 필터를 위임합니다. - 스프링 시큐리티는 서블릿에서 위임받은 요청을 처리할
FilterChainProxy
빈을 만들었습니다.
AbstractSecurityWebApplicationInitializer를 확인해보면SpringSecurityFilterChain
이라는 특정 스프링 빈을 찾습니다.
해당 빈(SpringSecurityFilterChain)에서 필터 체인을 생성하고 실행합니다. 같은 스프링 컨테이너에 있기 때문에 이제 필터에서 다른 스프링 빈을 사용할 수 있습니다.
스프링부트가 자동 설정하는 부분
- SecurityFilterAutoConfiguration 클래스
- package org.springframework.boot.autoconfigure.security.servlet;
- securityFilterChainRegistration() 에서
springSecurityFilterChain
라는 이름의 필터를 등록한다.
FilterChainProxy
필터 요청을 Spring 관리 필터 빈 목록에 위임합니다. 버전 2.0부터는 필터 체인 내용을 매우 세밀하게 제어할 필요가 없는 한 애플리케이션 컨텍스트에서 FilterChainProxy 빈을 명시적으로 구성할 필요가 없습니다. 대부분의 경우는 기본 <security:http /> 네임스페이스 구성 옵션으로 적절하게 처리되어야 합니다.
FilterChainProxy는 애플리케이션 web.xml 파일에 표준 Spring DelegatingFilterProxy 선언을 추가하여 서블릿 컨테이너 필터 체인에 연결됩니다.
'Spring Framework > Spring' 카테고리의 다른 글
Spring Event 를 활용한 예약 푸쉬 발송 (0) | 2023.04.05 |
---|---|
Spring Security 디버깅 방법 (0) | 2023.03.30 |
스프링부트 버젼 - 마이너 버전 (0) | 2022.06.01 |
WebMvcConfigurer (0) | 2022.04.18 |
[토비의스프링] 1-7 의존관계 주입 DI (0) | 2022.03.30 |
댓글