현재 진행 중인 프로젝트에서는 외부 소셜 로그인 서비스를 사용한다.
우선은 Kakao 로그인 기능을 구현하는 과정만 기록하려고 한다.

OAuth 2.0

this.OAuth 2.0
먼저, 위의 글에 한번 정리한 적이 있는 OAuth 2.0이다.
인증을 위한 개방형 표준 프로토콜으로, 외부 인증 서비스에서 많이 사용한다.

아래와 같은 4가지 방식의 인증 방식이 존재한다.

  • Authorization Code Grant
    • OAuth의 기본이 되는 방식으로 가장 많이 사용된다.
    • Refresh Token의 사용이 가능하다.
  • Implicit Grant
    • 따로 코드 승인 없이 바로 Access Token을 발급한다.
    • Refresh Token의 사용이 불가능하다.
  • Resource Owner Password Credentials Grant
    • Code가 아닌 Username과 Password로 Token을 받는다.
    • Refresh Token의 사용이 가능하다.
    • 외부 서비스의 경우엔 이 방식을 적용하면 안된다.
  • Client Credentials Grant
    • Client에서 제출하는 자격증명을 통해 Token을 발급한다.
    • Client 측에서 자격증명을 안전하게 보관해야 한다.

그 중 Kakao 로그인 서비스는 Authorization Code Grant 방식을 사용한다.

KAKAO 로그인 과정

아래와 같은 Sequence Diagram을 따른다.
인가코드 받기
토큰받기

출처 : KAKAO DEVELOPERS

  1. Step 1 부분은 FE 파트에서 구현을 해 인가 Code를 받아온다.
  2. 인가 Code를 BE로 넘겨주면 내가 토큰을 받아 FE로 넘겨주도록 한다.
  3. 해당 토큰을 넘겨받은 FE는 로그인 후처리를 진행한다.

결국 내가 구현해야하는 부분은, KAKAO에 토큰을 요청하는 부분과
로그인 시 멤버 저장, 로그인 후처리 시 정보 저장이 되겠다.

외부 API 호출

KAKAO에 토큰을 요청한다는 것은 외부 API를 호출한다는 것이다.
과연 코드 레벨에서 외부 API는 어떻게 호출할 수 있을까?
보통 아래의 4가지 정도를 사용하는 것 같다.

  1. HttpURLConnection
    • Java의 기본 HTTP 통신 Class이다.
  2. RestTemplate
    • Spring 내부에서 제공하는 HTTP 통신 라이브러리이다.
    • Apache HttpClient(Component)를 추상화해서 제공한다.
  3. WebClient
    • Spring 5.0 부터 추가된 Interface이다.
    • 비동기, Non-blocking 방식이 불가능한 RestTemplate을 보완했다.
    • 비동기 동작 구현 시 해당 Interface의 사용을 권장한다.
    • 사용하기 위해서는 WebFlux 의존성을 추가해야 한다.

Spring docs : RestTemplate
Please, consider using the org.springframework.web.reactive.client.WebClient
which has a more modern API and supports sync, async, and streaming scenarios.

사실 Spring 공식문서에서는 위와 같이 WebClient 사용을 권장하고 있다.
하지만 나는 비동기 요청을 사용하지 않기 때문에 굳이 WebClient 는 쓰지 않았다.
동기 요청을 깔끔하고 사용하기 용이하게 추상화된 RestTemplate 을 사용할 것이다.
시간이 된다면 HttpURLConnection와 WebClient 도 사용해 볼 계획이다.

아래와 같은 순서로 동작 시킬 예정이다.

  1. 내가 만든 Controller로 FE에서 인가 Code를 넘긴다.
  2. 해당 인가 Code를 통해 accessToken을 받아온다.
    • 해당 과정을 RestTemplate을 통해 진행.
    • exchange() 함수를 통해 카카오 REST API에 요청
  3. accessToken에서 User 정보를 따서 로그인 과정 진행
    • 해당 과정에서 이미 가입된 User라면 Authenticate만 진행한다.
    • 가입되지 않은 User라면 자동 회원가입 후 Authenticate 진행.
  4. 서비스 자체에서 accessTokenrefreshToken을 발행한다.

전체적인 동작을 도식화하면 아래와 같다.
흐름도