elevne's Study Note

Spring Security : JWT 적용해보기 (1) 본문

Backend/Spring

Spring Security : JWT 적용해보기 (1)

elevne 2023. 6. 10. 22:34

Spring SecurityServlet Filter 에 기반하여 작동한다고 한다. 이를 이해하기 위해 우선 Filter 의 역할에 대해 알아보아야 했다. Filter 이란 서버가 보내거나 받는 자료에 적용되는 작업을 말한다. 클라이언트가 서버에 보내는 자료는 입력필터가 처리하고, 서버가 클라이언트에 보내는 자료는 출력필터가 처리한다. 데이터에 여러 개의 필터를 사용할 수 있으며, 그 여러 개의 필터의 순서를 지정해줄 수도 있다.

 

 

 

Filter, FilterChain

 

 

클라이언트가 애플리케이션에 요청을 보내면, 컨테이너는 Filter 인스턴스들과 서블릿을 포함하여 HttpServletRequest 를 처리하는 FilterChain 이라는 것을 만들게된다. Spring MVC 구조에서 ServletDispatcherServlet 의 인스턴스이다. 여기서 DispatcherServlet 이란 HTTP 프로토콜로 들어오는 모든 요청을 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러이다. 과거에는 web.xml 파일에 모든 서블릿을 URL 매핑을 위해 등록해주어야 했지만, dispatcher-servlet 이 애플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리해주게 되면서 매우 편리해졌다고 한다. Filter 는 FilterChain 에 적용될 수 있기에 강력하다고 한다. Filter 은 Downstream Filter 에 영향을 주기 때문에 Filter 간 순서가 중요하다고 한다.

 

 

 

DelegatingFilterProxy

 

스프링은 Filter 의 구현체인 DelegatingFilterProxy, Spring 의 ApplicationContext 와 Servlet Containter Lifecycle 을 연결해주는 기능을 제공한다. Servlet Container 은 Filter 인스턴스들을 등록할 수 있게끔하긴 하지만, 이를 Spring defined Bean 들에게 알려주는 작업이 따로 필요하다. 이 때 DelegatingFilterProxy 를 등록할 수 있는 것이다.

 

 

DelegatingFilterProxy

 

 

DelegatingFilterProxy 는 Application Context 내에서 Bean Filter0 을 찾고 실행시킨다.

 

 

 

FilterChainProxy

 

FilterChainProxy 는 스프링 시큐리티에서 제공하는 특별한 필터다. SecurityFilterChain 이라는 것을 통해 많은 Filter 에 작업을 위임하는 것이다. FilterChainProxy 는 Bean 으로 등록되어 있기에 보통 DelegatingFilterProxy 로 감싸져있다고 한다.

 

 

FilterChainProxy

 

 

 

SecurityFilterChain

 

SecurityFilterChainFilterChainProxy 에서 사용되며, Spring Security Filter 에서 request 를 받고 실행되어야 할 것들을 명시해주는 곳이다.

 

 

SecurityFilterChain

 

 

SecurityFilterChain 내의 SecurityFilter 들은 일반적으로 Bean 으로 등록되어 있으나, DelegatingFilterProxy 가 아닌 FilterChainProxy 로 등록된다. FilterChainProxy 를 이용하는 것이 몇 가지 이점을 가져다준다고 한다. 첫 째로, 이는 Spring Security 의 시작점으로 사용되어 디버깅할 때 편리함을 주기도 한다. 또, FilterChainProxy 는 스프링 시큐리티의 중심으로, 필수적인 일들을 상당수 처리해준다. 메모리 누수를 막기 위해 SecurityContext 를 clear 해주거나, HttpFirewall 을 이용하여 특정 공격에 대비하기도 한다. 

 

 

SecurityFilterChain

 

 

위와 같이 여러 개의 SecurityFilterChain 이 적용된 구조에서는 FilterChainProxy 는 어떤 SecurityFilterChain 을 적용할 것인지 정해야한다. 이 때 URL 매핑을 통해서 선택하게끔 한다. 만약 /api/messages 라는 URL 로 요청이 들어오면 가장 먼저 위의 /api/** SecurityFilterChain0 이 매칭된다. 만약 /abcd/efgh 라는 URL 로 요청이 들어오게 되면 아무것도 매칭되지 않아 가장 마지막 SecurityFilterChainN 이 동작하게 될 것이다.

 

 

이러한 SecurityFilterChain 내에서 사용되는 Filter 의 종류는 상당히 많다.

 

 

Filter 종류

 

 

 

내일은 JWT 에 대해서 알아보고, 이를 어떻게 Spring Boot 에서 적용할 수 있는지 알아볼 예정이다.

 

 

 

 

Reference:

https://mangkyu.tistory.com/18

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

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

Spring WebSocket  (0) 2023.06.28
Spring Security : JWT 적용해보기 (2)  (0) 2023.06.11
Spring Boot Project (1)  (0) 2023.06.06
Spring Boot 복습 (6)  (0) 2023.04.10
Spring Boot 복습 (5)  (0) 2023.04.09