이전의 한 포스팅에서 프로젝트의 로그인 구현을 위해 Spring Security
와 JWT
를 다룬 적이 있다. 하지만 Spring Security
의 내용이 초심자가 다루기엔 쉽지 않고, 사용해 봤다고 해서 인사이트가 한 번에 생기지는 않는다고 생각하여 새로운 시리즈를 작성하고자 한다..
이번 프로젝트는 Security와 JWT 로그인 방식에 대해 조금 더 깊게 알아 보고자 한다.
Spring Security
에 대해 다시 얘기해보자면, Spring 기반의 웹 애플리케이션에서 보안(인증, 권한)을 구현하기 위한 프레임워크이다.
디테일한 설명에 앞서 먼저, 인증과 인가에 대해 간단하게 알아보자.
Spring Security는 이러한 인증
과 인가
에 대한 부분을 Filter Chain
의 흐름에 따라 처리한다. 그렇다면 과연 이 Filter Chain
란 무엇일까?
Spring Security
프레임워크는 웹 계층에 대한 보안 기능을 서블릿 필터(servlet filter) 기반으로 제공한다. 우선 Servlet Filter Chain
에 대해 알아보자.
Servlet Filter Chain
은 사용자 요청을 가로채고, 필터를 통해 전/후 처리 작업을 수행한다.
동작 순서
- 요청이 서블릿 컨테이너에 도착하면, 컨테이너는 해당 요청에 대해 필터 체인을 실행.
- 필터 체인은 여러 개의 필터로 구성되어 있으며, 각 필터는 특정한 작업을 수행.
- 요청은 필터 체인을 따라 차례대로 필터들을 거치면서 작업을 수행.
- 필터 체인을 통과한 후에는 서블릿이 요청에 대한 처리를 수행하고, 응답을 생성.
(https://spring.io/guides/topicals/spring-security-architecture/)
Spring Security 프레임워크는 인증
에 필요한 기능들을 FilterChainProxy
를 통해 관리한다. FilterChainProxy
는 서블릿 컨테이너 입장에선 하나의 필터이지만, 그 내부에는 보안 로직을 수행하는 필터들이 리스트의 형태로 존재한다.
(https://spring.io/guides/topicals/spring-security-architecture/)
내부의 필터들은 저마다의 역할을 수행하게 된다.
(https://bamdule.tistory.com/52)
FilterChainProxy
는 SecurityFilterChain
을 사용하여 요청에 따라 적절한 보안 필터 체인을 선택하여 실행한다.
즉, URL 경로에 따라 실행되는 필터들이 달라지게 된다.
(https://spring.io/guides/topicals/spring-security-architecture/)
클라이언트로부터 요청을 받게 되면 바로 서블릿에 오지않고 여러 개의 필터들로 구성된 Filter Chain
을 거치게 된다. 거치게 되는 필터 중 Spring Security가 관리하는 FilterChainProxy
에서 SecurityFilterChain
을 호출하여 요청 URL에 따른 적절한 보안 로직을 수행한다.