내부적으로는 Spring Security에서 제공하는 컴포넌트들이 애플리케이션 내부에서 User의 인증과 권한에 대한 처리를 알아서 진행 해준다
하지만 내부 과정을 구체적으로 알지 못한다.
Spring Security의 아키텍처와 Spring Security의 컴포넌트들이 어떻게 인터랙션 해서 인증,권한 등의 보안 작업을 처리하는지 이해하지 못하기에 애플리케이션에 Security를 적용하기 어려운것이다.
동작 방식을 이해 할려면 보호된 웹 요청을 처리하는 일반적인 처리흐름과 Filter의 역할을 이해 해야한다.
이런 흐름이다.
사용자의 웹 요청이 Controller 같은 엔드포인트를 거쳐 접근 하려는 리소스에 도달하기 전에 인증 관리자나 접근 결정 관리자 같은 컴포넌트가 중간에 웹 요청을 가로채 사용자의 크리덴셜과 접근 권한을 검증 하는것을 볼수 있다.
서블릿 기반 애플리케이션은 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는데 이게 서블릿 필터라고 한다.
javax.servlet.Filter
인터페이스를 구현한 서블릿 필터는 웹 요청(request)을 가로채어 어떤 처리(전처리)를 할 수 있으며, 또한 엔드포인트에서 요청 처리가 끝난 후 전달되는 응답(reponse)을 클라이언트에게 전달하기 전에 어떤 처리(후처리)를 할 수 있습니다.서블릿 필터는 하나 이상의 필터들을 연결해 필터 체인을 구성 할 수 있다.
Servlet Filter Chain의 구성도
Spring Framework의 DispatcherServlet에 클라이언트의 요청이 전달되기 전에 필터 체인(Filter Chain)을 구성한 예이다.
서블릿 필터는 각각의 필터들이 doFilter()라는 메소드를 구현해야하고, doFilter()메소드 호출을 통해 필터 체인을 형성한다.
우리가 Filter 인터페이스를 구현한 다수의 Filter 클래스를 구현했다면 이 필터에서 우리가 작성한 작업을 수행한후 HttpServlet을 거쳐 DispatcherServlet에 요청이 전달되고, DispatcherServlet에서 전달한 응답에 대해 역시 특별한 작업을 수행할 수 있다.
DelegatingFilterProxy
와 FilterChainProxy
클래스는 Filter 인터페이스를 구현
이 그림은 FilterChainProxy에 Spring Seucrity Filter Chain이 추가된 모습이다.
→FilterChainProxy
에 Spring Security에서 지원하는 Filter Chain을 연결한 모습
서블릿 필터와 연결되는 Spring Security만의 필터를 ApplicationContext에 Bean으로 등록한 후 이 Bean들을 이용해 보안과 관련된 여러가지 작업을 처리하는데 DelegatingFilterProxy가 Bean으로 등록된 Spring Security의 필터를 사용하는 시작점이다.
그런데 이 DelegaitingFilterProxy는 서블릿 컨테이너 영역의 필터와 ApllicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할한다.
보안을 위한 작업을 처리하는 필터 모음
이 Spring Security의 Filter를 사용하기 위한 진입점
FilterChainProxy부터 Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행한다
Spring Security의 Filter Chain은 URL 별로 여러 개 등록할 수 있으며, Filter Chain이 있을 때 어떤 Filter Chain을 사용할지는 FilterChainProxy가 결정하며, 가장 먼저 매칭된 Filter Chain을 실행한다.
/api/**
패턴의 Filter Chain이 있고, /api/message
URL 요청이 전송하는 경우/api/**
패턴과 제일 먼저 매칭되므로, 디폴트 패턴인 /**
도 일치하지만 가장 먼저 매칭되는 /api/**
패턴과 일치하는 Filter Chain만 실행합니다./message/
URL 요청을 전송하는 경우/**
패턴의 Filter Chain을 실행합니다.