RequestCache

RequestCache, 어떤 요청 객체를 캐시화한다는 의미로, SavedRequest 타입의 객체가 있는데 이걸 쿠키나 세션에 저장하기도 하고 필요 시 쿠키나 세션으로부터 꺼내와 어떤 사용을 위해 처리한다.

스크린샷 2025-02-02 오후 5.06.14.png

현재 4개의 API 를 볼 수 있다. Request 객체를 가져오거나 저장하거나 삭제하는 API가 있다. getRequest, getMatchingReqeust는 Request를 쿠키나 세션으로부터 꺼내오며, SavedRequest는 요청 객체, Request를 저장하고 RemoveRequest는 요청 객체를 삭제한다. 이 부분에 대해서는 차차 자세히 설명할 것.

RequestCache 는 인터페이스로 이 인터페이스를 구현한 구현체가 하나 제공된다. 그게 HttpSessionRequestCache 이다. 즉 세션에 Request를 저장하는 것.

SavedRequest

일단 SavedRequest는 인증 요청 정보에 대한 여러가지 정보를 저장하는 객체이다. 밑 그림을 보면 여러 개의 API 들이 정의되어 있다. 요청 정보 관련 여러 가지 우리가 참조할 수 있는 API가 기술되어있다. SavedRequest도 인터페이스고 인터페이스를 구현한 구현체가 적용되는데 그게 DefaultSavedRequest 라는 클래스다.

RequestCacheSavedRequest 객체를 세션 또는 쿠키에 저장하고 필요할 때 세션이나 쿠키로부터 SavedRequest를 꺼내와 SavedRequest가 제공하는 API를 활용해 어떤 처리를 할 수 있는 관계라고 1차적으로 이해.

스크린샷 2025-02-02 오후 5.06.45.png

스크린샷 2025-02-02 오후 5.07.02.png

이 둘 사이의 관계를 흐름도를 통해 더 자세하게 풀이해볼 것.

클라이언트가 있고 클라이언트가 /user 경로로 요청을 하고 있다. 이때 처음에는 인증받지 않는 상태로 서버에 접근한다고 가정하고 그 다음 /user 경로는 인증받지 않는 사용자는 접근이 안된다고 가정하자.

그렇게 되면 인증받지 못한 상태로 접근했기 때문에 이제 인증을 받아야 될 것. 인증을 받기 전에 어떤 내부적 처리가 이루어지냐면 HttpSessionRequestCache 라는 클래스의 객체가 SavedRequest 에서 어떤 Request 객체를 저장한다. 그 저장하는 객체가 바로 앞에서 설명한 DefaultSavedRequest 이 클래스의 객체를 만든다. 만들어 기본적으로는 Session에 저장한다. 이 객체에는 어떤 정보가 들어있냐면 인증 받지 않은 상태에서 접근하고자 했던 요청 정보인 User 이런 정보들을 여기 저장한다. 인증 이후에 관점에서 보면 여기서 저장하는 모든 정보들은 인증 이전에 정보가 될 것. 현재 인증 받지 않는 상태로 접근하려 한 그 요청 정보들을 여기에 저장하는 것. 저장하고 다시 인증 받도록 redirect 해 로그인으로 이동시킨다. 여기까지가 인증받지 않은 상태에서 일어난 작업들이다. 세션에는 DefaultSavedRequest가 저장되어 있고 여기에는 현재 가구됐던 요청 정보들이 저장되어있는 채로 로그인으로 이동시킨다.

그러면 로그인 정보를 다시 요청 해 인증을 시도한다. 그리고 인증에 성공했다고 가정하자. 인증에 성공했으면 AuthenticationSuccessHandler를 통해 어떤 작업들을 우리는 처리할 수 있다. 여기서 어떤 작업을 하냐면 인증을 받기 전 정보를 가져와 어떤 작업을 처리하려 하는 것. 그래서 HttpSessionRequestCache 를 또 가지고 온다. 여기에는 세션에 DefaultSavedRequest 가 저장되어 있다. HttpSession 으로부터 DefaultSavedRequest을 가지고 와 다시 어디론가 Redirect 하려한다. 따라서 getRedirectUrl()을 가져오는데 그 URL이 인증 이전에 가고자 한 URL 정보, 즉 /user 경로가 될 것. 그리고 이 경로는 이미 DefaultSavedRequest에 저장되어 있다. 이 경로를 가지고와 이동, Redirect 시킨다. 즉, 우리가 인증에 성공하고 나서 어떤 URL, 어떤 경로로 이동시킬지는 우리가 명시하지 않아도 이 캐시가 세션으로부터 저장한 Request 객체를 가지고 와 그 안에 저장된 Redirect 할 URL을 추출한 다음 바로 이동시킨다. 그래서 우리가 보통 어떤 사이트에 보면 처음에 어떤 경로로 클라이언트가 이동시키는데 인증을 받지 못하면 튕겨 로그인 페이지가 뜨고 인증을 받는다면 우리가 원래 가고자 한 URL로 바로 가게 해준다. 이게 그 일련의 작업이다. 우리가 이러한 작업들을 임의대로 수동으로 할 수 있지만 Spring Security 에서는 이런 관계를 통해 이전에 가고자 한 요청 정보들을 가지고 와 그대로 이동시키는 작업들을 내부적으로 처리하고 있다.