Spring Security 웹 요청 처리 흐름

seongmin·2022년 11월 20일
0

Security

목록 보기
2/10
post-thumbnail
  • 웹 요청에 대한 일반적인 처리 흐름

(1)에서 사용자가 보호된 리소스를 요청한다.

(2)에서 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜(Credential)을 요청한다.

사용자의 크리덴셜(Credential)이란 해당 사용자를 증명하기 위한 구체적인 수단을 의미한다. 일반적으로는 사용자의 패스워드가 크리덴셜에 해당한다.

(3)에서 사용자는 인증 관리자에게 크리덴셜(Credential)을 제공한다.

(4)에서 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회한다.

(5)에서 인증 관리자는 사용자가 제공한 크리덴셜과 크리덴셜 저장소에 저장된 크리덴셜을 비교해 검증 작업을 수행한다.

(6) 유효한 크리덴셜이 아니라면 Exception을 throw한다.

(7) 유효한 크리덴셜이라면 (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증한다.

(9) 적절한 권한을 부여 받지 못한 사용자라면 Exception을 throw한다.

(10) 적절한 권한을 부여 받은 사용자라면 보호된 리소스의 접근을 허용한다.

웹 요청에서의 서블릿 필터와 필터 체인의 역할

위 그림에서 사용자의 웹 요청이 Controller 같은 엔드포인트를 거쳐 접근하려는 리소스에 도달하기 전에 인증 관리자나 접근 결정 관리자 같은 컴포넌트가 중간에 웹 요청을 가로채 사용자의 크리덴셜과 접근 권한을 검증하는 것을 볼 수 있다.

이처럼 서블릿 기반 애플리케이션의 경우, 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는 것이 바로 서블릿 필터(Servlet Filter)다.

서블릿 필터는 자바에서 제공하는 API이며, javax.servlet 패키지에 인터페이스 형태로 정의되어 있다.

javax.servlet.Filter 인터페이스를 구현한 서블릿 필터는 웹 요청(request)을 가로채어 어떤 처리(전처리)를 할 수 있으며, 또한 엔드포인트에서 요청 처리가 끝난 후 전달되는 응답(reponse)을 클라이언트에게 전달하기 전에 어떤 처리(후처리)를 할 수 있다.

서블릿 필터는 하나 이상의 필터들을 연결해 필터 체인(Filter Chain)을 구성할 수 있다.

  • Servlet Filter Chain의 구성도

서블릿 필터는 각각의 필터들이 doFilter() 라는 메서드를 구현해야 하며, doFilter() 메서드 호출을 통해 필터 체인을 형성하게 된다.

만약 Filter 인터페이스를 구현한 다수의 Filter 클래스를 그림과 같이 구현했다면 생성한 서블릿 필터에서 작성한 특별한 작업들을 수행한 뒤, HttpServlet 을 거쳐 DispatcherServlet 에 요청이 전달되며, 반대로 DispatcherServlet 에서 전달한 응답에 대해 역시 특별한 작업을 수행할 수 있다.

Spring Security에서의 필터 역할

DelegatingFilterProxyFilterChainProxy 클래스는 Filter 인터페이스를 구현하기 때문에 엄연히 서블릿 필터로써의 역할을 한다.

  • DelegatingFilterProxy

Spring에서 DI의 핵심은 바로 Spring 컨테이너인 ApplicationContext이다.

Spring Security 역시 Spring의 핵심인 ApplicationContext를 이용한다.

서블릿 필터와 연결되는 Spring Security만의 필터를 ApplicationContext에 Bean으로 등록한 후에 이 Bean들을 이용해서 보안과 관련된 여러가지 작업들을 처리하게 되는데 DelegatingFilterProxy 가 Bean으로 등록된 Spring Security의 필터를 사용하는 시작점이라고 생각할 수 있다.

그런데 보안과 관련된 어떤 작업을 처리하는 것이 아니라 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.

  • FilterChainProxy 에서의 Next step

Spring Security의 Filter Chain은 말 그대로 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음이다.

이 Spring Security의 Filter를 사용하기 위한 진입점이 바로 FilterChainProxy 이다.

FilterChainProxy부터 Spring Seucrity에서 제공하는 보안 필터들이 필요한 작업을 수행한다고 생각하면 된다.

Spring Security의 Filter Chain은 URL 별로 여러개 등록할 수 있으며, Filter Chain이 있을 때 어떤 Filter Chain을 사용할지는 FilterChainProxy가 결정하며, 가장 먼저 매칭된 Filter Chain을 실행한다.

예)

  • /api/** 패턴의 Filter Chain이 있고, /api/message URL 요청이 전송하는 경우

    • /api/** 패턴과 제일 먼저 매칭되므로, 디폴트 패턴인 /** 도 일치하지만 가장 먼저 매칭되는 /api/** 패턴과 일치하는 Filter Chain만 실행한다.
  • /message/** 패턴의 Filter Chain이 없는데 /message/ URL 요청을 전송하는 경우

    • 매칭되는 Filter Chain이 없으므로 디폴트 패턴인 /** 패턴의 Filter Chain을 실행한다.

  • Filter 목록

https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters

0개의 댓글