Spring Security 내부에서 일어나는 과정을 알지 못하고 Spring Security의 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터랙션해서 인증, 권한 등의 보안 작업을 하는지 이해하지 못하면 한계에 부딪힘
(1) 리소스 요청
:사용자가 보호된 리소스를 요청
(2) 크리덴셜Credential 요청
:인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜Credential을 요청함
? 사용자의 크리덴셜Credential이란?
:해당 사용자를 증명하기 위한 구체적인 수단을 의미
:일반적으로 사용자의 패스워드가 해당됨
(3) 크리덴셜Credential 제공
:사용자는 인증 관리자에게 크리덴셜Credential을 제공
(4) 크리덴셜 조회
:인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회
(5) 유효한 크리덴셜인가?
:인증 관리자가 사용자가 제공한 크리덴셜과 크리덴셜 저장소에 저장된 크리덴셜을 비교해 검증 작업을 수행
(6) 유효한 크리덴셜인가? No
:유효한 크리덴셜이 아니면 Exception을 throw함
(7) 유효한 크리덴셜인가? Yes
:유효한 크리덴셜이라면
(8) 적절한 권한을 가지고 있는가?
:접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증
(9) 적절한 권한을 가지고 있는가 ? No
:적절한 권한을 부여받지 못한 사용자라면 Exception을 throw함
(10) 적절한 권한을 가지고 있는가 ? Yes
:적절한 권한을 부여받은 사용자라면 보호된 리소스 접근을 허용
위에서는 사용자의 웹 요청이 Controller같은 엔드포인트를 거쳐 접근하려는 리소스에 도달하기 전에 인증 관리자나 접근 결정 관리자 같은 컴퍼넌트가 중간에 웹 요청을 가로채 사용자의 크리덴셜과 접근 권한을 검증하는 것을 볼 수 있음
이처럼 서블릿 기반 애플리케이션의 경우 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공함, 이 포인트 = 서블릿 필터(Servlet Filter)
(서블릿 필터
:자바에서 제공하는 API, javax.servlet 패키지에 인터페이스 형태로 정의
:javax.servlet.Filter 인터페이스를 구현
:웹 요청Request을 가로채어 어떤 처리(전처리)를 할 수 있음
:엔드포인트에서 요청 처리가 끝난 후 전달되는 응답response을 클라이언트에게 전달하기 전에 어떤 처리(후처리)를 할 수 있음)
서블릿 필터는 하나 이상의 필터들을 연결해 필터 체인Filter Chain 구성할 수 있음
:Sevlet Filter Chain 구성도
:Spring Framework의 DispatcherSevlet에 클라이언트의 요청이 전달되기 전에 필터 체인Filter Chain을 구성한 예
서블릿 필터는 각각의 필터들이 doFilter() 메서드를 구현해야하며,
doFilter() 메서드 호출을 통해 필터 체인을 형성하게 됨
if. Filter 인터페이스를 구현한 다수의 Filter 클래스를 위와 같이 구현했다면 생성한 서블릿 필터에서 작성한 특별한 작업들을 수행한 뒤 HttpSevlet을 거쳐 DispatcherServlet에 요청이 전달되며, 반대로 DispatcherServlet에서 전달한 응답에 대해 역시 특별한 작업을 수행할 수 있음
? Spring Security에서 필터는 어떤 역할을 할까?
서블릿 필터는 클라이언트 요청 중간에 끼어들어 무언가 추가 작업을 할 수 있음
그렇다면 Spring Security에서도 분명 이 필터를 이용해 클라이언트의 요청을 가로챈 뒤 추가 작업하는 것은 아닐까?
Spring Security에서 사용하는 필터는 어떤 작업을 추가하나?
-보안 관련 작업을 함
:Sevlet Filter Chain에서 Spring Security Filter가 추가됨
:빨간 점선의 박스 영역이 Spring Security Filter 영역
:앞서 살펴본 서블릿 필터와 다르게 xxxxProxy로 명명됨
:이름은 조금 다르나 DelegatingFilterProxy와 FilterChainProxy 클래스는 Filter 인터페이스를 구현하므로 서블릿 펄터로써의 역할을 함
but. DelegatingFilterProxy와 FilterChainProxy는 조금 특별한 필터임
Spring에서 DI의 핵심은 바로 Spring 컨테이너인 ApplicationContext임
따라서 Spring Security 역시 Spring의 핵심인 ApplicationContext 이용함
서블릿 필터와 연결되는 Spring Security만의 필터를 ApplicationContext에 Bean으로 등록한 후 이 Bean들을 이용해서 보안과 관련된 여러 작업을 처리하게 됨
DelegatingFilterProxy가 Bean으로 등록된 Spring Security의 필터를 사용하는 시작점<노이해중>
그런데 DelegatingFilterProxy라는 이름에서 알 수 있듯이 보안과 관련된 어떤 작업을 처리하는 것이 아닌 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 함
? 그렇다면 FilterChainProxy의 역할은?
:FilterChainProxy에 Spring security Filter Chain이 추가됨
위에서 끊어진 Next Step, FilterChainProxy에 Spring Security에서 지원하는 Filter Chain을 연결한 모습
Spring Security의 Filter Chain은 말 그대로 Spring Security에서 보안을 위해 작업을 처리하는 필터의 모음
Spring Security의 Filter를 사용하기 위한 진입점 = FilterChainProxy
"FilterChainProxy부터 Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행"
Spring Security의 Filter Chain은 URL별로 여러개 등록 가능
Filter Chain이 있을 때 어떤 Fitler Chain을 사용할지 FilterChainProxy가 결정하며, 가장 먼저 매칭된 FilterChain을 실행함<노이해중>
ex.
/api/ 패턴의 Filter Chain이 있고, /api/message URL 요청이 전송하는 경우)
-/api/ 패턴과 제일 먼저 매칭되므로,
디폴트 패턴인 / 도 일치하지만 가장 먼저 매칭되는 /api/ 패턴과 일치하는 Filter Chain만 실행
/message/ 패턴의 Filter Chain이 없는데 /message/ URL을 요청하는 경우)
-매칭되는 Filter Chain이 없으므로 디폴트 패턴인 / 패턴의 Filter Chain 실행
Spring Security는 보안을 위한 특정 작업을 수행하기 위한 다양한 Filter를 지원하나 수가 많음
따라서 Spring Security의 Filter가 각각 어떤 역할을 수행하는지 전부 알 필요없고, 필요한 상황이 되었을 떄 그때그때 적용해도 상관없음
Spring Security의 Filter에서 항상 모든 Filter가 수행되는 것이 아니라 프로젝트 구성 및 설정에 따라 일부의 Filter만 활성화되기 때문에 직접적으로 개발자가 핸들링할 필요가 없는 Filter들이 대부분
따라서 개발자가 Custom Filter를 작성하고 등록할 경우 기존 필터들 사이에 우선 순위를 적용해 수행되어야 할 필요가 있는 경우 참고해서 적용하면 됨
핵심
-Spring Security를 애플리케이션에 적용하는데 어려움을 겪는 가장 큰 이유 중 하나는 Spring Security의 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터랙션해서 인증,권한 등의 보안 작업을 처리하는지 이해 못하기 때문
-서블릿 필터Sevlet Filter는 서블릿 기반 애플리케이션의 엔드포인트에 요청에 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있도록 해주는 Java 컴포넌트임
-Spring Security의 필터는 클라이언트의 요청을 중간에서 가로챈 뒤 보안에 특화된 작업을 처리하는 역할을 함
-DelegatingFilterProxy라는 이름에서 알 수 있듯이 서블릿 컨테이너 영역의 필터와 ApplicaitonContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 연결을 함
-Spring Security의 Filter Chain은 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모임이고, Spring Security의 Filter를 사용하기 위한 진입점이 FilterChainProxy임