오늘날 다양한 디지털 서비스가 등장하면서 서로 다른 플랫폼 간 데이터를 공유하고 연결하여 사용하는 일이 점점 더 보편화되고 있습니다. 구글이나 네이버 계정으로 간편하게 로그인하거나, 인스타그램의 사진을 다른 서비스에서 불러오는 일은 이미 우리의 일상 속에서 흔히 접할 수 있는데요, 이러한 경험을 가능하게 하는 핵심 기술이 바로 API(Application Programming Interface)입니다.
API는 소프트웨어 간 상호작용을 정의하고 구현하는 표준화된 인터페이스로, 데이터를 요청하거나 기능을 호출하는 방식을 제공합니다. 그런데 서비스 간 데이터를 주고받는 과정에서 중요한 문제가 있습니다. 바로 사용자 인증과 권한 부여입니다. 이 문제를 안전하고 효율적인 방식으로 해결하기 위해 등장한 것이 바로 OAuth2.0 프로토콜입니다.
이번 포스팅에서는 OAuth 2.0에 대해 살펴보고, 이를 활용해 API를 연동하는 방법을 간단히 설명드리겠습니다.
OAuth 란?
OAuth의 개념
OAuth는 Open Authorization의 약자로, 사용자가 비밀번호를 제공하지 않고도 자신의 정보를 다른 웹사이트나 애플리케이션이 안전하게 사용할 수 있도록 접근 권한을 위임할 수 있는 표준 프로토콜입니다. OAuth 2.0은 기존 버전을 보완한 최신 버전으로, 보다 간단하고 유연하게 설계되어 다양한 서비스에서 널리 사용되고 있습니다.
OAuth2.0의 구성요소
OAuth2.0는 다음과 같이 4가지 구성요소로 이루어져 있습니다.
- 리소스 소유자(Resource Owner) : 리소스 서버에 계정을 가지고 있는 사용자를 말하며, 클라이언트에게 접근 권한 위임
- 클라이언트(Client) : 리소스 소유자의 권한을 위임받아 리소스 서버의 데이터를 사용하려는 서비스
- 인증 서버(Authorization Server) : 권한을 인증하는 서버
- 리소스 서버(Resource Server) : 데이터를 가지고 있는 서버
OAuth 2.0을 이용한 API 연동
그럼 이제 클라이언트가 어떻게 OAuth2.0를 통해 권한을 위임받고, API를 사용할 수 있게 되는지 카페24 API를 예시로 알아보도록 하겠습니다.
리소스 소유자는 카페24 쇼핑몰을 운영하고 있습니다. 클라이언트는 이 리소스 소유자의 쇼핑몰에서 어떤 정보를 가져와 사용하고 싶은데요, 이를 위해 리소스 소유자의 동의를 얻어 카페24 인증 서버로부터 권한을 인증 받고, 카페24 리소스 서버에 있는 리소스 소유자의 데이터를 가져오고자 합니다.
1) 클라이언트 앱 등록
먼저 클라이언트는 리소스 서버에 앱을 등록해야 합니다. 이 과정에서 Client ID와 Client Secret이 생성되는데요, 이 값들은 추후 인증 서버에 인증을 요청할 때 자신을 증명하는데 사용됩니다. 앱 등록 시 입력한 Redirect URI는 인증 서버가 요청에 대한 응답을 보낼 경로가 됩니다.
2) Access Token 을 위한 인증 코드 발급
Access Token이란 API로 데이터를 요청할 때, 리소스 서버에서 클라이언트가 해당 데이터에 대한 접근 권한이 있는지 확인할 수 있는 키입니다. 따라서 API 사용 시 중요한 필수값이라고 할 수 있는데요, Access Token을 받기 위해서는 먼저 인증 코드가 필요합니다. 인증 코드의 사용은 Access Token의 노출을 피하기 위한 과정이라고 할 수 있습니다. 리소스 소유자가 클라이언트 앱을 실행하여 권한 위임에 대한 동의를 하면, 클라이언트는 인증 서버에 인증 코드를 요청합니다. 인증 서버는 클라이언트 검증 후 인증 코드를 발급하여 Redirect URI로 반환합니다.
인증 코드 Request
https://{mall_id}.cafe24api.com/api/v2/oauth/authorize?response_type=code&client_id={client_id}&state={encode_csrf_token}&redirect_uri={encode_redirect_uri}&scope={scope}
인증 코드 Response
{redirect_uri}?code={authorization_code}&state={encode_csrf_token}
3) Access Token 발급
클라이언트는 인증 코드를 사용하여 인증 서버에 Access Token을 요청합니다. 인증 서버는 Access Token을 Refresh Token 등과 함께 반환합니다. Access Token의 유효 기간은 2시간이고, 만료 시 Refresh Token을 사용하여 재발급 받습니다. Refresh Token도 만료된 경우 재인증이 필요합니다.
Access Token Request 형식
curl -X POST
'https://{mall_id}.cafe24api.com/api/v2/oauth/token'
-H 'Authorization: Basic {base64_encode({client_id}:{client_Secret})}'
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'grant_type=authorization_code'
-d 'code={authorization_code}'
-d 'redirect_uri={redirect_uri}'
Access Token Response
{
"access_token": "{access_token}",
"expires_at": "{expiration_date_of_access_token}",
"refresh_token": "{refresh_token}",
"refresh_token_expires_at": "{expiration_date_of_refresh_token}",
"client_id": "{client_id}",
"mall_id": "{mall_id}",
"user_id": "{user_id}",
"scopes": [
"{scopes_1}",
"{scopes_2}"
],
"issued_at": "{issued_date}"
}
4) API 요청을 통한 데이터 획득
이제 Access Token을 사용하여 필요한 데이터에 대한 API 요청을 보내고 응답을 받을 수 있습니다. 예를 들어 리소스 소유자 카페24 쇼핑몰에 등록된 쇼핑몰 정보에 대한 데이터를 요청한다고 하겠습니다. 클라이언트는 리소스 서버에 쇼핑몰 정보를 조회하는 API 요청 주소를 Access Token과 함께 호출합니다. Access Token이 유효하다면 리소스 서버는 해당 정보를 반환하고, 리소스 소유자는 요청한 정보를 클라이언트로부터 확인할 수 있게 됩니다.
쇼핑몰 정보 조회 Request 형식
curl -X GET \
'https://{mallid}.cafe24api.com/api/v2/admin/store?shop_no=1' \
-H 'Authorization: Bearer {access_token}' \
-H 'Content-Type: application/json' \
-H 'X-Cafe24-Api-Version: {version}'
쇼핑몰 정보 조회 Response
{
"store": {
"shop_no": 1,
"shop_name": "My Shopping Mall",
"mall_id": "myshop",
"base_domain": "sample.cafe24.com",
"primary_domain": "sample.com",
"company_registration_no": "118-81-20586",
"company_name": "My Shopping Mall",
...(생략)
}
}
지금까지 OAuth와 이를 활용한 API 연동 방법에 대해 알아보았습니다. 현재 다양한 플랫폼에서 제공하는 API는 각각의 특징과 목적에 따라 독자적인 가이드와 인증 방식을 갖추고 있습니다. 이를 활용하여 자신의 개발 환경에 맞게 응용한다면 훨씬 더 풍부한 기능을 구현할 수 있을 것입니다.
Ref.
https://developers.cafe24.com/app/front/common (카페24 개발자센터 공통 가이드)
https://developers.cafe24.com/docs/api/ (카페24 API 문서)
https://hudi.blog/oauth-2.0/ (OAuth 2.0 개념과 동작원리)