프로젝트

블로그 만들기 -Oauth2구글에 요청이 자동으로 간다고?

ernest45 2025. 3. 31. 00:30

 

예전에 팀 프로젝트를 할 당시 로그인을 맡아서 했었는데 완전 햇병아리에다가 처음 코딩을 접할 시기라

security가 진짜 너무 어려웠다..

 

특히 Oauth는 계속 실패해서 원인조차 찾지 못할 시기가 있었으니..

 

 

 

어디까지 security에서 해주고 (filter와 super.load 등)

나는 어디서부터 어디까지 구현해야할 지 너무 헷갈렸다.

 

 

 

 

security의 핵심은!

 

 

다른 모듈들을 거쳐 UserDetailsService 에서 UserDetails 를 반환,
반환된 UserDetilas  SecurityContext 내부의 Authentication에 들어가게 된다.

 

(이전 글에서 jwt에서 적어놈)

 

 

그러나 Oauth의 경우

 

소셜 로그인은 DefaultOAuth2UserService를 호출, 이는 OAuth2UserService 를 구현한 클래스

DefaultOAuth2UserService 는 일반 로그인과는 다르게 OAuth2User 를 반환하고,
반환된 OAuth2User SecurityContext 내부의 Authentication 에 들어가게 됨

 

 

 

super.loadUser(userRequest): 구글에 요청이 자동으로 간다고?

 

 

 

이 블로그의 핵심이다..

예전 코드..

 

 

 

 

나는 전에 oauth를 실패한 이유가 구글에 자동 요청한다는 것만 믿고 커스텀을 하다 delegete를 시켰고 그 부분에서 항상 에러가 났다.

 

그러니 실제 user정보들을 구글에서 받아올 수가 없었다..

 

super.loadUser()는 부모 클래스 DefaultOAuth2UserService의 메서드를 부르는 것!

 

이게 OAuth2 로그인에서 사용자 정보를 가져오는 핵심 로직인데  Spring Security가 제공하는 기본 동작.

 

 

 

 
  • 1. userRequest라는 객체를 주면,
  • 2.그걸로 구글이나 다른 제공자에 요청을 보내서 데이터를 받아옴
 
 

 

 
 
 
 
내가 HttpClientRestTemplate으로 요청 코드를 짤 필요 없이, 이 한 줄이 구글에 HTTP GET 요청을 보냄
 
  ex):

 

 

 
 
 
 
원래라면 토큰 넣고, URL 맞추고, 요청 보내고, 응답 파싱하고… 이걸 다 내가 해야 할 줄 알았는데,
super.loadUser()가 다 처리해준다.
 
 
 
 
 
 한번 간단하게 뜯어보자
 
 
 

1. DefaultOAuth2UserService클래스의  super.loadUser()

 
실제로 load메서드의 http요청 핵심
 
 
실제 super.loadUser 메서드의 핵심은 getResponse이다.
 
 
 
 
 
 
 

2.  getResponse()

 

 

 

우리가 아는 RestTemplate은인터페이스 RestOperations의 구현체이다

실제로 이 인터페이스를 활용해서 요청을 보냄!

 

 

 

 

 

 

요청흐름 총정리

 

 

 

https://velog.io/@kyukim/oauth-%ED%9D%90%EB%A6%84

 

 

 

resource oner = 사용자  - 실제 로그인 주체
Client = 우리 앱 - spring boot
Authorization server = *토큰서버* - api 서버에 접근을 위한 토큰 내려주는 서버
Resource server = *api서버*    - 실제 유저정보를 가진 서버
 
 
 
 
 
 
 
 
 

1차 http사이클 

 

 

요청 - 사용자가 oauth2를 사용하기 위해 우리 앱에 내가 지정한 path로 요청을 보냄 (get /myapp/path)

 
응답 - OAuth2AuthorizationRequestRedirectFilter가 구글 *토큰* 서버로 redirect해줌 (응답 302)
 
 
 

 

 
 
 
 
 
 

2차 http 사이클

 

 

 

 

 

요청 - 사용자가 redirect된 페이지인 구글 로그인 창에 이메일/ 비밀번호 입력 (post body : "id : ~ ", "pw : ~~ ")

응답 - 구글 *토큰* 서버가 확인 후 내 앱으로 code를 붙여서 redirect해줌 (302 응답)

 

 
 
 
 
 
 

 

 

 

 

 

 

3차 http 사이클

 

 

 

 

요청 -  **OAuth2LoginAuthenticationFilter** 에서 code와 내가 yml에 저장한 id,secret들을 가지고

구글 *토큰* 서버에 Access token 요청을 보냄 (정보가 아닌 실제 유저 정보에 얻기위한 서버의 access 토큰을 요청)

 

응답 - 구글 *토큰* 서버가 *api* 서버에 입장가능한 토큰을 반환 (json -  "access_token": "ya29.a0AfH6S...",)

 

 

 

 

 

 

 

 

 

4 http 사이클 (이번 글 주제)

 

 

 

요청 - 구글 *api*서버에 토큰을 가지고 정보를 요청 get /google~

 

응답 - json { "sub": "110169484474386276334",   "name": "John Doe"}

 

 

 

 

 

이때 받은 정보를 저장 및 활용!하면 된다..

 

 

 

 

 

 

 

 

 

 

 

 내가 구현해야 하는  것 vs  자동 처리되는 것

 

자동 처리되는 것 (Spring Security가 알아서 함)

  • 구글 로그인 페이지로 리다이렉트 (OAuth2AuthorizationRequestRedirectFilter)
  • 구글이 인증 코드 반환
  • 액세스 토큰 요청 (OAuth2LoginAuthenticationFilter)
  • 액세스 토큰으로 사용자 정보 요청 (super.loadUser())
  • OAuth2User 객체 생성 및 인증 완료

 

 

우리가 직접 구현해야 하는 것

  • OAuth2UserService (OAuth2UserCustomService)
    사용자 정보를 가공해서 DB에 저장하는 역할
  • OAuth2SuccessHandler (선택)
    로그인 성공 후, JWT 생성 & 프론트엔드로 리다이렉트 처리
  • Security 설정 (SecurityConfig)
    → OAuth2 엔드포인트 설정 & 커스텀 서비스 등록
 
 

 

 

 

 

https://developers.google.com/assistant/df-asdk/identity/gsi-oauth-concept-guide?hl=ko

 

OAuth 및 Google 로그인 개념 가이드 (Dialogflow)  |  Actions on Google account linking  |  Google for Developers

대화형 작업이 2023년 6월 13일에 지원 중단되었습니다. 자세한 내용은 대화 작업 지원 중단을 참고하세요. 이 페이지는 Cloud Translation API를 통해 번역되었습니다. OAuth 및 Google 로그인 개념 가이드

developers.google.com

https://velog.io/@kyukim/oauth-%ED%9D%90%EB%A6%84