[Etc] OAuth란?

인증 및 권한 부여 프로토콜인 OAuth에 대해 알아보자.


OAuth란?

서드파티 애플리케이션이 사용자 인증 정보를 직접 다루지 않고, 다른 서비스의 인증을 통해 특정 리소스에 접근할 수 있도록 하는 인증 및 권한 부여 프로토콜

  • “카카오 로그인”, “구글 로그인”, “페이스북 로그인” 같은 기능이 OAuth를 사용한 대표적인 사례

1. OAuth 개념과 특징

OAuth의 핵심 개념

  • 인증(Authentication): 사용자가 누구인지 확인하는 과정
  • 권한 부여(Authorization): 사용자가 특정 리소스에 대한 액세스를 허용하는 과정
  • 토큰 기반 인증: ID/비밀번호 대신 Access Token을 사용하여 API 요청
  • 안전한 인증 방식: 클라이언트가 직접 사용자 계정 정보를 저장하지 않아 보안 강화

OAuth 동작 방식

  1. 사용자가 서드파티 앱에서 로그인 버튼 클릭
  2. OAuth 서버(예: Google, Kakao)가 사용자에게 로그인 페이지 제공
  3. 사용자가 로그인하고 권한을 승인
  4. OAuth 서버가 서드파티 앱에 Authorization Code 제공
  5. 서드파티 앱이 Authorization Code를 사용하여 Access Token 요청
  6. Access Token을 통해 리소스 서버(API)에 접근하여 데이터 제공

2. OAuth 1.0 vs. OAuth 2.0

OAuth는 1.0과 2.0 두 가지 버전이 있으며 현재는 OAuth 2.0이 표준.

특징OAuth 1.0OAuth 2.0
출시2010년 이전2012년 이후
보안 방식HMAC-SHA1 서명Bearer Token 방식
암호화 필수 여부요청마다 암호화 필요HTTPS만 사용하면 됨
사용성복잡함간단하고 확장성이 좋음
클라이언트 유형웹 앱 중심모바일, 웹, 서버, IoT 지원
인증 방식Access Token, Secret KeyAccess Token, Refresh Token

💡 현재 OAuth 2.0을 대부분 사용


3. OAuth 2.0 상세 동작 방식

🔑 OAuth 2.0의 핵심 개념

  • Authorization Code: Access Token을 받기 위한 코드
  • Access Token: API 요청 시 사용하는 인증 키
  • Refresh Token: Access Token이 만료될 때 새로운 Token을 발급하는 키
  • Redirect URI: OAuth 서버가 Authorization Code를 전달할 URL

OAuth 2.0 인증 과정

1️⃣ 사용자 인증 & 권한 부여 (Authorization Request)

  • 클라이언트가 OAuth 제공자(Google, Kakao 등)에게 로그인 요청
  • 사용자 로그인 후, 권한 허용 여부를 선택

2️⃣ Authorization Code 발급

  • 사용자가 권한을 허용하면, OAuth 서버가 Authorization Code를 클라이언트에게 전달

3️⃣ Access Token 발급 (Token Exchange)

  • 클라이언트는 Authorization Code를 사용해 Access Token 요청
  • OAuth 서버가 유효성 검증 후, Access Token과 Refresh Token 발급

4️⃣ API 요청 (Resource Access)

  • 클라이언트는 Access Token을 포함하여 API 서버에 요청
  • API 서버는 토큰을 확인한 후 데이터 반환

5️⃣ Access Token 갱신 (Token Refresh)

  • Access Token이 만료되면, Refresh Token을 사용하여 새로운 Access Token 발급

4. OAuth 2.0 Grant Types (인증 방식)

Grant Type설명사용 예시
Authorization Code보안이 뛰어난 방식으로, 서버를 거쳐 Access Token을 받음웹, 모바일 앱에서 로그인 연동
ImplicitAccess Token을 직접 발급 (보안 약함)예전 프론트엔드 앱에서 사용 (현재는 사용 X)
Resource Owner Password Credentials (ROPC)사용자 ID/PW를 직접 입력받아 Access Token 발급신뢰할 수 있는 앱 (예: 사내 시스템)
Client Credentials클라이언트(서버) 자체가 인증됨 (사용자 없음)서버 간 API 호출
Device Code디바이스(스마트 TV 등)에서 로그인TV, IoT 기기

💡 일반적으로 “Authorization Code” 방식이 가장 많이 사용됨.


5. OAuth 2.0의 주요 용어

용어설명
Resource Owner (사용자)API의 데이터를 소유한 사용자
Client (클라이언트 앱)사용자의 데이터를 요청하는 앱 (예: 서드파티 앱)
Authorization Server인증을 담당하는 서버 (Google, Kakao 등)
Resource ServerAPI 요청을 처리하는 서버 (Google API, Kakao API 등)
Access Token사용자가 인증된 후 API에 접근할 수 있는 키
Refresh TokenAccess Token이 만료되었을 때 재발급하는 키
Redirect URIOAuth 서버가 Authorization Code를 전달하는 URL

6. OAuth 2.0을 실제 코드로 구현

(1) Authorization Code 방식 (Java)

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class OAuthExample {
    public static void main(String[] args) throws Exception {
        // 1. Authorization Code 요청
        String clientId = "your-client-id";
        String redirectUri = "https://your-app.com/callback";
        String authUrl = "https://oauth-provider.com/auth?client_id=" + clientId + "&redirect_uri=" + redirectUri + "&response_type=code";

        System.out.println("Login URL: " + authUrl);

        // 2. Access Token 요청
        String authCode = "received-authorization-code";
        String tokenUrl = "https://oauth-provider.com/token";

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(tokenUrl))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString("client_id=" + clientId + "&code=" + authCode + "&redirect_uri=" + redirectUri + "&grant_type=authorization_code"))
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println("Access Token Response: " + response.body());
    }
}

7. OAuth의 장점 & 단점

장점

  1. 보안성 강화: ID/PW를 직접 저장하지 않고, Access Token으로 인증
  2. 편리한 로그인: Google, Kakao 로그인 등 쉽게 연동 가능
  3. API 사용 간편화: 서드파티 서비스와 연동할 때 필수
  4. 토큰 만료로 보안 강화: Access Token이 주기적으로 만료되므로 보안성 향상

단점

  1. 구현이 복잡함: Access Token, Refresh Token 관리 필요
  2. 서버 부하 증가: 토큰 발급 및 검증 과정에서 추가적인 요청 발생
  3. Refresh Token 유출 위험: Refresh Token이 유출되면 악용될 가능성 있음