본문 바로가기
Develop/Spring

Spring Security 웹 요청 흐름

by jaeyoungb 2022. 11. 19.

보안이 적용된 웹 요청의 일반적인 흐름

 

보안이 적용된 일반적인 웹 요청 흐름

 

1. 사용자가 보호된 리소스를 요청

2. 인증 관리자 역할을 하는 컴포넌트가 사용자의 Credential(password)을 요청

3. 사용자가 Credential 제공

4. 인증 관리자 컴포넌트가 Credential 저장소에서 사용자의 Credential을 조회

5. 인증 관리자 컴포넌트가 Credential 저장소에 있는 Credential과 비교하며 검증 작업 수행

6-1. 유효한 Credential이 아닐 경우, Exception throw

6-2. 유효한 Credential일 경우, 접근 결정 관리자 역할을 하는 컴포넌트가 사용자가 적절한 권한을 부여받았는지 검증

7-1. 적절한 권한을 부여받지 못한 사용자일 경우, Exception throw

7-2. 적절한 권한을 부여받은 사용자일 경우, 보호된 리소스의 접근을 허용

 

 

위 과정에서 인증 관리자, 접근 결정 관리자 컴포넌트들을 서블릿 필터(Servlet Filter)라고 한다.

 

서블릿 필터

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

javax.servlet.Filter 인터페이스를 구현한 서블릿 필터는 중간에 웹 요청을 전처리 및 후처리할 수 있다.

 

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

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

 

Servlet Filter Chain 구성도

 

- 서블릿 필터에 대해
  https://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html

 

 

Spring Security에서의 서블릿 필터

필터 체인 사이에 Spring Security Filter가 추가될 수 있다.

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

 

Servlet Filter Chain에 Spring Security Filter Chain이 추가

 

DelegatingFilterProxy

서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결시켜주는 브릿지 역할을 한다.

(Spring Security 또한 Spring의 핵심인 ApplicationContext를 이용한다)

 

FilterChainProxy

Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행하기 위한 진입점 역할을 한다.

- Spring Security에서 제공하는 보안 필터들에 대해

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

 

 

FilterChain 적용

  • Spring Boot에서 FilterResgistrationBean을 이용해 Filter를 등록할 수 있다.
  • Spring Boot에서 등록하는 Filter는 다음 방법으로 실행의 순서를 지정할 수 있다.
    • Spring Bean으로 등록되는 Filter에 @Order 애너테이션을 추가하거나 Orderd 인터페이스를 구현
    • FilterRegistrationBean의 setOrder() 메서드를 이용

'Develop > Spring' 카테고리의 다른 글

Spring Security 권한 부여 처리 흐름  (0) 2022.11.22
Spring Security 인증 처리 흐름  (0) 2022.11.21
Spring Security - 기본  (0) 2022.11.19
인증/보안 기초  (1) 2022.11.17
Intellij에서 MySQL 연동 및 DB에 데이터 저장  (3) 2022.11.16