본문 바로가기
Develop Study/Architecture 2025. 5. 21.

(25.05.21) OAuth 2.0 간편 소셜 로그인

간편 로그인은 이제 서비스웹 앱에서는 필수적인 요소이며,

인턴십 기간에서도 결제와 더불어서 OAuth 를 통한 소셜 로그인을 가장 1순위로 구현될 User 스토리였다.

 

물론 해당 구현은 OAuth 2.0으로 시그니쳐가 없어졌기 때문에, 
JWT 발급 구현을 할수 있다면 구현을 할 수 있다.

 

관련 내용을 Blog에 정리한 적이 없기 떄문에 Notion에 있던 내용 그리고
프로젝트 시작시 사용할 수 있는 개인 공용 Boiler Plate 에 적용하기 위해 간단한 개념을 먼저 정리하고,

Flow에 따라 구현 코드를 미리 Boiler Plate에 적용하고자 한다.

 


 


OAuth, Open Authorization

  • 웹사이트 상의 사용자 정보에 대해서 다른 website/application 에게 사용자 인증을 위힘할 수 있도록 도와주는 HTTP 기반의 보안 프로토콜
    • Google, Naver, Kakao 같이 간편 소셜 로그인이 모두 이 프로토콜을 사용하는 것
  • 개방되어있는 공통적인 표준이지만, 공유는 하지 않는 방식으로

사용목적

  • 회원가입/로그인 절차가 간편 → 한번의 클릭을 통해서 사용자 인증을 할 수 있또록 함
  • 서비스 제공자 입장에서 비밀번호를 직접 관리하지 않으므로 보안 위험 감소
  • 다양한 서비스(Google, Kakao, Naver 등)의 인증 정보(이메일, 이름 등등)와 연동 가능 → 단 제공을 할 경우

OAuth 2.0

  • 더 쉬운 프로세스
    • OAuth 1.0일 경우 복잡한 서명 프로세스를 매번 요구
      • 클라이언트는 요청에 대해 해싱 알고리즘을 사용하여 서명
      • Access Token과 Request Token이 모두 서명으로 사용된 서명된 토큰이 필요
    • OAuth 2.0은 서명 과정을 생략하고, 대신 HTTPS를 통해 요청의 보안을 확보하는 전략
      • Access Token과 Refresh Token 개념을 그대로 사용 가능
  • 간소한 권한 부여 FLOW
    • OAuth 1.0: 다양한 권한 부여 흐름이 있지만, 복잡하게 구성되어 있어 사용자가 이해하는데 긴 시간이 소요
    • OAuth 2.0: 권한 부여 코드, 자원 소유자 비밀번호 자격 증명 및 클라이언트 자격 증명과 같은 다양한 권한 부여 흐름을 지원
  • 실제 사용 예
    • OAuth 1.0: 주로 Twitter와 같은 초기 API
    • OAuth 2.0: Facebook, Google, GitHub 등 현대의 다양한 API와 웹 서비스

“카카오 로그인” OAuth 를 통한 OAuth Flow

  • 기본적으로 REST API를 사용하는 방식으로 Service가 진행되는 Application Server ↔ Kakao Auth Server 간의 API로 사용자 인즈절차가 진행

전체 FLOW

  • 사용자 인증
    • 사용자는 제3자 애플리케이션(위에서는 KaKao)을 통해 인증을 요청
  • 권한 요청
    • 애플리케이션은 리소스 소유자(사용자)에게 권한을 요청
      • 실제 사용자에게 정보를 사용할 수 있도록 허락하고 동의를 받는 행위, REST API 요청 X
  • Authorization Code
    • 사용자가 권한(=동의)을 부여하면, 카카오 서버는 Authorization Code를 발급 시작
  • Token 요청
    • 애플리케이션은 Authorization Code를 사용하여 Access Token, Refresh Token 요청
  • Token 발급
