본문 바로가기

Language/Spring Security

요청 캐시 - RequestCache / SavedRequest

RequestCache

  • 인증 절차 문제로 리다이렉트 된 후에 이전에 했던 요청 정보를 담고 있는 ‘SavedRequest’ 객체를 쿠키 혹은 세션에 저장하고 필요 시 다시 실행하는 캐시 메커니즘
  • RequestCache 인터페이스의 구현체 ⇒ HttpSessionRequestCache

 

SavedRequest

  • 로그인과 같은 인증 절차 후 사용자를 인증 이전의 원래 페이지로 안내하며 이전 요청과 관련된 여러 정보를 저장
  • SavedRequest 인터페이스 구현체 ⇒ DefaultSavedRequest

 

  • RequestCache는 SavedRequest를 세션이나 쿠키에 저장을 하고 필요 시 SavedRequest를 꺼내와서 그 안의 API를 활용하여 어떤 처리를 하는 관계

흐름도

  • 인증 받지 않은 상태로 접근
    1. HttpSessionRequestCache가 savedRequest의 구현체인 DefaultSavedRequest를 HttpSession에 저장
      → 기본적으로 Session에 저장
    2. DefaultSavedRequest에는 인증 이전의 정보(/user)를 저장
    3. 다시 인증을 받도록 /login 페이지로 리다이렉트
  • 인증 시도
    1. 인증 성공 시 AuthenticationSuccessHandler 호출
    2. HttpSessionRequestCache를 가지고 HttpSession에 저장된 DefaultSavedRequest를 가지고 옴
    3. getRedirectUrl() 메서드로 인증 이전에 있던 URL(/user)을 가지고 와서 리다이렉트

requestCache() API

  • 요청 URL에 customParam=y 라는 이름의 매개 변수가 있는 경우에만 HttpSession에 저장된 SavedRequest를 꺼내오도록 설정 가능 (기본값 = continue)
    • 흐름도를 기준으로 인증을 받지 않은 상태로 접근한 경우에만 Session의 DefaultSavedRequest를 꺼내서 인증 이전의 URL로 리다이렉트를 해주면 됨
    • 일반적인 인증 시도(/login으로 요청)한 경우에도 굳이 세션에 접근하여 SavedRequest를 꺼내어 비교하는 등의 비효율적인 처리를 방지

  • 요청을 저장하지 않도록 하려면 NullRequestCache 구현 사용 가능

RequestCacheAwareFilter

  • 이전에 저장했던 웹 요청을 다시 불러오는 역할
  • SavedRequest가 현재 Request와 일치하면 savedReqeust를 필터 체인의 doFilter메소드의 매개 변수로 사용
  • SavedRequest가 없으면 필터는 원래 Request를 그대로 진행
  1. 클라이언트 요청
  2. RequestCacheAwareFilter 수신
  3. SavedRequest가 쿠키 혹은 세션에 존재하는 지 확인
    • 존재하지 않을 경우 다음 필터로 진행(chain.doFilter)
  4. SavedRequest == currentRequest 일치 여부 확인
    • 일치 ⇒ 세션에 저장되었던 savedRequest 정보로 chain.doFilter
    • 불일치 ⇒ 현재 Request로 chain.doFilter

정리

  • RequestCache를 이용하여 인증 전의 정보(URL)를 SavedRequest에 담아 Session에 저장
  • 인증(로그인) 성공 시 세션에 저장된 SavedRequest의 URI를 가지고 인증 전에 요청한 페이지로 리다이렉트 가능
  • 모든 URL에 대해 SavedRequest를 확인하지 않도록 세션에 저장된 SavedRequest와 현재 Request가 일치하는 지 비교