Spring Security 복습
보안이 적용된 웹 요청의 일반적인 처리 흐름
- (1)에서 사용자가 보호된 리소스를 요청합니다.
- (2)에서 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜(Credential)을 요청합니다.
- 사용자의 크리덴셜(Credential)이란 해당 사용자를 증명하기 위한 구체적인 수단을 의미합니다. 일반적으로는 사용자의 패스워드가 크리덴셜에 해당합니다.
- (3)에서 사용자는 인증 관리자에게 크리덴셜(Credential)을 제공합니다.
- (4)에서 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회합니다.
- (5)에서 인증 관리자는 사용자가 제공한 크리덴셜과 크리덴셜 저장소에 저장된 크리덴셜을 비교해 검증 작업을 수행합니다.
- (6) 유효한 크리덴셜이 아니라면 Exception을 throw 합니다.
- (7) 유효한 크리덴셜이라면 (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증합니다.
- (9) 적절한 권한을 부여받지 못한 사용자라면 Exception을 throw합니다.
- (10) 적절한 권한을 부여받은 사용자라면 보호된 리소스의 접근을 허용합니다.
웹 요청에서의 서블릿 필터와 필터 체인의 역할
사용자의 웹 요청이 Controller 같은 엔드포인트를 거쳐 접근하려는 리소스에 도달하기 전에 인증 관리자나 접근 결정 관리자 같은 컴포넌트가 중간에 웹 요청을 가로채 사용자의 크리덴셜과 접근 권한을 검증하는 것을 볼 수 있습니다.
이처럼 서블릿 기반 애플리케이션의 경우, 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는데 그것은 바로 서블릿 필터(Servlet Filter)입니다.
서블릿 필터는 각각의 필터들이 doFilter()라는 메서드를 구현해야 하며, doFilter() 메서드 호출을 통해 필터 체인을 형성하게 됩니다.
만약 Filter 인터페이스를 구현한 다수의 Filter 클래스를 생성한 서블릿 필터에서 여러분들이 작성한 특별한 작업을 수행한 뒤, HttpServlet을 거쳐 DispatcherServlet에 요청이 전달되며, 반대로 DispatcherServlet에서 전달한 응답에 대해 역시 특별한 작업을 수행할 수 있습니다.
Spring Security에서의 필터 역할
서블릿 필터는 클라이언트의 요청 중간에 끼어들어 무언가 추가적인 작업을 할 수 있다고 했습니다.
그렇다면 "Spring Security에서도 분명 이 필터를 이용해 클라이언트의 요청을 중간에 가로챈 뒤, 추가로 어떤 작업을 하는 거 아닐까?"라고 예상할 수 있습니다.
이름만 조금 다를 뿐이지 DelegatingFilterProxy와 FilterChainProxy 클래스는 Filter 인터페이스를 구현하기 때문에 엄연히 서블릿 필터로써의 역할을 합니다.
그런데 이 DelegatingFilterProxy와 FilterChainProxy는 조금 특별한 필터라고 보면 됩니다.
⭐ DelegatingFilterProxy
Spring에서 DI의 핵심은 바로 Spring 컨테이너인 ApplicationContext라는 사실입니다.
그런데 DelegatingFilterProxy라는 이름에서 알 수 있듯이 보안과 관련된 어떤 작업을 처리하는 것이 아니라 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해 주는 브리지 역할을 합니다.
그렇다면 FilterChainProxy의 역할은 무엇일까요?
⭐ FilterChainProxy
Spring Security의 Filter Chain은 말 그대로 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음입니다.
이 Spring Security의 Filter를 사용하기 위한 진입점이 바로 FilterChainProxy입니다.
한마디로 FilterChainProxy부터 Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행한다고 생각하면 되겠습니다.
Spring Security에서 지원하는 Filter 종류
Spring Security는 보안을 위한 특정 작업을 수행하기 위한 다양한 Filter를 지원하는데 그 수가 굉장히 많습니다.
따라서 Spring Security의 Filter가 각각 어떤 역할을 수행하는지는 전부 다 알 필요는 없으며, 필요한 상황이 되었을 때 그때그때 적용해도 상관은 없습니다.
그리고 Spring Security의 Filter 항상 모든 Filter가 수행되는 것이 아니라 프로젝트 구성 및 설정에 따라 일부의 Filter만 활성화되어 있기 때문에 직접적으로 개발자가 핸들링할 필요가 없는 Filter들이 대부분입니다.
따라서 개발자가 Custom Filter를 작성하고 등록할 경우 기존 필터들 사이에서 우선순위를 적용해 수행되어야 할 필요가 있는 경우에 참고해서 적용하면 됩니다.