개발자 문서 메뉴
API REFERENCE / RECOMMENDED
REST API v2
서명 기반 Bearer 토큰 인증
API 버전
OpenAPI ↗인증 (v2)
REST API / v2 인증 (v2)
Bearer token인증 (v2)
개요
v2 API는 서명 기반의 Bearer 토큰 방식을 사용합니다.
토큰은 sgv2.{payload}.{signature} 형태이며, 발급 후 24시간 동안 유효합니다.
⚠️ v1 토큰과 v2 토큰은 호환되지 않습니다. v2 엔드포인트에는 반드시 v2 토큰을 사용해야 합니다.
토큰 발급 API
Request
POST /api/v2/token
Headers
| 키 | 값 | 설명 |
|---|---|---|
| Authorization | Basic {ENCODED_SECRET_KEY} |
Base64 인코딩된 액세스 키와 시크릿 키 |
| Content-Type | application/x-www-form-urlencoded |
고정 값 |
Authorization 설정 방법
엑세스 키와 시크릿 키를
:로 연결ACCESS_KEY:SECRET_KEY해당 문자열을 Base64 인코딩
헤더에 다음 형태로 설정
Authorization: Basic {인코딩된 값}
💡 Tip: 로그인 > 연동하기 > 앱 · API 연동 > 내 앱 · API 키에서 앱을 등록하세요. 신규 앱은 기본으로 자동 승인되어 액세스 키와 시크릿 키를 바로 사용할 수 있습니다. 문제가 발견된 앱은 사용이 중지되며, 기존 토큰도 차단됩니다. 발신번호·기업·템플릿 등의 별도 승인 요건은 그대로 적용됩니다.
Response
성공 응답
{
"message": "Success",
"data": {
"token": "sgv2.eyJ2ZXJzaW9uIjoidjIiLCJhcHBsaWNhdGlvbl9pZCI6IjEiLCJub25jZSI6ImFiY2QiLCJpc3N1ZWRfYXQiOjE3MDA4MDAwMDB9.abc123signature",
"expires_at": "2024-09-05T07:28:21.000000Z"
},
"meta": {
"version": "v2"
}
}
| 필드 | 설명 |
|---|---|
| message | 처리 결과 메시지 (Success) |
| data.token | 발급된 v2 액세스 토큰 (sgv2. 로 시작) |
| data.expires_at | 토큰 만료 일시 (UTC 기준) |
| meta.version | API 버전 (v2) |
API 호출 시 인증 헤더
토큰 발급 후 모든 v2 API 요청에 아래 헤더를 포함해야 합니다.
Authorization: Bearer {발급받은_v2_토큰}
예시
GET /api/v2/credits HTTP/1.1
Authorization: Bearer sgv2.eyJ2ZXJzaW9uIjoidjIifQ.abc123signature
Content-Type: application/json
v2 응답 형식
토큰 발급 API는 message, data, meta 구조를 사용합니다.
토큰 인증이 필요한 v2 API는 traceId, message, data 구조를 사용하며, 문제 발생 시 traceId로 로그를 추적할 수 있습니다.
성공 응답
{
"traceId": "01J2XXXXXXXXXXXXXXXXXXXXX",
"message": "Success",
"data": { }
}
실패 응답
{
"traceId": "01J2XXXXXXXXXXXXXXXXXXXXX",
"code": "TOKEN_EXPIRED",
"message": "Expired Token",
"errors": [],
"timestamp": "2024-09-04 07:28:21"
}
| 필드 | 설명 |
|---|---|
| traceId | 요청 추적 ID (로그 확인 시 사용) |
| code | 에러 코드 |
| message | 에러 메시지 |
| errors | 필드별 유효성 검사 오류 목록 |
| timestamp | 에러 발생 시각 |
주요 에러 코드
| 코드 | HTTP | 설명 |
|---|---|---|
INVALID_BEARER_TOKEN |
401 | Bearer 토큰 없음 또는 형식 오류 |
INVALID_BEARER_TOKEN_PREFIX |
401 | sgv2. 접두사 없음 |
TOKEN_MISMATCH |
401 | 토큰이 현재 발급된 토큰과 불일치 |
TOKEN_EXPIRED |
401 | 토큰 만료 |
TOKEN_RECORD_NOT_FOUND |
401 | 토큰 레코드 없음 |
PAYMENT_REQUIRED |
402 | 크레딧 부족 |
NOT_FOUND |
404 | 리소스를 찾을 수 없음 |
INTERNAL_SERVER_ERROR |
500 | 서버 내부 오류 |
예제 코드
PHP
<?php
// 1. v2 토큰 발급
$baseUrl = 'https://your-domain.com';
$accessKey = 'access_key';
$secretKey = 'secret_key';
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "{$baseUrl}/api/v2/token",
CURLOPT_HTTPHEADER => [
'Authorization: Basic ' . base64_encode($accessKey . ':' . $secretKey),
'Content-Type: application/x-www-form-urlencoded',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
]);
$response = json_decode(curl_exec($curl), true);
curl_close($curl);
$v2Token = $response['data']['token']; // sgv2.xxx.xxx
// 2. v2 토큰으로 API 호출
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "{$baseUrl}/api/v2/credits",
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $v2Token,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
]);
$result = curl_exec($curl);
curl_close($curl);
echo $result;
Node.js
const baseUrl = 'https://your-domain.com';
const accessKey = 'access_key';
const secretKey = 'secret_key';
// 1. v2 토큰 발급
const tokenRes = await fetch(`${baseUrl}/api/v2/token`, {
method: 'POST',
headers: {
'Authorization': 'Basic ' + btoa(`${accessKey}:${secretKey}`),
'Content-Type': 'application/x-www-form-urlencoded',
},
});
const { data } = await tokenRes.json();
const v2Token = data.token; // sgv2.xxx.xxx
// 2. v2 토큰으로 API 호출
const res = await fetch(`${baseUrl}/api/v2/credits`, {
headers: {
'Authorization': `Bearer ${v2Token}`,
'Content-Type': 'application/json',
},
});
console.log(await res.json());
주의사항
- v2 토큰은 발급 후 24시간 동안 유효합니다.
- 토큰 재발급 시 이전 v2 토큰은 즉시 무효화됩니다.
- v2 토큰은 반드시
sgv2.로 시작해야 하며, 그렇지 않으면INVALID_BEARER_TOKEN_PREFIX오류가 반환됩니다. - v1 엔드포인트(
/api/v1/...)에는 v1 토큰을, v2 엔드포인트(/api/v2/...)에는 v2 토큰을 사용해야 합니다.
만드는 일에 집중하세요. 메시지는 샌드고가.맨 위로 ↑