인증

앞서 "기본 정보"에서 확인한것과 같이 웹소켓은 Public 데이터와 Private 데이터로 나누어져있습니다. Public 데이터를 수신하기 위해서는 별다른 인증이 필요 없습니다. Private 데이터를 수신하기 위해서는 Websocket 연결 시 인증에 성공해야합니다.

  • REST API 에서와 동일하게 Authorization 헤더를 통해 인증을 진행합니다.
  • 인증 가능한 요청 만들기 의 "JWT 인증 토큰 만들기" 를 참고하시기 바랍니다.

(예시) Header 에 인증 정보를 담아 Websocket 연결

const jwt = require("jsonwebtoken");
const {v4: uuidv4} = require('uuid');
const WebSocket = require("ws");

const payload = {
    access_key: "발급받은 Access key", 
    nonce: uuidv4(),
};


const jwtToken = jwt.sign(payload, "발급받은 Secret key");

const ws = new WebSocket("wss://api.upbit.com/websocket/v1", {
    headers: {
        authorization: `Bearer ${jwtToken}`
    }
});


ws.on("open", () => {
    console.log("connected!");
    // Request after connection
    ws.send('[{"ticket":"test example"},{"type":"myTrade"}]');

});

ws.on("error", console.error);

ws.on("message", (data) => console.log(data.toString()));

ws.on("close", () => console.log("closed!"));
import jwt  # PyJWT
import uuid
import websocket  # websocket-client


def on_message(ws, message):
    # do something
    data = message.decode('utf-8')
    print(data)


def on_connect(ws):
    print("connected!")
    # Request after connection
    ws.send('[{"ticket":"test example"},{"type":"myTrade"}]')


def on_error(ws, err):
    print(err)


def on_close(ws, status_code, msg):
    print("closed!")


payload = {
    'access_key': "발급받은 Access key",
    'nonce': str(uuid.uuid4()),
}

jwt_token = jwt.encode(payload, "발급받은 Secret key");
authorization_token = 'Bearer {}'.format(jwt_token)
headers = {"Authorization": authorization_token}

ws_app = websocket.WebSocketApp("wss://api.upbit.com/websocket/v1",
                                header=headers,
                                on_message=on_message,
                                on_open=on_connect,
                                on_error=on_error,
                                on_close=on_close)
ws_app.run_forever()

요청 포맷

연결이 성공적으로 이루어졌다면 웹소켓 서버에 여러가지 요청을 할 수 있습니다.
요청은 JSON Object를 이용하며 응답 또한 JSON Object 입니다.

요청은 크게 ticket field, type field, format field 로 나누어지며 각각의 필드는 다음 구성요소로 이루어져 있습니다.

📘

Request format

[{Ticket Field},{Type Field},....,{Type Field},{Format Field}]

Ticket Field

일반적으로 용도를 식별하기 위해 ticket 이라는 필드값이 필요합니다.
이 값은 시세를 수신하는 대상을 식별하며 되도록 유니크한 값을 사용하도록 권장합니다. (UUID 등)

필드명
타입
내용
필수 여부
기본 값
ticketString요청자를 식별할 수 있는 값O

Type Field

수신하고 싶은 시세 정보를 나열하는 필드입니다.
isOnlySnapshot, isOnlyRealtime 필드는 생략 가능하며 모두 생략시 스냅샷과 실시간 데이터 모두를 수신합니다.

하나의 요청에 {type field}는 여러개를 명시할 수 있습니다.

필드명
타입
내용
필수 여부
기본 값
typeString데이터 타입
ticker: 현재가
trade: 체결
orderbook: 호가
O
codesList마켓 코드 리스트
*대문자로 요청해야 합니다.
O
isOnlySnapshotBoolean스냅샷 시세만 제공Xfalse
isOnlyRealtimeBoolean실시간 시세만 제공Xfalse

📘

private 데이터에서의 codes

private 데이터의 경우 codes 필드를 생략하거나 빈 배열로 요청할 경우 모든 마켓에 대한 정보를 수신하실 수 있습니다.

Format Field

마지막으로 포맷 정보입니다. Simple로 지정될 경우 응답의 필드명이 모두 간소화됩니다. 트래픽 부담이 클 때 사용하는 방법입니다.

필드명
타입
내용
필수 여부
기본 값
formatString수신할 포맷
- DEFAULT: 기본형
- SIMPLE: 축약형
XDEFAULT