인증
앞서 "기본 정보"에서 확인한것과 같이 웹소켓은 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 등)
필드명 | 타입 | 내용 | 필수 여부 | 기본 값 |
---|---|---|---|---|
ticket | String | 요청자를 식별할 수 있는 값 | O |
Type Field
수신하고 싶은 시세 정보를 나열하는 필드입니다.
isOnlySnapshot, isOnlyRealtime 필드는 생략 가능하며 모두 생략시 스냅샷과 실시간 데이터 모두를 수신합니다.
하나의 요청에 {type field}는 여러개를 명시할 수 있습니다.
필드명 | 타입 | 내용 | 필수 여부 | 기본 값 |
---|---|---|---|---|
type | String | 데이터 타입 - ticker : 현재가- trade : 체결- orderbook : 호가 | O | |
codes | List | 마켓 코드 리스트 *대문자로 요청해야 합니다. | O | |
isOnlySnapshot | Boolean | 스냅샷 시세만 제공 | X | false |
isOnlyRealtime | Boolean | 실시간 시세만 제공 | X | false |
private 데이터에서의 codes
private 데이터의 경우
codes
필드를 생략하거나 빈 배열로 요청할 경우 모든 마켓에 대한 정보를 수신하실 수 있습니다.
Format Field
마지막으로 포맷 정보입니다. Simple로 지정될 경우 응답의 필드명이 모두 간소화됩니다. 트래픽 부담이 클 때 사용하는 방법입니다.
필드명 | 타입 | 내용 | 필수 여부 | 기본 값 |
---|---|---|---|---|
format | String | 수신할 포맷 - DEFAULT : 기본형- SIMPLE : 축약형 | X | DEFAULT |