본 Spring Security 시리즈 내용은 인프런 정수원님의 강의 내용을 정리한 시리즈입니다.
상업적 이용 목적의 포스팅 무단 복제 및 사용을 금합니다.
인증 받기 이전의 요청 내용을 캐싱하는 RequestCache
, SavedRequest
에 대해 알아본다.
인증 받지 못해서 redirect 된 경우(예를 들면, 로그인 페이지로 redirect), 이전에 했던 요청 정보를 담고있는 SavedRequest
객체를 쿠키나 세션에 저장하고 필요시에 다시 가져와서 사용할 수 있다.
RequestCache
를 구현한 HttpSessionRequestCache
클래스가 기본으로 제공된다.
SavedRequest
는 이전 요청과 관련된 여러 정보를 저장하고 있다. SavedRequest
객체를 활용하면 로그인과 같은 인증 절차 후 사용자를 인증 이전의 요청했던 원래 페이지로 안내하는 등의 기능을 구현할 수 있다.
SavedRequest
를 구현한 DefaultSavedRequest
가 기본으로 제공된다.
HttpSessionRequestCache
객체에서 savedRequest
메소드를 실행한다.savedRequest
메소드를 통해 HttpSession
에 SavedRequest
를 저장하는데 이 객체가 DefaultSavedRequest
객체이며, DefaultSavedRequest
는 인증 이전의 요청 정보(url 등)를 저장하고 있다.AuthenticationSuccessHandler
가 실행된다.AuthenticationSuccessHandler
에서 HttpSessionRequestCache
를 사용하여 HttpSession
에 저장된 DefaultSavedRequest
객체를 꺼낸다.DefaultSavedReqest
객체에서 인증 이전의 요청 url을 가져와 redirect 시킨다.이 과정을 우리가 구현하지 않아도 스프링 시큐리티에서 이 작업을 해준다.
저장했던 이전 요청을 다시 불러오는 역할을 하는 필터다.
RequestCacheAwareFilter
에서 SavedRequest
가 쿠키 or 세션에 존재하는지 확인한다.
만약 존재하지 않는다면 필터를 실행시키지 않는다.
존재한다면 SavedRequest
와 현재 CurrentRequest
가 일치하는지 확인한다.
일치한다면 다음 필터로 SavedRequest
를 전달하고, 아니라면 현재 요청 객체를 전달한다.
처음 요청 시 인증받지 않은 상태로 사용자가 요청하기 때문에 인증 예외가 발생하게 된다.
따라서 ExceptionTranslationFilter
가 요청을 받게 된다. 여기서 requestCache는 HttpSessionRequestCache
이며, HttpSessionRequestCache
를 통해 요청 객체를 저장한다.
savedRequest
메소드를 살펴보자
현재 요청 객체는 이전 필터에서 넘어온 요청 객체다. 현재 요청 객체다 requestMatcher
와 일치하는지 우선 확인한다.
그리고 DefaultSavedRequest
를 생성하면서 생성자에 현재 요청 객체와 matchingRequestParameterName 필드도 넘겨준다.
그 이후, 세션에 DefaultSavedRequest
객체를 저장한다.
matchingRequestParameterName 필드를 살펴보면 기본으로 "continue" 문자열이 할당되어 있다.
이렇게 되면 인증을 할 수 있는 페이지로 redirect를 하게 된다.
이제 인증을 받게 되면서 일어나는 흐름을 살펴본다.