기본 콘텐츠로 건너뛰기

BitMEX WebSocket 인증(authKeyExpires) 구현 예제 (Java + XChange 코드 포함)

Java XChange로 BitMEX WebSocket 인증 서명 만들기 (SignatureUtil + wss 예제)

암호화폐 마진 거래소인 BitMEX는 REST API뿐 아니라 WebSocket(wss) 인터페이스를 통해 실시간 시세, 주문 정보 등을 제공합니다. 이때, 개인 계정 정보나 주문 정보를 사용하려면 WebSocket 인증(authKeyExpires)을 통과해야 합니다.

이 글에서는 Java + XChange 라이브러리를 사용하여 authKeyExpires에 필요한 signature를 생성하는 방법과 직접 구현한 SignatureUtil 클래스를 정리합니다.

  • BitMEX WebSocket 인증(authKeyExpires) 개념
  • XChange의 BitmexDigestExpirationTimeFactory 활용
  • SignatureUtil 구현 코드
  • ws.sendText로 실제 WebSocket 인증 요청 보내기

1. BitMEX WebSocket 인증(authKeyExpires)란?

BitMEX WebSocket에서 개인 데이터(포지션, 주문 등)에 접근하려면 authKeyExpires 메시지를 한 번 보내서 인증을 받아야 합니다.

요청 포맷은 다음과 같은 JSON 형태입니다.


{
  "op": "authKeyExpires",
  "args": [
    "API_KEY",
    EXPIRES,
    "SIGNATURE"
  ]
}
  
  • API_KEY : BitMEX에서 발급받은 API 키
  • EXPIRES : 만료 시간(Unix timestamp 등, BitMEX 규격에 맞게 설정)
  • SIGNATURE : VERB + ENDPOINT + EXPIRES를 HMAC 서명한 값

이 글에서 소개하는 SignatureUtil 클래스는 바로 이 EXPIRES와 SIGNATURE 값을 생성하는 용도로 사용됩니다.

2. XChange 라이브러리 활용 포인트

Java에서 BitMEX에 연동할 때 많이 사용하는 라이브러리가 XChange (org.knowm.xchange) 입니다.

  • BitmexDigest : BitMEX 서명(HMAC) 생성을 도와주는 유틸
  • ExpirationTimeFactory : 일정 시간 후 만료되는 nonce/타임스탬프 생성
  • SynchronizedValueFactory<Long> : 스레드 안전한 증가 값 생성기 인터페이스

아래 예제에서는 BitmexDigest + ExpirationTimeFactory를 조합해서 WebSocket 서명에 필요한 EXPIRES와 signature를 만들어냅니다.

3. SignatureUtil 구현 (Java 코드)

먼저, BitMEX WebSocket 서명을 위한 SignatureUtil 클래스를 정리한 코드입니다.


import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import org.knowm.xchange.bitmex.service.BitmexDigest;
import org.knowm.xchange.utils.nonce.ExpirationTimeFactory;

import si.mazi.rescu.SynchronizedValueFactory;

public class SignatureUtil {

    // 30초 뒤 만료되는 타임스탬프(또는 nonce)를 생성하는 팩토리
    private SynchronizedValueFactory<Long> nonceFactory = new ExpirationTimeFactory(30);

    private Long EXPIRES = 0L;
    private String API_SECRET;
    private String API_KEY;

    public SignatureUtil(String API_KEY, String API_SECRET) {
        this.API_SECRET = API_SECRET;
        this.API_KEY = API_KEY;
    }

    /**
     * BitMEX WebSocket용 signature 생성 메서드
     * VERB + ENDPOINT + EXPIRES 문자열을 HMAC 서명해서 반환
     */
    public String bitmex_signature() throws UnsupportedEncodingException,
                                            NoSuchAlgorithmException,
                                            InvalidKeyException {

        BitmexDigest BD = BitmexDigest.createInstance(API_SECRET);

        String ENDPOINT = "/realtime";
        String VERB = "GET";
        String BITMEX_URL = "wss://www.bitmex.com"; // 필요 시 참고용

        // EXPIRES 값 생성 (30초 만료 기준)
        EXPIRES = nonceFactory.createValue();

        // BitMEX 서명 규칙: VERB + ENDPOINT + EXPIRES
        String data = VERB + ENDPOINT + String.valueOf(EXPIRES);

        // HMAC signature 생성
        return BD.digestString(data);
    }

