Java_Spring Security

Minki CHO·2023년 1월 16일
0

CodeStates

목록 보기
16/43

Spring Security의 웹 요청 처리 흐름

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에서도 분명 이 필터를 이용해 클라이언트의 요청을 가로챈 뒤 추가 작업하는 것은 아닐까?

Spring Security에서 사용하는 필터는 어떤 작업을 추가하나?
-보안 관련 작업을 함


:Sevlet Filter Chain에서 Spring Security Filter가 추가됨
:빨간 점선의 박스 영역이 Spring Security Filter 영역
:앞서 살펴본 서블릿 필터와 다르게 xxxxProxy로 명명됨
:이름은 조금 다르나 DelegatingFilterProxy와 FilterChainProxy 클래스는 Filter 인터페이스를 구현하므로 서블릿 펄터로써의 역할을 함

but. DelegatingFilterProxy와 FilterChainProxy는 조금 특별한 필터임

DelegatingFilterProxy

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을 연결한 모습

FilterChainProxy

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가 각각 어떤 역할을 수행하는지 전부 알 필요없고, 필요한 상황이 되었을 떄 그때그때 적용해도 상관없음

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임

profile
Developer

0개의 댓글