elevne's Study Note
Spring Security : JWT 적용해보기 (1) 본문
Spring Security 는 Servlet Filter 에 기반하여 작동한다고 한다. 이를 이해하기 위해 우선 Filter 의 역할에 대해 알아보아야 했다. Filter 이란 서버가 보내거나 받는 자료에 적용되는 작업을 말한다. 클라이언트가 서버에 보내는 자료는 입력필터가 처리하고, 서버가 클라이언트에 보내는 자료는 출력필터가 처리한다. 데이터에 여러 개의 필터를 사용할 수 있으며, 그 여러 개의 필터의 순서를 지정해줄 수도 있다.
클라이언트가 애플리케이션에 요청을 보내면, 컨테이너는 Filter 인스턴스들과 서블릿을 포함하여 HttpServletRequest 를 처리하는 FilterChain 이라는 것을 만들게된다. Spring MVC 구조에서 Servlet 은 DispatcherServlet 의 인스턴스이다. 여기서 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 는 Application Context 내에서 Bean Filter0 을 찾고 실행시킨다.
FilterChainProxy
FilterChainProxy 는 스프링 시큐리티에서 제공하는 특별한 필터다. SecurityFilterChain 이라는 것을 통해 많은 Filter 에 작업을 위임하는 것이다. FilterChainProxy 는 Bean 으로 등록되어 있기에 보통 DelegatingFilterProxy 로 감싸져있다고 한다.
SecurityFilterChain
SecurityFilterChain 은 FilterChainProxy 에서 사용되며, Spring Security Filter 에서 request 를 받고 실행되어야 할 것들을 명시해주는 곳이다.
SecurityFilterChain 내의 SecurityFilter 들은 일반적으로 Bean 으로 등록되어 있으나, DelegatingFilterProxy 가 아닌 FilterChainProxy 로 등록된다. FilterChainProxy 를 이용하는 것이 몇 가지 이점을 가져다준다고 한다. 첫 째로, 이는 Spring Security 의 시작점으로 사용되어 디버깅할 때 편리함을 주기도 한다. 또, FilterChainProxy 는 스프링 시큐리티의 중심으로, 필수적인 일들을 상당수 처리해준다. 메모리 누수를 막기 위해 SecurityContext 를 clear 해주거나, HttpFirewall 을 이용하여 특정 공격에 대비하기도 한다.
위와 같이 여러 개의 SecurityFilterChain 이 적용된 구조에서는 FilterChainProxy 는 어떤 SecurityFilterChain 을 적용할 것인지 정해야한다. 이 때 URL 매핑을 통해서 선택하게끔 한다. 만약 /api/messages 라는 URL 로 요청이 들어오면 가장 먼저 위의 /api/** SecurityFilterChain0 이 매칭된다. 만약 /abcd/efgh 라는 URL 로 요청이 들어오게 되면 아무것도 매칭되지 않아 가장 마지막 SecurityFilterChainN 이 동작하게 될 것이다.
이러한 SecurityFilterChain 내에서 사용되는 Filter 의 종류는 상당히 많다.
내일은 JWT 에 대해서 알아보고, 이를 어떻게 Spring Boot 에서 적용할 수 있는지 알아볼 예정이다.
Reference:
'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 |