    public String getAPI_SECRET() {
        return API_SECRET;
    }

    public void setAPI_SECRET(String aPI_SECRET) {
        API_SECRET = aPI_SECRET;
    }

    public String getAPI_KEY() {
        return API_KEY;
    }

    public void setAPI_KEY(String aPI_KEY) {
        API_KEY = aPI_KEY;
    }

    public Long getEXPIRES() {
        return EXPIRES;
    }

    public void setEXPIRES(Long eXPIRES) {
        EXPIRES = eXPIRES;
    }
}
  

코드 핵심 정리

  • nonceFactory = new ExpirationTimeFactory(30) → 30초 뒤 만료되는 값을 생성. EXPIRES 값으로 사용.
  • data = VERB + ENDPOINT + EXPIRES → BitMEX 인증 규칙에 맞게 서명 대상 문자열을 조합.
  • BitmexDigest.createInstance(API_SECRET) → API_SECRET을 사용해 HMAC 서명 유틸 인스턴스 생성.
  • bitmex_signature() 호출 시EXPIRES 값도 새로 생성되므로, 인증 요청 보낼 때 함께 사용해야 함.

4. WebSocket(wss)에서 authKeyExpires 전송 예제

위에서 만든 SignatureUtil을 사용하면, 실제 WebSocket 클라이언트 코드에서는 다음과 같이 인증 메시지를 전송할 수 있습니다.


// SignatureUtil 생성 (초기화 시 API KEY/SECRET 주입)
SignatureUtil signatureUtil = new SignatureUtil("YOUR_API_KEY", "YOUR_API_SECRET");

// WebSocket 연결 이후, 인증 메시지 전송
String bitmex_signature = signatureUtil.bitmex_signature();

ws.sendText(
    "{\"op\" : \"authKeyExpires\", " +
      "\"args\" : [\"" + signatureUtil.getAPI_KEY() + "\"," +
                       signatureUtil.getEXPIRES() + "," +
                      "\"" + bitmex_signature + "\"]}"
);
  

여기서 중요한 점

  • bitmex_signature() 호출 후에 getEXPIRES()를 사용해야 합니다. → 서명과 EXPIRES가 반드시 같은 시점 기준이어야 하기 때문입니다.
  • JSON 문자열에서 API_KEY, EXPIRES, SIGNATURE 순서를 정확히 맞춰야 합니다.
  • WebSocket 연결 후 가장 먼저 authKeyExpires를 보내 인증한 뒤, 개인 데이터 채널(예: position, order)을 subscribe 하는 순서로 구현하는 것이 일반적입니다.

5. 실무에서 사용할 때 팁

  • API_KEY / API_SECRET은 절대 코드에 하드코딩하지 말고, 환경변수 혹은 설정 파일에서 로딩하는 방식 권장
  • EXPIRES는 너무 짧거나 너무 길지 않게 적당한 만료 시간으로 조정
  • 실서비스에서는 로그 기록을 통해 인증 실패, 서명 오류 등을 추적
  • 테스트 환경(테스트넷)과 운영 환경(mainnet) BitMEX URL을 분리해서 관리

6. 정리

이 글에서는 Java XChange 라이브러리를 활용한 BitMEX WebSocket 인증 서명 구현 방법을 정리했습니다. 핵심은 다음과 같습니다.

  • BitmexDigestHMAC signature 생성
  • ExpirationTimeFactoryEXPIRES 값 생성
  • VERB + ENDPOINT + EXPIRES 문자열을 서명하여 WebSocket 인증에 사용
  • authKeyExpires 메시지로 API_KEY, EXPIRES, SIGNATURE 전송

위 예제 코드를 그대로 가져가서 프로젝트에 맞게 API 키/시크릿 관리 방식만 바꿔주면, 빠르게 BitMEX WebSocket 인증 로직을 구축할 수 있습니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...