인증 문자열 생성 (REST API)

최종 업데이트: 2025년 3월 31일

일부 REST 엔드포인트는 주문을 하거나 디지털 자산 출금을 요청하는 것과 같은 민감한 작업을 수행할 수 있습니다. 따라서 이러한 비공개 엔드포인트는 암호화된 요청을 통해서만 호출할 수 있으며, 각 요청에는 인증 문자열(authent)이 포함되어야 합니다. authent는 다음 입력값으로부터 계산됩니다.

PostData

postData는 <argument>=<value> 형식의 "&" 연결이며 각 REST 엔드포인트에 고유합니다.

예시

엔드포인트 orderbook을 운영하려면 fi_xbtusd_180615 값을 가진 인자 symbol을 선택합니다.
그러면 postData는 symbol=fi_xbtusd_180615로 주어집니다.

v3 엔드포인트에 대한 인증 흐름 업데이트: 2024년 2월 20일부터 모범 사례에 부합하고 더 높은 보안 표준을 보장하기 위해 /derivatives/* (v3) 엔드포인트에 대한 인증 흐름을 업데이트할 예정입니다. (자세한 내용은 아래 참조)

PostData 생성 변경 사항:


- 릴리스 전: 사용자는 Authent 생성을 위해 URL 인코딩 전에 쿼리 문자열 매개변수를 해싱해야 했습니다(예: `greeting=hello world`).


- 릴리스 후: 이제 인증 프로세스는 요청에 나타나는 전체 URL 인코딩된 URI 구성 요소를 해싱해야 합니다(예: `greeting=hello%20world`). 이 방법은 보안을 강화하고 모범 사례에 부합합니다.
이 업데이트는 쿼리 매개변수에 JSON 본문을 허용하는 v3 batchorder 엔드포인트에 특히 관련이 있습니다.


하위 호환성 및 향후 계획:


현재로서는 이 변경 사항은 하위 호환됩니다. 플랫폼은 위에 설명된 두 가지 PostData 생성 방법을 모두 허용합니다. 그러나 우리는 최고 보안 표준을 유지하기 위해 향후 기존 방법(디코딩된 쿼리 문자열 매개변수 해싱)을 단계적으로 폐지할 계획입니다. 이 변경 사항에 앞서 충분한 공지를 제공할 것이며, 모든 사용자가 원활한 서비스 연속성을 보장하기 위해 가능한 한 빨리 새 방법으로 전환할 것을 강력히 권장합니다.

Nonce

nonce는 지속적으로 증가하는 정수 매개변수입니다. 좋은 nonce는 밀리초 단위의 시스템 시간입니다.
(문자열 형식). 당사 시스템은 잠시 동안 순서가 맞지 않는 nonce를 허용합니다. Nonce는 필수가 아닙니다.

예시 1415957147987

많은 인증 문제는 잘못된 nonce와 관련이 있습니다. 새로운 API 키 쌍은 nonce를 자동으로 재설정하고 이러한 문제를 해결합니다.

Endpoint Path

endpointPath 이것은 엔드포인트의 URL 확장입니다.

예시 /api/v3/orderbook

API Secret

api_secret은 이전 섹션에 설명된 대로 얻을 수 있습니다.

예시

rttp4AzwRfYEdQ7R7X8Z/04Y4TZPa97pqCypi3xXxAqftygftnI6H9yGV+O
cUOOJeFtZkr8mVwbAndU3Kz4Q+eG

이러한 입력값을 기반으로 authent는 다음과 같이 계산되어야 합니다:

  1. 1

    연결

    postData

    +

    nonce

    +

    endpointPath

  2. 2

    1단계 결과를 SHA-256 알고리즘으로 해시합니다.

  3. 3

    api_secret을 Base64-디코딩합니다.

  4. 4

    3단계 결과를 사용하여 2단계 결과를 HMAC-SHA-512 알고리즘으로 해시합니다.

  5. 5

    4단계 결과를 Base64-인코딩합니다.

예시

다음은 Java로 구현된 authent를 보여줍니다. 다양한 프로그래밍 언어로 된 전체 작동 예시는 추가 자료 섹션을 참조하십시오. public static String getAuthent(String postData, String nonce, String endpointPath, String secretKeyBase64)
{
Mac mac512;
MessageDigest sha256;
try {
SecretKey secretKey = new SecretKeySpec 
(Base64.decode(secretKeyBase64.getBytes()), HMAC_SHA_512);
mac512 = Mac.getInstance(HMAC_SHA_512);
mac512.init(secretKey);
sha256 = MessageDigest.getInstance("SHA-256");
} catch (IOException e) {
...
} catch (InvalidKeyException e) {
...
} catch (NoSuchAlgorithmException e) {
...
} sha256.update(postData.getBytes());
sha256.update(nonce.getBytes());
sha256.update(endpointPath.getBytes());
mac512.update(sha256.digest());
return Base64.encodeBytes(mac512.doFinal()).trim();
}

더 많은 도움이 필요하신가요?