내부적으로 springSecurityFilterChain이라는 이름의 FilterChainProxy를 생성해서
여러 개의 Security Filter(UsernamePasswordAuthenticationFilter, ExceptionTranslationFilter 등)를 체인으로 연결함
Spring Bean으로 등록 가능하게 설계
일반적인 Filter는 Bean 주입이 어렵지만, Spring Security는 Filter이면서도 Spring이 관리하는 Bean이기 때문에 DI가 가능함
Interceptor는 Spring MVC Controller 진입 전후에 개입함 - Spring Security는 Filter 기반이지만, Spring이 Bean으로 관리함 - 그래서 FilterChain은 Spring 영역 + Servlet 사양을 둘 다 사용하는 구조
4. DispatcherServlet (Spring MVC의 Front Controller)
보안 통과한 요청만 도착
Spring MVC의 중심 컨트롤러 역할 - 요청 → 컨트롤러로 전달 - 컨트롤러 → 응답 생성 - 이 과정에서 Interceptor와 HandlerAdapter 등 여러 컴포넌트 동작
5. HandlerInterceptor (Spring MVC 인터셉터)
DispatcherServlet이 컨트롤러에 요청 전달하기 전후로 동작
주로 다음 작업 수행 1) preHandle() : 컨트롤러 진입 전에 실행 (인증 여부, 권한 재검사 등) 2) postHandle() : 컨트롤러 로직 실행 후, 뷰 렌더링 전 3) afterCompletion() : 요청 완료 후 (에러 여부와 관계없이)
6. Controller (비즈니스 로직 처리)
요청에 맞는 Controller 메서드 실행 / 비즈니스 로직 처리 후 응답 생성 => @RestController나 @Controller에서 @RequestMapping, @PostMapping 등으로 매핑
0.4 Tomcat Filter VS Spring Interceptor
- Spring 기반 애플리케이션에는 요청을 처리하는 두 가지 입구가 존재
출처 : ASAC 수업자료 간단하게 표현했을때, 모든 요청은 Tomcat 에 들어오면 가장 먼저 Filter 와 Intercepter 를 순서대로 걸쳐 Spring이 처리
Tomcat에서 관리하는 '대문' — Filter :: 인증 / 인가 처리
Spring에서 관리하는 '현관문' — Interceptor :: 세부적인 요청 처리 :: 특정 API 호출이 가능한지 판단하거나, 요청과 응답에 대한로깅 및 전처리 작업
@WebFilter, FilterRegistrationBean, springSecurityFilterChain 등
WebMvcConfigurer.addInterceptors()
주요 목적
1) 인증 2) 로깅 및 감시 3) 이미지 혹은 데이터 압축 4) MVC 상 공통 처리 로직
1) 세부 로깅 (AOP 로직) 2) 세부 인증 3) Spring 관련된 추가 조작 (예, Model)
커버리지
정적 리소스 포함 모든 HTTP 요청
Spring Controller를 타겟으로 한 요청만 처리
핸들러
- doFilter() :: 요청이 DispatcherServlet.service()에 1) 진입하기 직전에 호출 2) 결과를 반환하는 직후에 호출
1) preHandle() :: 요청이 Controller 에 진입하기 직전에 호출 2) postHandle() :: 결과를 Controller 가 반환하는 직후에 호출 3) afterCompletion() :: Controller 성공/실패 결과에 따라 View를 생성한 직후에 호출 / 에러가 발생해도 수행(로그 저장에 사용)