본문 바로가기

spring security

요청 캐시 RequestCache / SavedRequest

정수원님의 **스프링 시큐리티 완전 정복** 강의 내용 기록입니다 !!

 

 

 

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

 

SavedRequest
  • SavedRequest는 로그인과 같은 인증 절차 후 사용자를 인증 이전의 원래 페이지로 안내함
  • 이전 요청과 관련된 여러 정보를 저장
  • SavedRequest는 인터페이스, 이를 구현한 객체는 DefaultSavedRequest
  • redirectUrl : 이전 요청 url

 

 

흐름도

 

client

↓  Get  /user

인증받지 않은 상태로 접근한 경우

HttpSessionRequestCache

saveRequest()

HttpSession에 DefaultSavedRequest 객체 생성하여 저장
- "/user"인 redirectUrl 포함됨

redirect(/login)

 

↓  Get  /login

인증 시도

AuthenticationSuccessHandler

HttpSessionRequestCache

HttpSession에서 DefaultSavedRequest 객체에 접근하여
- null이 아니면 getRedirectUrl()

redirect(/user) : 가져온 url로 리다이렉트

 

 

requestCache() API
  • 요청 Url에 특정 이름의 매개변수가 있는 경우에만 HttpSession에 저장된 SavedRequest를 꺼내오도록 설정할 수 있음
  • 기본값은 'coutinue'

  • setMatchingRequestParameterName : parameter로 customParam=y가 붙어야 savedRequest를 확인하고 리다이렉트 시킴
  • 예) localhost:8080/home?customParam=y 
  • matchingRequestParameterName을 특정 문자열로 지정한 HttpSessionRequestCache 객체를 생성 후 지정

  • 요청을 저장하지 않도록 하는 경우
  • 즉, 모든 요청에 대해 인증 시도 후 이전 페이지로 리다이렉트 진행하지 않음
  • NullRequestCache 객체를 생성하여 지정

 

RequestCacheAwareFilter
  • 이전에 저장했던 웹 요청(SavedRequest)을 다시 불러오는 역할을 함
  • SavedRequest가 현재 Request와 일치하는지 검사 후, 일치하면 현재 요청 대신 savedRequest를 필터 체인의 doFilter 메소드에 전달함
  • SavedRequest가 없으면 필터는 원래 Request로 그대로 진행

 

** 인증받지 않은 상태로 접근한 경우에 대해서만 SavedRequest 객체를 session에 저장하도록 함

→ 모든 경우에 대해 이 과정을 진행하면 성능상 좋지 않음 !

→ RequestCacheAwareFilter에서는 저장된 SavedRequest 객체가 있는지 확인한 후, 있는 경우에 대해서만 이전 요청을 불러오도록 처리

 

 

흐름도

 

client

↓  Get  /user

RequestCacheAwareFilter

SavedRequest != null : SavedRequest가 쿠키 혹은 세션에 존재하는지 확인

Yes

SavedRequest == currentRequest : SavedRequest가 현재 Request와 일치하는지 확인

Yes : chain.doFilter(SavedRequest, response)
No : chain.doFilter(request, response)

 

No

chain.doFilter

리다이렉트 되어야 하는 SavedRequest가 존재하지 않으므로 다음 필터로 패스

 

 

동작 과정

 

1. 인증이 필요한 로그인 없이 url에 방문 ("/")

 

2. 로그인 페이지로 리다이렉트됨

  • 이 과정에서 HttpSessionRequestCache를 통해 redirectUrl이 해당 url로 지정된 DefaultSavedRequest 객체가 생성되어 HttpSession에 저장됨

3. 로그인 진행

 

4. 인증 성공 후 지정된 machingRequestParameterName이 파라미터로 추가되어 원래 요청 url로 리다이렉트됨

 

 

** 만약 로그인 이전에 인증이 필요한 url에 접근한 경우가 아닌 직접 /login 페이지에 접근한 경우라면?

→ SavedRequest 객체가 세션에 저장되지 않고, RequestCacheAwareFilter에서 null 체크 후 작업을 수행하지 않아 파라미터 없이 리다이렉트됨

→ 저장된 이전 요청이 없기 때문에 이전 요청 리다이렉트가 불필요

→ 이 경우 로그인 성공 시 기본값인 "/"로 리다이렉트되도록 설정되어 있기 때문에 "/" 페이지로 이동한 것 !