Skip to main content

인증

모든 API 요청은 API Key + HMAC-SHA256 서명 방식으로 인증합니다.

필수 헤더​

헤더설명
X-API-Key대시보드에서 발급받은 API 키 (kb_...)
X-Timestamp요청 시각 (Unix 밀리초, Date.now())
X-SignatureHMAC-SHA256 서명 (hex 인코딩)
caution

X-Timestamp는 서버 시각 기준 ±5분 이내여야 합니다. 초과 시 401 Timestamp outside tolerance window 오류가 발생합니다.

서명 생성 방법​

1. 서명 대상 문자열 구성​

{METHOD}\n{PATH}\n{TIMESTAMP}\n{BODY_HASH}
항목설명
METHOD대문자 HTTP 메서드 (GET, POST 등)
PATH쿼리스트링 제외 경로 (예: /certificates)
TIMESTAMPX-Timestamp 값과 동일
BODY_HASH요청 바디의 SHA-256 hex 값. 바디 없으면 빈 문자열의 해시

2. HMAC-SHA256 서명​

X-API-Secret (API 시크릿 키, kbs_...)으로 위 문자열을 HMAC-SHA256 서명합니다.

3. 요청 바디 해시 규칙​

요청 유형BODY_HASH 계산 방법
JSON 바디 있음SHA256(JSON.stringify(body)) — 공백 없이 직렬화
바디 없음 (GET 등)SHA256("") — 빈 문자열 해시
multipart/form-data (이미지 업로드)SHA256("") — 빈 문자열 해시

코드 예시​

import crypto from 'crypto';

function sign(
method: string,
path: string,
timestamp: string,
body: Record<string, unknown> | null,
secret: string,
): string {
const bodyHash = crypto
.createHash('sha256')
.update(body ? JSON.stringify(body) : '')
.digest('hex');

const stringToSign = `${method}\n${path}\n${timestamp}\n${bodyHash}`;

return crypto
.createHmac('sha256', secret)
.update(stringToSign)
.digest('hex');
}

async function apiRequest(
method: string,
path: string,
body?: Record<string, unknown>,
) {
const apiKey = 'kb_your_api_key';
const apiSecret = 'kbs_your_api_secret';
const timestamp = String(Date.now());
const signature = sign(method, path, timestamp, body ?? null, apiSecret);

const res = await fetch(`https://api.koreabaas.co.kr${path}`, {
method,
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
'X-Timestamp': timestamp,
'X-Signature': signature,
},
body: body ? JSON.stringify(body) : undefined,
});

return res.json();
}
note

JSON.stringify 직렬화 시 공백(space) 없이 직렬화해야 서명이 일치합니다.
Python에서는 json.dumps(body, separators=(',', ':'), ensure_ascii=False)를 사용하세요.


오류 코드​

HTTP코드설명
401—Missing headers
401—Invalid X-Timestamp
401—Timestamp outside tolerance window
401—Invalid API key
401—Signature mismatch
401—API key not active / expired