쌩로그

Oauth 2.0 로그인의 redirect-url 본문

Spring/Spring Security

Oauth 2.0 로그인의 redirect-url

.쌩수. 2024. 5. 7. 01:15
반응형

목록

  1. 포스팅 개요
  2. 본론
  3. 요약

1. 포스팅 개요

Oauth 2.0를 활용한 구글 로그인의 redirect-url에 대해서 정리해보고자 한다.

사실 사내 프로젝트에 대한 회고글을 쓰기 시작했는데, 어떤 부분을 배웠는지 작성하는 중 해당 파트를 쓰다보니 개별로 글을 작성해도 될 거 같아 써본다.

2. 본론

구글의 OAuth2.0 로그인을 활용하기 위해서 구글 API 콘솔을 통해서 사용자 및 설정에서 redirect-url을 설정한다.

내가 이전에 프로젝트 할 때 블로깅을 했을 때 구글에서 설정한 redirect-url과 yml에서 설정되어있는 redirect-url은 redirect 되는 url이 아니라,
단순히 리소스 서버인 구글웹 애플리케이션 서버(구글 입장에선 클라이언트)간의 검증을 위한 값이라고 했었는데 아니었다.

그때 당시 다음처럼 병맛같이 글을 써놨다.

해당 글은 여기다...

착각하지 말긴 개뿔이다...;;
현재 글은 지금 다음과 같이 수정되어있다.

여하튼 계속 글을 이어보자면,

redirect-url은 실제로 사용자가 소셜 로그인을 완료하면 redirect되는 주소였다.
그리고 해당 주소의 쿼리파라미터로 구글의 인증 code를 넘겨준다.

또한 그 인증 code가 넘어오면, 우리 눈에는 보이지 않지만, 구글 개발자 도구를 확인해보면, url이 redirect되는 것을 확인할 수 있다.

이처럼 웹 애플리케이션은 구글과 REST 통신을 한다.

url이 redirect 될 때 구글에서 받은 인증 code를 쿼리파라미터로 구글에 넘겨주게 되고,
구글에서는 해당 code와 더불어서 정보들을 받으면 ,
구글에서 만든 자체 액세스 토큰과 리프레시 토큰을 넘겨준다.

그 과정을 확인해보면 다음과 같다.

먼저 서버를 실행하고, a태그로 되어있는 부분을 통해서 구글 로그인을 진행한다.

여기서 로그인하면 localhost:8080/oauth2/authorization/google로 간다.
그럼 다음 로그인창으로 가게되는데,

로그인할 계정을 누르고 크롬 개발자 도구의 네트워크를 보면 아래처럼 마-악 나온다.

지금 선택한 곳의 header를 보면 아래와 같이 나온다.
(참고로 가려야 하는 것은 가렸다.)

만약 다른 건 가려놓고, 왜 code는 안 가렸냐고 물어볼 수 있다.
이미 사용했기 때문에 소용이 없다.
한 번의 로그인에 하나의 코드가 생성된다.

그리고 웹 애플리케이션은 구글에서 응답으로 준 헤더의 redirect-url로 인증 코드를 넘겨주는데, 이 때 code를 받고 구글에서는 액세스 토큰과 리프레시 토큰을 생성해서 애플리케이션으로 넘겨준다.(구글이 애플리케이션으로 응답)

그리고 애플리케이션은 구글에서 준 토큰을 받으면 인증이 완료되었다고 인식하고,
OAuth 로그인 완료 후에 설정 된 시큐리티 필터의 절차를 거친다.
그 절차를 거치는 과정 중에 애플리케이션은 JWT를 생성하게 되고, 다음과 같이 값을 넘겨준다.

참고로 localhost:3000/blabla는 프론트엔드에서 받는 주소다.
프론트에서는 localhost:3000으로 매핑 된 컴포넌트로 라우팅 되는데(리액트) 쿼리파라미터에 있는 액세스 토큰과 리프레시 토큰을 받아서 로컬 스토리지에 저장하고, 서버와 REST API 통신을 한다.
(내가 하고 있는 프로젝트의 통신 flow이다.)

그리고 서버 인증 로직 중에는 구글 인증 로그인이 완료되면, 구글에서 받은 정보로 회원의 정보를 저장하는 로직이 있다.

해당 페이지를 참고하자.(현재 프로젝트에서 인증 관련 코드들은 이전에 진행했던 프로젝트의 코드를 거의 복붙했다.
이전에 프로젝트를 하면서 이 코드를 사용할 과거의 나지금의 나의 차이는 왜 이 소스가 필요한지 조금 더 깊게 알게 되었다.)

여기서 매개변수로 받고있는 타입인 OAuth2UserRequest를 클래스를 보면 다음과 같이 액세스 토큰이 있음을 확인할 수 있다.

그리고 다음과 같이 로그로 요청 정보를 다 볼 수 있다.

@Override  
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {  
    OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService = new DefaultOAuth2UserService();  
    OAuth2User oAuth2User = oAuth2UserService.loadUser(userRequest);  

    log.info("oAuth2User.toString() = {}", oAuth2User.toString());  
    log.info("registrationId = {}",userRequest.getClientRegistration().getRegistrationId());  
    log.info("registrationId = {}",userRequest.getClientRegistration().getProviderDetails());  
    log.info("클라이언트 Id = {}",userRequest.getClientRegistration().getClientId());  
    log.info("클라이언트 이름 = {}",userRequest.getClientRegistration().getClientName());  
    log.info("클라이언트 시크린 = {}",userRequest.getClientRegistration().getClientSecret());  
    log.info("인증 타입 = {}",userRequest.getClientRegistration().getAuthorizationGrantType());  
    log.info("리다이렉트 url = {}",userRequest.getClientRegistration().getRedirectUri());  
    log.info("스코프 = {}",userRequest.getClientRegistration().getScopes());  

    log.info("구글 자체 엑세스 토큰 = {}", userRequest.getAccessToken().toString());  
    log.info("구글 파라미터 = {}", userRequest.getAdditionalParameters());

결과는 다음과 같이 나온다.

아.. 가리기 귀찮다...

이렇게 정보들이 쫘르륵 나온다..
그리고 받은 정보들을 통해서 OAuth2Attribute클래스로 유저 객체를 생성하게 되고,
해당 시큐리티의 Context에 저장하게되고, 인증 로직이 흘러간다.

3. 요약

구글 API 콘솔에서 설정하는 redirect-url에 대하여 자세히 알아보았다.

redirect-url은 단순히 검증에만 쓰이는 값이 아니다.
해당 url로 구글의 인증 코드를 주고, 그 코드로 인해서 구글의 인증을 계속 진행하여 로그인을 원활하게 진행할 수 있다.

참고

이 글은 회고 글을 쓰는 와중에 작성한 내요이다.
그런데 이 내용으로도 충분히 하나의 글이 나올 거 같아 이렇게 쓰게 되었다.

추후에 포스팅될 회고록에도 사용될 것인데, 단순히 링크를 밖을지 아니면 중복되더라도 글을 쓸지는 추후에 고민해봐야 할 내용이다.

회고록도 작성해야하는데,,,,할 게 많다. 배울 것도 많고...
그리고 적을 게 한 두가지가 아니다.
그만큼 많은 경험들을 하고, 깨달은 것이 많다는 증거겠지만...

여하튼 리다이렉트 url은 구글(한정) 로그인 후, 인증 code를 받는 url이므로 중요하다....!!

728x90
Comments