[Etc] OAuth란?
인증 및 권한 부여 프로토콜인 OAuth에 대해 알아보자.
- OAuth 개념과 특징
- OAuth 1.0 vs. OAuth 2.0
- OAuth 2.0 상세 동작 방식
- OAuth 2.0 Grant Types (인증 방식)
- OAuth 2.0의 주요 용어
- OAuth 2.0을 실제 코드로 구현
- OAuth의 장점 & 단점
OAuth란?
서드파티 애플리케이션이 사용자 인증 정보를 직접 다루지 않고, 다른 서비스의 인증을 통해 특정 리소스에 접근할 수 있도록 하는 인증 및 권한 부여 프로토콜
- “카카오 로그인”, “구글 로그인”, “페이스북 로그인” 같은 기능이 OAuth를 사용한 대표적인 사례
1. OAuth 개념과 특징
✅ OAuth의 핵심 개념
- 인증(Authentication): 사용자가 누구인지 확인하는 과정
- 권한 부여(Authorization): 사용자가 특정 리소스에 대한 액세스를 허용하는 과정
- 토큰 기반 인증: ID/비밀번호 대신 Access Token을 사용하여 API 요청
- 안전한 인증 방식: 클라이언트가 직접 사용자 계정 정보를 저장하지 않아 보안 강화
✅ OAuth 동작 방식
- 사용자가 서드파티 앱에서 로그인 버튼 클릭
- OAuth 서버(예: Google, Kakao)가 사용자에게 로그인 페이지 제공
- 사용자가 로그인하고 권한을 승인
- OAuth 서버가 서드파티 앱에 Authorization Code 제공
- 서드파티 앱이 Authorization Code를 사용하여 Access Token 요청
- Access Token을 통해 리소스 서버(API)에 접근하여 데이터 제공
2. OAuth 1.0 vs. OAuth 2.0
OAuth는 1.0과 2.0 두 가지 버전이 있으며 현재는 OAuth 2.0이 표준.
특징 | OAuth 1.0 | OAuth 2.0 |
---|---|---|
출시 | 2010년 이전 | 2012년 이후 |
보안 방식 | HMAC-SHA1 서명 | Bearer Token 방식 |
암호화 필수 여부 | 요청마다 암호화 필요 | HTTPS만 사용하면 됨 |
사용성 | 복잡함 | 간단하고 확장성이 좋음 |
클라이언트 유형 | 웹 앱 중심 | 모바일, 웹, 서버, IoT 지원 |
인증 방식 | Access Token, Secret Key | Access 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을 받음 | 웹, 모바일 앱에서 로그인 연동 |
Implicit | Access 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 Server | API 요청을 처리하는 서버 (Google API, Kakao API 등) |
Access Token | 사용자가 인증된 후 API에 접근할 수 있는 키 |
Refresh Token | Access Token이 만료되었을 때 재발급하는 키 |
Redirect URI | OAuth 서버가 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의 장점 & 단점
✅ 장점
- 보안성 강화: ID/PW를 직접 저장하지 않고, Access Token으로 인증
- 편리한 로그인: Google, Kakao 로그인 등 쉽게 연동 가능
- API 사용 간편화: 서드파티 서비스와 연동할 때 필수
- 토큰 만료로 보안 강화: Access Token이 주기적으로 만료되므로 보안성 향상
❌ 단점
- 구현이 복잡함: Access Token, Refresh Token 관리 필요
- 서버 부하 증가: 토큰 발급 및 검증 과정에서 추가적인 요청 발생
- Refresh Token 유출 위험: Refresh Token이 유출되면 악용될 가능성 있음