One-Time Password(OTP) API¶
One-Time Password(OTP) 인증 시스템은 게임에 OTP 인증을 적용할 수 있도록 OTP 발송과 OTP 검증으로 구성된 API를 제공합니다.
환경별 접근 URL¶
| 서버 | URL |
|---|---|
| Production | https://otp.qpyou.cn |
| Sandbox | https://sandbox-otp.qpyou.cn |
인증 방식¶
OTP 발송 시스템이 제공하는 API를 사용하려면 먼저 인증 토큰(API KEY)을 발급받아야 합니다. 인증 토큰은 앱센터에 게임이 등록되면 자동으로 생성됩니다. 인증 토큰은 JSON Web Token(JWT) 명세를 따르며, 만료 시간이 없어 고정적으로 사용할 수 있습니다.
OTP 발송¶
OTP Short Message Service(SMS) 발송¶
- Basic Info
| Method | POST |
|---|---|
| URL | /otp/send |
- Request Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
| Authorization | bearer |
| Topic | 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID |
-
OTP SMS를 앱 개발사가 직접 발송 시 콜백
OTP에서 OTP SMS를 직접 발송하는 것이 아니라 앱 개발사가 직접 발송하는 경우, 발송에 필요한 정보를 콜백으로 받을 수 있습니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 직접 발송을 선택하면, 등록한 콜백 URL로 아래 데이터가 Request Body에 JSON 형태로 전달됩니다. 설정 방법은 직접 발송을 참고하세요. 콜백 요청 예시와 전달하는 데이터를 함께 확인하세요.
-
Request Body
| 필드 | 타입 | 필수여부 | 설명 |
|---|---|---|---|
| to | String | O | 수신 전화번호 |
| toCountryNo | String | O | 수신 국가코드 |
| retry | Boolean | X | 이 API를 사용해 동일한 수신자에게 OTP SMS를 보내려고 시도한 이력이 있는지 여부입니다. 값이 주어지지 않으면, 최근 5분 이내에 동일한 수신자에게 OTP SMS를 전송 시도한 이력이 있을 때 true, 그렇지 않으면 false로 설정됩니다. |
| lookup | Boolean | X | to 값이 유효한 전화번호 형식인지 검증할지 여부로 기본값은 false입니다. true일 때는 검증을 수행하므로 API 응답에 대략 250ms ~ 2000ms정도 소요되며, false일 때에는 보통 200ms 이내로 API 응답을 받습니다. |
| lang | String | X | 언어 코드로 기본값은 en. 유효한 언어 코드
|
- Response Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
- Response Body
| 필드 | 타입 | 설명 |
|---|---|---|
| otp | String | OTP 번호 |
| provider | String | SMS 제공자 |
| expiry | String | OTP 유효시간 |
| expiryTimestamp | Long | OTP 유효시간 타임스탬프(초 단위) |
- Request Sample
다음 예시는 Topic 헤더와 수신자 정보를 포함해 OTP SMS 발송 API를 호출할 때 사용합니다.
//sample 1
curl --location 'https://otp.qpyou.cn/otp/send'
--header 'Authorization: Bearer AUTH_TOKNE_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"to" : "01012345678",
"toCountryNo" : "82",
"lang" : "ko"
}'
//sample 2
curl --location 'https://otp.qpyou.cn/otp/send'
--header 'Authorization: Bearer AUTH_TOKNE_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"to" : "01012345678",
"toCountryNo" : "82",
"lang" : "ko",
"retry" : true,
"lookup" : true
}'
- Response Sample
OTP SMS 발송 요청이 정상 처리되면 다음과 같은 응답 본문을 받습니다.
{
"otp" : "123456",
"provider" : "YOUR_SMS_PROVIDER",
"expiry" : "2026-03-23T11:00:48.533695818+09:00",
"expiryTimestamp" : 1774231248
}
콜백 예시¶
앱 개발사가 직접 발송하도록 설정한 경우 등록한 콜백 URL은 다음과 같은 요청 본문을 받습니다.
curl --location 'https://{your_callback_url}'
--header 'Content-Type: application/json'
--data '{
"to":"01012345678",
"toCountryNo":"82",
"lang":"en",
"retry":null,
"lookup":false,
"serviceName":"LocalTest",
"otp":"809881",
"provider":"DIRECTSEND",
"expiry":"2024-06-26T11:36:29.680680500+09:00[Asia/Seoul]",
"expiryTimestamp":1719369389680
}'
콜백 데이터 정보¶
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| expiry | String | O | OTP 유효시간 (예시: 2024-06-25T11:39:43.076573600+09:00[Asia/Seoul]) |
| expiryTimestamp | Long | O | OTP 유효시간 타임스탬프(밀리초 단위) (예시: 1719283183076) |
| lang | String | X | 언어 코드로 기본값은 en |
| lookup | boolean | X | to 값이 유효한 전화번호 형식인지 검증. 기본값은 false |
| otp | String | O | OTP 번호 |
| provider | String | O | SMS 제공자, 직접 발송이므로 DIRECTSEND 고정값으로 전달됨 |
| retry | boolean | X | 재시도 여부 |
| serviceName | String | O | 발송 정보 설정 메뉴에서 설정한 발송 서비스 명(영문) |
| to | String | O | 수신 전화번호 |
| toCountryNo | String | O | 수신 국가코드 |
오류 응답 코드¶
| HTTP Status | id | error | 설명 |
|---|---|---|---|
| 400 | 40004 | VALIDATION_FAIL | 요청 본문 유효성 검증에 실패하면 발생합니다. |
| 400 | 40003 | INVALID_PHONE_NUMBER | 전화번호 유효성 검증에 실패하면 발생합니다. |
| 422 | 42202 | NO_TOPIC | 헤더의 Topic에 전달한 값이 유효하지 않으면 발생합니다. |
| 409 | 40902 | DUPLICATE_OTP_EXISTS | 동일한 인증 대상에 대해 일정 시간 내 중복 OTP 발급 요청이 감지되면 DUPLICATE_OTP_EXISTS 오류를 반환합니다. 최대 15초 후 다시 시도해 주세요. |
| 429 | 42903 | SMS_LIMIT_EXCEEDED | 동일한 번호로 24시간 동안 설정한 발송 한도를 초과해 요청하면 발생합니다. 응답 메시지에는 설정된 한도 값이 포함될 수 있습니다. |
Topic 값이 유효하지 않은 경우¶
요청 헤더의 Topic 값이 하이브 콘솔에 등록한 발송 ID와 일치하지 않으면 이 오류가 발생합니다. Topic 헤더 값과 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에 등록한 발송 ID를 확인하세요.
동일한 OTP가 중복 생성된 경우¶
같은 요청을 같은 구간 안에서 두 번 보내면 동일한 OTP가 생성됩니다. 이때 첫 번째 요청은 성공하고 두 번째 요청은 DUPLICATE_OTP_EXISTS로 실패합니다. 현재 구간이 끝난 뒤 다음 구간에서 같은 요청을 다시 보내세요.
{
"id" : 40902,
"error" : "DUPLICATE_OTP_EXISTS",
"reason" : "Already sent OTP to this phone number."
}
24시간 발송 한도를 초과한 경우¶
같은 전화번호로 24시간 동안 허용된 발송 횟수를 넘기면 이 오류가 발생합니다. 이 한도는 고정값이 아닙니다. 아래 예시의 응답 메시지에 포함된 횟수는 설정한 한도 값을 보여주는 예시입니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 일일 발송 한도를 확인하세요.
{
"id" : 42903,
"error" : "SMS_LIMIT_EXCEEDED",
"reason" : "Too many requests in 24 hours. (Can not exceed 10 times)"
}
OTP 검증¶
| Method | POST |
|---|---|
| URL | /otp/verify |
- Request Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
| Authorization | bearer |
| Topic | 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID |
- Request Body
| 필드 | 타입 | 필수여부 | 설명 |
|---|---|---|---|
| toCountryNo | String | O | 수신 국가번호 |
| to | String | O | 수신 전화번호 |
| otp | String | O | 수신 OTP |
- Response Header
| 필드 | 타입 |
|---|---|
| Content-Type | application/json |
- Response Body
| 필드 | 타입 | 설명 |
|---|---|---|
| result | boolean | OTP 검증 결과 |
- Request Sample 1
다음 예시는 수신 전화번호와 OTP 번호를 전달해 OTP를 검증할 때 사용합니다.
// sample 1
curl --location 'https://otp.qpyou.cn/otp/verify'
--header 'Authorization: bearer AUTH_TOKEN_VALUE'
--header 'Topic: testTopicName'
--header 'Content-Type: application/json'
--data '{
"toCountryNo" : "82",
"to" : "01036012891",
"otp" : "123456"
}'
- Response Sample
OTP가 일치한 경우 응답 본문은 다음과 같습니다.