1. [Spring Security OAuth2 Client] 동작 이해
  2. [Spring Security OAuth2 Client] 소셜 로그인 후 요청했던 페이지로 리다이렉트

OAuth2 인증 과정에서, 리액트 프론트엔드에서 사용자가 GET /users/me/profile 과 같이 인증이 필요한 서비스를 요청한 경우 로그인 페이지로 유도하고, 백엔드 처리가 끝난 이후에 /users/me/profile 로 리다이렉트할 방법이 필요했다.

먼저 생각난 방법은 세션인데 중간에 브라우저가 구글 동의 페이지(외부 API)로 넘어가므로 이후 요청에서 JSESSIONID가 전달될 지 확실치 않았다. 프론트와 백엔드가 나뉜 상황이라 same site:none을 설정했는데 프론트 요청에서 credential 옵션을 주지 않으면 쿠키가 전달되지 않는다. 구글이 302를 지시할 때 credential 옵션을 지정할 수는 없을 것이라 생각했다.

따라서 다른 방법을 찾았는데 생각보다는 구현이 훨씬 간단했다. 굳이 리다이렉트 URI를 전송하는 과정 없이 백엔드는 로그인에만 관심을 갖고, 프론트엔드만 리다이렉트를 처리하는 방향으로 개발했다.

전체 흐름


  1. 비로그인 상태에서 보호 페이지 접근 (AdminRoute, PrivateRoute)
  2. 프론트가 원래 가려던 경로를 localStorage(requestedApi)에 저장하고 /loginForm으로 보냄
  3. 로그인 성공 시 /auth/callback으로 이동
  4. 콜백에서 세션 유효성 검사 후 requestedApi로 복귀 (없으면 /)

프론트엔드에서 리다이렉트를 거는 지점


보호 페이지 접근은 PrivateRoute, AdminRoute가 잡고 있다. 여기서 로그인 상태가 아니면, 지금 접근한 주소를 requestedApi에 저장한 뒤 로그인 페이지로 보낸다.