CS 스터디 - 스프링 시큐리티 Overview

Lilac-_-P·2023년 6월 12일
0

Spring 또는 Spring Boot를 이용해서 웹 백엔드 서버를 개발하는 경우,
사용자 인증과 인가를 처리하기 위해 Spring Security를 많이 사용한다.

Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크로, Spring Security는 인증과 인가에 대한 부분을 Java Servlet Filter 흐름에 따라 처리하고 있다.

Java Servlet Filter

서블릿에 관련된 설명은 이 링크를 참고하자.

서블릿에 대한 이해가 선행되었다는 가정하에,
스프링 프레임워크의 웹 요청에 대한 처리는 아래의 사진과 같은 순서로 처리된다.

자바 서블릿 필터는 이름에서도 알 수 있듯 정수기 필터, 에어컨 필터, 담배의 필터와 같이 웹 통신상에서 무언가를 걸러내는 필터를 말한다. 필터는 주로 웹과 관련된 공통 관심사(로그인, 사용자 권한)를 처리할 때 주로 사용한다.

Spring MVC의 시작은 Dispatcher Servlet인데, Java Servlet Filter는 Dispatcher Servlet으로 가기 전인 WAS 단에서 적용되므로 Spring Security는 Spring MVC에 웹 요청이 도달하기 전에 먼저 URL 요청을 받는다.

참고.
Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다.
Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 보안관련 로직을 직접 작성하지 않아도 된다는 장점이 있다.

Spring Security가 포함된 Spring의 아키텍쳐는 아래와 같다.

중요하게 알아야할 것은 DelegatingFilterProxy와 FilterChainProxy이다. 이 둘에 대해 더 알아보자.

DelegatingFilterProxy

위에서도 잠깐 언급했지만, 스프링 시큐리티는 자바 서블릿 필터기반으로 동작한다.
스프링 프레임워크에서 제공하는 스프링 컨테이너는 자바 클래스의 인스턴스를 설정에 맞게 Bean으로 등록하여 관리해주는데, 자바 서블릿 필터는 Tomcat과 같은 WAS, 즉 서블릿 컨테이너 단에 적용되는 것이기 때문에 스프링 컨테이너에 등록된 빈을 사용할 수가 없다.

그래서 스프링 시큐리티는 서블릿 컨테이너와 스프링 컨테이너를 연결해주기 위해서 DelegatingFilterProxy를 제공한다. 즉, DelegatingFilterProxy는 서블릿 필터이며, Spring 컨테이너에서 관리하는 Filter Bean을 사용할 수 있도록 DelegatingFilterProxy가 들어오는 웹요청을 위임하는 역할을 한다.

FilterChainProxy

FilterChainProxy는 DelegatingFilterProxy에서 실제 작업을 요청을 위임받아 필터 기능을 수행한다. 소스코드 내부를 보면 FilterChainProxy 역시 처리를 위임하기 위한 SecurityFilterChain을 들고 있는데, SecurityFilterChain에 들어있는 SecurityFilter들이 요청을 처리하는 필터로서 동작한다. 설정에 따라서 SecurityFilterChain이 하나고 될 수도 있고 여러개가 될 수도 있으며 SecurityFilterChain안에 걸릴 Security Filter들을 다르게 설정할 수 있다.

결과적으로 Spring Security의 DelegatingFilterProxy와 FilterChainProxy는 서블릿 컨테이너(WAS)로 들어오는 요청에 대해 아래의 그림처럼 동작한다.

스프링 시큐리티에는 인증과 인가에 관련된 기능들이 다양하게 구현되어있어서, 간편한 설정을 통해 직접 코드를 작성하지 않더라도 제공되는 API를 통해 편리하게 사용할 수 있다.

Additional Keyword

  1. HttpSecurity
  2. SecurityContextHolder
  3. Spring Security의 아키텍쳐와 내부동작

<스프링 시큐리티 아키텍쳐 예시>

profile
열심히 하자

0개의 댓글