주문 API(/orders/*)는 요청 위변조를 방지하기 위한 HMAC-SHA512 서명이 필요합니다. 주문 생성, 취소, 정정 등 자산 변동이 발생하는 API가 이에 해당합니다. 조회 API는 JWT 인증만으로 충분하며 서명이 불필요합니다.
서명 생성 규칙#
주문 API(POST /orders/*)에만 서명이 필요합니다. 조회 API는 JWT 인증만으로 충분합니다.Signature = HMAC-SHA512(secret_key, Method + Path + Timestamp + SHA512(Body))
구성 요소#
| 요소 | 설명 | 예시 |
|---|
| Method | HTTP 메서드 (대문자) | POST |
| Path | 요청 경로 (query string 제외) | /open/v1/orders |
| Timestamp | X-Timestamp 헤더와 동일한 값 | 1709625600 |
| SHA512(Body) | Request Body의 SHA-512 해시 (hex) | a3f8c2d1... |
주의
각 요소 사이에 구분자를 넣지 않습니다. 단순 문자열 연결(concatenation)입니다.
단계별 예시#
POST /open/v1/orders 주문 생성 API를 호출하는 경우입니다.Method: POST | Path: /open/v1/orders | Timestamp: 1709625600
Body: {"stockCd":"USDKRW","orderTypeCd":"LIMIT","sideCd":"BUY","orderQuantity":1000,"orderPrice":1350.50,"profitRealizationYn":"N","profitRealizationBarrierPrice":0,"lossCutYn":"N","lossCutBarrierPrice":0,"lossTrackingYn":"N"}
Step 2. Body SHA-512 해시 생성 → "8a2e4f6c..." (128자 hex)SignPayload = "POST" + "/open/v1/orders" + "1709625600" + "8a2e4f6c..."
Step 4. HMAC-SHA512 서명 → "c5d9a1b3..." (128자 hex)
언어별 구현#
Python#
JavaScript#
Java#
Replay Attack 방지#
서버는 X-Timestamp(초 단위)와 서버 현재 시간을 비교하여 ±60초 이내의 요청만 유효하게 처리합니다. 60초를 초과한 과거 요청은 자동으로 거부되므로 Replay Attack의 유효 시간이 제한됩니다.참고
클라이언트 시스템의 시간이 부정확하면 인증 실패가 발생할 수 있습니다. NTP 서버와 동기화하여 시간 오차를 최소화하세요.
디버깅 체크리스트#
OA_004 또는 OA_005 에러가 발생하면 아래를 확인하세요.| # | 확인 항목 | O | X |
|---|
| 1 | Method가 대문자인가 | POST | post |
| 2 | Path에 query string 미포함 | /open/v1/orders | /open/v1/orders?page=1 |
| 3 | Timestamp = X-Timestamp 동일 | 같은 값 | 다른 값 |
| 4 | Body = 실제 전송 body 동일 | 동일 JSON | 공백/순서 다름 |
| 5 | GET/DELETE에서 body hash 미포함 | M+P+TS | M+P+TS+hash |
| 6 | secret_key 정확 | 발급 원본 | 오타 |
| 7 | 시스템 시간 정확 | NTP 동기화 | 60초+ 차이 |