요청 캐시 RequestCache / SavedRequest

정민교·2024년 7월 14일
0

spring security

목록 보기
9/13
post-thumbnail

📒참고

본 Spring Security 시리즈 내용은 인프런 정수원님의 강의 내용을 정리한 시리즈입니다.

상업적 이용 목적의 포스팅 무단 복제 및 사용을 금합니다.

강의 주소: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5#

📒목표

인증 받기 이전의 요청 내용을 캐싱하는 RequestCache, SavedRequest에 대해 알아본다.

📒개요

✔️RequestCache

인증 받지 못해서 redirect 된 경우(예를 들면, 로그인 페이지로 redirect), 이전에 했던 요청 정보를 담고있는 SavedRequest 객체를 쿠키나 세션에 저장하고 필요시에 다시 가져와서 사용할 수 있다.

RequestCache를 구현한 HttpSessionRequestCache 클래스가 기본으로 제공된다.

✔️SavedRequest

SavedRequest는 이전 요청과 관련된 여러 정보를 저장하고 있다. SavedRequest 객체를 활용하면 로그인과 같은 인증 절차 후 사용자를 인증 이전의 요청했던 원래 페이지로 안내하는 등의 기능을 구현할 수 있다.

SavedRequest를 구현한 DefaultSavedRequest가 기본으로 제공된다.

✔️간단 흐름

  1. 인증받지 않은 사용자가 서버에 접근한다(ex. "/user" 경로로 접근)
  2. HttpSessionRequestCache 객체에서 savedRequest 메소드를 실행한다.
  3. savedRequest 메소드를 통해 HttpSessionSavedRequest를 저장하는데 이 객체가 DefaultSavedRequest 객체이며, DefaultSavedRequest는 인증 이전의 요청 정보(url 등)를 저장하고 있다.
  4. 인증을 위해 인증을 할 수 있는 경로로 redirect 시킨다.
    ...
  5. 인증에 성공하여 AuthenticationSuccessHandler가 실행된다.
  6. AuthenticationSuccessHandler에서 HttpSessionRequestCache를 사용하여 HttpSession에 저장된 DefaultSavedRequest 객체를 꺼낸다.
  7. DefaultSavedReqest 객체에서 인증 이전의 요청 url을 가져와 redirect 시킨다.

이 과정을 우리가 구현하지 않아도 스프링 시큐리티에서 이 작업을 해준다.

✔️RequestCacheAwareFilter

저장했던 이전 요청을 다시 불러오는 역할을 하는 필터다.

RequestCacheAwareFilter 에서 SavedRequest가 쿠키 or 세션에 존재하는지 확인한다.

만약 존재하지 않는다면 필터를 실행시키지 않는다.

존재한다면 SavedRequest와 현재 CurrentRequest가 일치하는지 확인한다.

일치한다면 다음 필터로 SavedRequest를 전달하고, 아니라면 현재 요청 객체를 전달한다.

📒전반적인 흐름

처음 요청 시 인증받지 않은 상태로 사용자가 요청하기 때문에 인증 예외가 발생하게 된다.

따라서 ExceptionTranslationFilter가 요청을 받게 된다. 여기서 requestCache는 HttpSessionRequestCache이며, HttpSessionRequestCache를 통해 요청 객체를 저장한다.

savedRequest 메소드를 살펴보자

현재 요청 객체는 이전 필터에서 넘어온 요청 객체다. 현재 요청 객체다 requestMatcher와 일치하는지 우선 확인한다.

그리고 DefaultSavedRequest를 생성하면서 생성자에 현재 요청 객체와 matchingRequestParameterName 필드도 넘겨준다.

그 이후, 세션에 DefaultSavedRequest 객체를 저장한다.

matchingRequestParameterName 필드를 살펴보면 기본으로 "continue" 문자열이 할당되어 있다.

이렇게 되면 인증을 할 수 있는 페이지로 redirect를 하게 된다.

이제 인증을 받게 되면서 일어나는 흐름을 살펴본다.

profile
백엔드 개발자

0개의 댓글