본문 바로가기
Web/Spring-Security

[Security] 시큐리티 파헤치기 (2) : RequestCacheAwareFilter, RequestCache

by 희조당 2023. 8. 2.
728x90

🙋 들어가며

스프링 시큐리티 필터에는 다양한 필터들이 존재합니다.
오늘은 그중에서 인증, 인가를 위해서 가로채진 요청을 어떻게 다시 수행하는지 알아보겠습니다.


↩️ RequestCacheAwareFilter

이름에서 어떤 역할을 하는지 대략적으로 알 수 있습니다. 대충 요청에 대한 캐시를 알고 있는 필터 같습니다.

동작을 이해하기 위해서는 내부적으로 무엇을 가지고 있는지 알아야 합니다.

그림 1 : RequestCache를 가지고 있는 RequestCacheAwareFilter

🏛️ 시큐리티 아키텍처

시큐리티는 결국 인증과 인가를 위한 프레임워크입니다.

인증을 위한 Authentication Manager와 인가를 위한 Access Decision Manager가 핵심입니다.

 

요청한 자원이 인증이 필요하다면 요청을 가로채 인증한 뒤 다시 원래 요청으로 되돌아가야 합니다.

시큐리티는 RequestCache를 사용해서 HttpServletRequest를 원래 요청을 저장합니다.

그림 2 : 시큐리티 아키텍쳐 구조

💿 RequestCache

이 글의 목표인 RequestCacheAwareFilter는 RequestCache를 사용합니다.

인터페이스인 RequestCache는 기본적으로 HttpSessionRequestCache를 사용합니다.

 

예시를 위해서 인증이 필요한 '/mypage'라는 페이지로 접근해서 디버깅을 해보겠습니다.

HttpSessionRequestCache의 saveRequest()로 요청이 타고 들어와 저장되는 것을 확인할 수 있습니다.

그림 3 : 세션에 저장되는 요청 정보

이후 인증에 성공하면 RequestCacheAwareFilter에서 getMatchingRequest()를 사용해서 저장된 요청을 불러옵니다.

그림 4 : 내부 캐시에서 맞는 요청 호출
그림 5 : getMatchingRequest 메서드

디버깅을 통해서 request에 들어있는 값은 우리가 요청했었던 '/mypage'임을 알 수 있습니다.

그림 6 : 캐시에서 가져온 요청 경로

마지막으로 캐시에서 요청을 지우고 필터에서 사용할 수 있는 형태로 넘겨줍니다.

그림 7 : 캐시에서 요청을 지우고 SavedRequestAwareWrapper 리턴

이후 그대로 필터 체인에 태워 보내면서 기존 요청을 수행하는 것을 알 수 있습니다.

그림 8 : 시큐리티 필터로 흘려보낸다


😋 정리

이렇게 필터가 어떻게 동작하는지 알아봤습니다!

간단하게 정리하면 다음과 같습니다.

  • RequestCacheAwareFilter는 기존의 요청으로 돌아가게 해준다.
  • 내부적으로 RequestCache라는 저장소를 사용한다.

-Reference

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

https://www.slideshare.net/analizator/spring-security-framework

 

😋 지극히 개인적인 블로그지만 댓글과 조언은 제 성장에 도움이 됩니다 😋

댓글