// 카카오 로그인 기준 응답
{
  "token_type": "bearer",                  // 토큰 타입 (항상 bearer)
  "access_token": "ACCESS_TOKEN_VALUE",    // 사용자 액세스 토큰
  "id_token": "ID_TOKEN_VALUE",            // OpenID Connect 사용 시 포함되는 ID 토큰 (옵션)
  "expires_in": 21599,                     // 액세스 토큰 및 ID 토큰의 만료 시간 (초)
  "refresh_token": "REFRESH_TOKEN_VALUE",  // 사용자 리프레시 토큰
  "refresh_token_expires_in": 5183999,     // 리프레시 토큰의 만료 시간 (초)
  "scope": "profile_nickname account_email openid"  // 사용자 정보 접근 권한 범위 (여러 개일 경우 공백으로 구분)
}

  • 인증 서버는 Access Token, Refresh Token을 발급

기본적인 OAuth 구현

REST API 구성

 

  • 간편로그인을 하면, OAuth 인증 흐름 전체가 자동으로 포함되며, 사용자 정보에 접근하기 위해서는 반드시 Access Token 발급까지 완료되어야
    • 단, Application 은 인가코드, 토큰 요청을 순차적으로 해야함
  • → 실제 APP을 사용하는 사양자 API 하나 = 하나의 버튼 으로 모두 진행이 되어야하는 것

Application Server(Spring Boot) ↔ Kakao Auth Server

RestTemplate 사용

  • Spring Boot starter-web 에 미리 포함이 되어있는 HTTP 요청/응답 처리 클래스
  • OAuth 에서의 사용
    • POST/GET 요청 보내기
    • JSON 응답 받기 및 파싱
    • Header 설정 (Authorization 등) → JWT 활용
  • 간단하게 사용할 수 있으나, Spring 5 이후 부터는 검토중, Deprecated 예정 → Spring 6 이후 WebClient 대체이기 때문에, Spring 버젼에 따라서 적용을 다르게 해야함
    • WebClient 는 비동기 이기 때문에 Web MVC 구조와 연동을 할 수가 없음

OAuth 과정에서이 RestTemplate을 활용한 전체 인증 FLOW

  1. 인가 코드 받기 (프론트 = 앱 클라이언트의 앞단에서 진행)
GET /auth/kakao/callback?code=abc123
  • 사용자가 카카오 로그인 버튼 클릭
  • Kakao 인증 서버로 리다이렉트 → 로그인 → 권한 동의 → Authorization Code 발급
  • 이 후, Authorization Code 를 자동으로 FE에서 파싱해 POST 로 BE측에 전달하면서 토큰 발급을 준비
  1. RestTemplate으로 Token 요청
// 대포적인 Access Token 기본 예시
RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<string, string=""> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", "{REST_API_KEY}");
params.add("redirect_uri", "{REDIRECT_URI}");
params.add("code", "{authorization_code}");

HttpEntity<multivaluemap<string, string="">> request = new HttpEntity<>(params, headers);

ResponseEntity response = restTemplate.postForEntity(
    "<https://kauth.kakao.com/oauth/token>",
    request,
    KakaoTokenResponse.class
);

KakaoTokenResponse kakaoToken = response.getBody();
</multivaluemap<string,></string,>

3. RestTemplate으로 사용자 정보 요청

// 기반적인 사용자 요청 TEMPLATE 
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + kakaoToken.getAccessToken());

HttpEntity request = new HttpEntity<>(headers);

ResponseEntity userResponse = restTemplate.exchange(
    "<https://kapi.kakao.com/v2/user/me>",
    HttpMethod.GET,
    request,
    KakaoUserResponse.class
);

KakaoUserResponse kakaoUser = userResponse.getBody();

 


참고자료

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com


가장 대한민국에서 많이 사용되는 카카오톡로그인을 기준으로 작성을 했다.
후에는 계속해서 구체적으로 어떻게 구현을 했는지에 대해서 기록하고자 한다.