OAuth2AuthorizationRequestResolver 커스터마이징

문제 원인

카카오 로그인 페이지로 이동할 때, 다음과 같은 요구사항이 추가되었다.

요구사항

  • 권한이 없는 페이지에서 접근하였을 때 로그인 페이지로 이동

  • 로그인 페이지로 이동을 하면서, 이전 페이지에 대한 정보를 같이 보냄

  • 로그인 성공시 이전 페이지를 다시 받아내고 싶음.

위와 같이 쿼리 파라미터 로 전달한 정보를 로그인 성공 후 리다이렉트시, 다시 전송을 원하는 상황이었습니다.

당시 상황

OAuth2 로그인 구현 방법

  • Spring Security OAuth2 를 사용하여 로그인 기능을 구현

  • 단순히 로그인 처리에 대한 엔드 포인트(/api/v1/auth/oauth2/kakao)를 설정

즉, baseUri 로 요청시 카카오 로그인 페이지로 리다이렉트 시키는 방식으로 작동

image

문제 접근

해당 요구사항에 따라 baseUri에 요청할 때 쿼리 파라미터로 넘어온 값에 대한 처리가 필요하다고 판단하였습니다.

oauth2Login에서 authorizationEndpoint 를 커스터마이징하는 방법은 없나? 라는 생각으로 설정할 수 있는 클래스를 검색

  • authorizationRequestResolver : 클라이언트가 인증 요청을 할 때 해당 요청을 변환하거나 수정하는 역할

  • authorizationRequestRepository : 클라이언트가 인증 요청을 보내고 나서 그 요청 정보를 저장하고 관리하는 역할

  • authorizationRedirectStrategy : 인증 요청 후, OAuth2 인증 서버로 리다이렉트할 때의 전략을 정의

위 3가지는 OAuth2 인증 과정의 주요 컴포넌트로서 필요에 따라 커스터마이징이 가능합니다.

이 중, authorizationRequestResolver 를 통해 로그인 요청 엔드포인트에 클라이언트가 요청을 보낼 때 쿼리 파라미터를 파싱하고 세션에 저장하는 방식으로 접근하면 좋을 것 같아 ChatGPT 를 활용해 보았습니다.

문제 해결

  • DefaultRequestResolver 의 방식대로 구현을 하되, 요청에서 redirect 쿼리 파라미터에 대한 정보만 세션에 저장

  • 로그인 성공시 동작하는 OAuth2SuccessHandler 에서 세션에서 redirect 정보를 가져온 후 클라이언트에게 전달

위의 두 방식을 통해 변경된 요구사항에 맞게 커스터마이징을 진행

DeafultOAuth2AuthorizationRequestResolver 방식을 따라 기존에 환경 변수를 통해 Spring Security가 처리해주던 동작을 그대로 구현하기 위해서 사용하였습니다.

CustomAuthorizationRequestResolver.java

OAuth2SuccessHandler.java

로그인 실패시 동작하는 OAuth2FailureHandler 에서도 세션에 저장된 정보를 제거해줘야 함!


생각해볼 내용

  • 요구사항을 만족하기 위해 Session을 사용하였지만, 로그인 페이지만 이동시킨 후 사용하지 않을 경우에 발생할 문제는 없을까?

  • 다른 방식으로 처리할 수 없는지 궁금함이 남아있음

Last updated

Was this helpful?