크립토 시장 데이터 수집의 이중 구조: 온체인 vs 거래소
크립토 양적 트레이딩 팀과 DeFi 분석가들이 직면하는 근본적 과제는 시장 데이터가 두 개의 완전히 다른 인프라에 분산되어 있다는 점입니다. 온체인 데이터는 RPC 노드와 인덱서를 통해 블록체인에서 직접 수집되고, 거래소 데이터는 CEX의 REST 및 WebSocket API를 통해 수집됩니다. 이 두 영역은 프록시 요구사항 측면에서 완전히 다른 설계 원칙을 따릅니다.
crypto market data scraping 파이프라인을 구축할 때 이 구분을 명확히 이해하지 못하면, 불필요한 프록시 비용을 낭비하거나 반대로 차단 위험에 노출될 수 있습니다. 이 가이드는 양쪽 영역의 기술적 특성을 분석하고, 각각에 맞는 프록시 아키텍처를 제시합니다.
수집 대상 데이터와 인프라 매핑
거래소(CEX) 데이터
중앙화 거래소에서 수집해야 하는 핵심 데이터 포인트는 다음과 같습니다:
- 가격 피드: Binance, Coinbase, OKX, Bybit의 실시간/Ticker 가격. 주로 WebSocket 스트림으로 제공되지만, REST 폴백이 필수입니다.
- 오더북 스냅샷: 깊이(Depth) 데이터. 레벨 10~5000까지 거래소마다 한도가 다릅니다. 고빈도 수집 시 IP 기반 속도 제한의 주요 원인이 됩니다.
- 펀딩 레이트: 영구 선물(Perpetual)의 펀딩 비율. 8시간 주기지만, 실시간 예상 펀딩 레이트도 수집 대상입니다.
- 청산 데이터: 강제 청산 이벤트 스트림. 변동성 급증 시 데이터 볼륨이 폭발적으로 증가합니다.
온체인 데이터
블록체인 네이티브 데이터는 RPC 노드 또는 인덱서를 통해 수집합니다:
- RPC 제공자: Alchemy, Infura, QuickNode 등의 JSON-RPC 엔드포인트. 블록, 트랜잭션, 영수증, 로그 필터링.
- 인덱서: The Graph, Envio, Subsquid 등의 인덱싱 서비스. DEX 스왑 이벤트, 유동성 변화 등.
- 직접 노드 운영: 자체 erigon/reth 노드. 프록시가 전혀 필요하지 않습니다.
| 데이터 유형 | 수집 경로 | 프록시 필요성 | 주요 속도 제한 |
|---|---|---|---|
| CEX 가격 피드 | WebSocket / REST | 높음 (IP 기반 제한) | 거래소별 1200~6000 req/min |
| CEX 오더북 | REST (Depth 엔드포인트) | 높음 (무거운 요청) | 100~600 req/min |
| CEX 펀딩 레이트 | REST | 중간 (저빈도) | 1200~6000 req/min |
| 온체인 RPC | JSON-RPC (HTTPS/WSS) | 낮음 (API 키 기반) | 제공자별 CU(Credit Unit) |
| 온체인 인덱서 | GraphQL / REST | 거의 없음 | API 키 기반 |
왜 CEX 스크래핑에 레지덴셜 프록시가 필수적인가
거래소 API는 공식적으로 API 키 기반 속도 제한을 적용하지만, 실제로는 IP 수준에서도 공격적으로 차단합니다. 이중 레이어 속도 제한 구조를 이해하는 것이 exchange API proxies 전략의 출발점입니다.
IP 기반 속도 제한의 현실
대부분의 CEX는 API 키 한도와 별도로 IP당 요청 한도를 적용합니다. Binance의 경우 공식 문서에는 6,000 req/min(가중치 기반)을 명시하지만, 단일 IP에서 이 한도에 반복적으로 근접하면 429 응답이 반환됩니다. 더 위험한 것은 429가 반복되면 451(법적 이유로 접근 거부)이나 IP 밴으로 에스컬레이션된다는 점입니다.
다중 API 키를 사용하더라도 동일 IP에서 나가면 IP 레벨 제한에 걸립니다. 이것이 바로 레지덴셜 프록시가 필요한 핵심 이유입니다.
지역 차단: Binance proxy 사용의 실제 이유
가장 시급한 문제는 지역 제한입니다. 주요 거래소의 지역 정책은 다음과 같습니다:
- Binance: 미국 IP 차단. binance.com에 미국 IP로 접근 시 리다이렉트 또는 451 응답. 미국 사용자는 binance.us로 강제.
- OKX: 미국, 캐나다, 홍콩 등 제한 관할구역 IP 차단.
- Bybit: 미국 IP 차단. 일부 서비스는 추가 관할구역 제한.
- Coinbase: 미국 기반이라 역으로 미국 외 지역에서 국가별 규제에 따라 제한.
이러한 지역 차단은 공식 API 엔드포인트에도 적용됩니다. 미국 기반 데이터 파이프라인이 Binance 가격 데이터를 수집하려면, 미국 외 IP를 통하는 것이 기술적으로 유일한 경로입니다. 하지만 이는 규제 섹션에서 다룰 중요한 법적 함의를 가집니다.
핵심 인사이트: 429(속도 제한)에서 451(법적 차단)로의 에스컬레이션은 되돌리기 어렵습니다. IP가 한 번 451을 받으면 해당 IP 풀이 블랙리스트에 오를 수 있습니다. 선제적 프록시 로테이션이 필수입니다.
온체인 데이터: 프록시가 보통 필요 없는 이유
온체인 데이터 수집은 CEX와 근본적으로 다른 아키텍처를 가집니다. RPC 제공자(Alchemy, Infura, QuickNode)는 API 키 기반 인증과 사용량 기반 과금을 사용하므로, IP 기반 속도 제한이 CEX만큼 공격적이지 않습니다.
자체 노드를 운영하는 경우 프록시는 전혀 필요하지 않습니다. 노드에 직접 연결하면 되기 때문입니다. RPC 제공자를 사용하더라도, 속도 제한은 Credit Unit(CU) 소진 형태이며 IP 차단은 드뭅니다.
온체인에서 프록시가 도움이 되는 예외적 상황
- CU 한도 확장: 여러 RPC 제공자 계정을 라운드로빈할 때, 각 계정의 IP 지문(Fingerprint)을 분리하면 의심스러운 활동 감지를 피할 수 있습니다.
- 지역별 노드 라우팅: QuickNode의 경우 특정 지역 엔드포인트가 더 낮은 지연을 제공할 수 있습니다. 프록시를 통해 해당 지역 IP로 라우팅하면 처리량이 향상될 수 있습니다.
- 공용 RPC 엔드포인트: 무료 공용 RPC(예: community RPC lists)는 IP 기반 속도 제한을 적용하므로 프록시 로테이션이 유용합니다.
하지만 이는 예외적 상황이며, 온체인 데이터 수집의 기본 전략은 "프록시 없이 RPC 제공자 사용"입니다.
아키텍처: WebSocket 우선, REST 폴백과 프록시 로테이션
WebSocket 우선 설계
실시간 데이터가 필요한 경우, 거래소가 공개 WebSocket 스트림을 제공하면 반드시 WebSocket을 우선 사용해야 합니다. WebSocket은 연결당 데이터 처리량이 REST보다 수십 배 높고, 속도 제한도 연결 수 기준으로 적용됩니다.
Binance의 경우 wss://stream.binance.com:9443/ws를 통해 오더북, 트레이드, 펀딩 레이트 스트림을 구독할 수 있습니다. WebSocket 연결 자체는 IP당 연결 수 제한(일반적으로 5~10개)이 있지만, 단일 연결로 수백 개의 스트림을 구독할 수 있습니다.
하지만 WebSocket 연결이 끊기면 재연결 시 초기 스냅샷을 REST로 가져와야 합니다. 이때 프록시를 통한 REST 호출이 필요합니다.
REST 폴백과 프록시 로테이션
REST API는 다음 상황에서 필수적입니다:
- WebSocket 재연결 후 초기 오더북 스냅샷 복원
- 과거 데이터 백필(Backfill)
- 펀딩 레이트, 청산 데이터 등 저빈도 엔드포인트
- WebSocket에서 제공하지 않는 통계 데이터
REST 호출 시 프록시 로테이션 전략은 요청 빈도에 따라 다릅니다:
- 저빈도(<10 req/min): 고정 세션 프록시. 동일 IP에서 안정적 연결.
- 중빈도(10~200 req/min): 스티키 세션(5~10분). 세션 내 동일 IP 유지.
- 고빈도(>200 req/min): 요청별 IP 로테이션. 레지덴셜 풀에서 매 요청마다 새 IP.
다음은 Python에서 Binance 오더북 스냅샷을 프록시 로테이션과 함께 수집하는 예입니다:
import requests
import time
from itertools import cycle
# ProxyHat 레지덴셜 프록시 풀 구성
# 각 요청마다 다른 IP로 로테이션
proxy_pool = [
"http://user-country-SG:PASSWORD@gate.proxyhat.com:8080",
"http://user-country-JP:PASSWORD@gate.proxyhat.com:8080",
"http://user-country-HK:PASSWORD@gate.proxyhat.com:8080",
]
proxy_cycle = cycle(proxy_pool)
def fetch_orderbook(symbol: str, limit: int = 100):
"""Binance 오더북 스냅샷을 프록시 로테이션으로 수집"""
url = "https://api.binance.com/api/v3/depth"
params = {"symbol": symbol, "limit": limit}
proxy = next(proxy_cycle)
try:
resp = requests.get(
url,
params=params,
proxies={"http": proxy, "https": proxy},
timeout=10,
)
resp.raise_for_status()
# 타임스탬프 보존 — 데이터 무결성의 핵심
return {
"data": resp.json(),
"fetch_ts": time.time(),
"proxy_ip": proxy.split("@")[1].split(":")[0],
}
except requests.exceptions.HTTPError as e:
if resp.status_code == 429:
print(f"Rate limited on {proxy}. Rotating...")
time.sleep(1)
return fetch_orderbook(symbol, limit) # 새 IP로 재시도
if resp.status_code == 451:
print(f"Geo-blocked on {proxy}. Switching region...")
return None
raise
# 다중 심볼 오더북 수집
for sym in ["BTCUSDT", "ETHUSDT", "SOLUSDT"]:
snapshot = fetch_orderbook(sym)
if snapshot:
print(f"{sym}: bid={snapshot['data']['bids'][0]}, "
f"ts={snapshot['fetch_ts']}")
WebSocket 연결 관리
WebSocket 스트림은 연결 유지가 중요하므로, 프록시를 통한 WebSocket 연결은 스티키 세션이 필수입니다. IP가 중간에 변경되면 연결이 끊어집니다.
import asyncio
import websockets
import json
import time
# ProxyHat 스티키 세션 프록시 — 10분간 동일 IP 유지
PROXY = "ws://user-country-SG-session-ordbook1:PASSWORD@gate.proxyhat.com:1080"
async def stream_binance_trades(symbol: str = "btcusdt"):
"""Binance WebSocket 무역 스트림 구독"""
uri = f"wss://stream.binance.com:9443/ws/{symbol}@trade"
async with websockets.connect(
uri,
proxy=PROXY,
ping_interval=20,
ping_timeout=10,
) as ws:
print(f"Connected to {symbol}@trade via SG proxy")
async for raw_msg in ws:
msg = json.loads(raw_msg)
# 수신 타임스탬프와 거래소 타임스탬프 비교 — 지연 모니터링
recv_ts = time.time()
exchange_ts = msg["T"] / 1000 # 밀리초 → 초
latency_ms = (recv_ts - exchange_ts) * 1000
if latency_ms > 500: # 500ms 임계값 초과 시 경고
print(f"HIGH LATENCY: {latency_ms:.0f}ms")
yield {
"price": msg["p"],
"qty": msg["q"],
"exchange_ts": exchange_ts,
"recv_ts": recv_ts,
"latency_ms": latency_ms,
}
asyncio.run(stream_binance_trades())
지연 최적화: 거래소별 지역 프록시 전략
크립토 시장 데이터에서 지연(Latency)은 수익과 직결됩니다. 펀딩 레이트 차익거래나 통계적 차익거래에서 50ms의 차이가 중요할 수 있습니다. 프록시 선택 시 거래소 서버 위치와 프록시 서버 위치 간의 물리적 거리가 핵심 변수입니다.
거래소별 인프라 위치와 최적 프록시 지역
| 거래소 | 주요 인프라 위치 | 최적 프록시 지역 | 예상 지연(프록시 경유) |
|---|---|---|---|
| Binance | 도쿄, 싱가포르 | SG, JP, HK | 10~40ms |
| OKX | 홍콩, 싱가포르 | HK, SG, JP | 10~30ms |
| Bybit | 싱가포르 | SG, JP, HK | 10~35ms |
| Coinbase | 미국 (AWS us-east-1) | US, CA | 5~25ms |
ProxyHat의 지역 타겟팅 기능을 사용하면, 거래소별로 최적 지역의 IP를 지정할 수 있습니다:
# Node.js — 거래소별 지역 최적화 프록시 구성
const axios = require("axios");
const HttpsProxyAgent = require("https-proxy-agent");
// 거래소별 최적 지역 프록시 매핑
const EXCHANGE_PROXIES = {
binance: new HttpsProxyAgent(
"http://user-country-SG:PASSWORD@gate.proxyhat.com:8080"
),
okx: new HttpsProxyAgent(
"http://user-country-HK:PASSWORD@gate.proxyhat.com:8080"
),
coinbase: new HttpsProxyAgent(
"http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
),
bybit: new HttpsProxyAgent(
"http://user-country-SG:PASSWORD@gate.proxyhat.com:8080"
),
};
async function fetchFundingRate(exchange, symbol) {
const urls = {
binance: `https://fapi.binance.com/fapi/v1/fundingRate?symbol=${symbol}`,
okx: `https://www.okx.com/api/v5/public/funding-rate?instId=${symbol}`,
bybit: `https://api.bybit.com/v5/market/funding/history?category=linear&symbol=${symbol}`,
};
const agent = EXCHANGE_PROXIES[exchange];
const resp = await axios.get(urls[exchange], {
httpsAgent: agent,
timeout: 10000,
});
return {
exchange,
data: resp.data,
fetch_ts: Date.now() / 1000,
};
}
// 다중 거래소 펀딩 레이트 비교
Promise.all([
fetchFundingRate("binance", "BTCUSDT"),
fetchFundingRate("okx", "BTC-USDT-SWAP"),
fetchFundingRate("bybit", "BTCUSDT"),
]).then((results) => {
results.forEach((r) => console.log(`${r.exchange}:`, r.data))
});
지연 측정과 모니터링
프록시 경유 시 지연을 지속적으로 모니터링해야 합니다. 모든 데이터 포인트에 수신 타임스탬프와 거래소 타임스탬프를 함께 저장하면, 사후 분석에서 프록시 지연 패턴을 파악할 수 있습니다.
- P50 지연: 정상 운영 기준선
- P99 지연: 꼬리 지연. 초과 시 프록시 공급자 또는 지역 전환 필요
- 지연 스파이크: 프록시 노드 포화 신호. 대체 경로로 자동 장애조치(Failover) 구현
curl을 사용한 간단한 지연 테스트도 가능합니다:
# Binance API 지연 테스트 — 싱가포르 프록시 경유
curl -o /dev/null -s -w "\nTime: %{time_total}s\nHTTP: %{http_code}\n" \
-x http://user-country-SG:PASSWORD@gate.proxyhat.com:8080 \
"https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT"
# 직접 연결과 비교
curl -o /dev/null -s -w "\nTime: %{time_total}s\nHTTP: %{http_code}\n" \
"https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT"
데이터 무결성: 타임스탬프와 순서 보장
금융 데이터 파이프라인에서 타임스탬프 무결성은 비협상적 요구사항입니다. SEC와 MiFID II 규제 하에서 거래 데이터의 시간 기록은 밀리초 단위 정확성이 요구됩니다.
프록시 경유 시 타임스탬프 전략
- exchange_timestamp: 거래소가 생성한 원본 타임스탬프. 데이터의 진실 원천(Source of Truth).
- recv_timestamp: 수집 시스템이 메시지를 수신한 시각. 프록시 지연 측정에 사용.
- store_timestamp: 데이터베이스에 기록된 시각. 파이프라인 내부 지연 측정에 사용.
세 가지 타임스탬프를 모두 저장하면, 규제 감사 시 데이터 경로의 전체 지연을 재구성할 수 있습니다. 프록시 교체나 지역 변경 후 recv_timestamp - exchange_timestamp의 변화를 모니터링하면, 프록시 성능 저하를 즉시 감지할 수 있습니다.
순서 보장
다중 프록시 IP에서 수집한 데이터는 도착 순서가 보장되지 않습니다. 거래소 타임스탬프를 기준으로 재정렬하는 로직이 파이프라인에 포함되어야 합니다. 특히 오더북 업데이트는 순서가 중요하므로, 각 업데이트에 포함된 시퀀스 번호(또는 lastUpdateId)를 기반으로 순서를 검증해야 합니다.
규제 고려사항: 지역 제한과 법적 함의
프록시를 사용해 거래소의 지역 제한을 우회하는 것은 기술적으로 간단하지만, 법적으로는 민감한 영역입니다. 다음 사항을 반드시 고려해야 합니다.
거래소 서비스 약관(ToS)
대부분의 거래소 ToS는 제한 관할구역에서의 서비스 접근을 명시적으로 금지합니다. 프록시를 사용해 지역 제한을 우회하는 것은 ToS 위반입니다. 실제 결과는 다음과 같습니다:
- 계정 정지: 거래소가 의심스러운 활동을 감지하면 API 키를 취소하고 계정을 정지할 수 있습니다.
- 자산 동결: 거래소에 보유한 자산이 동결될 수 있습니다. 데이터 수집 목적의 읽기 전용 API 키를 사용하더라도, 해당 키와 연결된 계정의 자산이 위험에 노출됩니다.
권장 사항: 데이터 수집 전용 계정을 분리하고, 해당 계정에 자산을 보유하지 마세요. 읽기 전용 API 키만 사용하세요.
현지 법률 준수
ToS 위반과 법적 위반은 다릅니다. 하지만 일부 관할구역에서는 제한된 금융 서비스에 접근하는 것 자체가 법적 문제가 될 수 있습니다:
- 미국: 미국 IP로 Binance.com에 접근하는 것은 ToS 위반이지만, 미국 법률 위반은 아닙니다. 반면 미국 거주자가 Binance.com에서 거래하는 것은 CFTC/SEC 규제 위반일 수 있습니다.
- EU (MiFID II): EU 거주자가 비인가 거래소를 이용하는 것은 MiFID II 하의 보고 의무에 영향을 줄 수 있습니다. 데이터 수집만 하는 경우는 거래와 다르지만, 규제 감사 시 설명이 필요할 수 있습니다.
- 시장 데이터 라이선스: 거래소의 시장 데이터를 상업적 목적으로 재배포하는 경우, 거래소의 데이터 라이선스 계약이 필요할 수 있습니다. Binance, CME 등은 데이터 재배포에 별도 라이선스를 요구합니다.
중요: 이 가이드는 법적 조언이 아닙니다. 지역 제한이 있는 거래소에 프록시로 접근하기 전에 관할구역의 법률 자문을 받으세요. 특히 상업적 데이터 서비스를 운영하는 경우, 시장 데이터 라이선스와 규제 보고 의무를 반드시 확인해야 합니다.
프로덕션 아키텍처 권장사항
위의 모든 고려사항을 종합한 프로덕션 수준 아키텍처의 핵심 원칙은 다음과 같습니다:
- WebSocket 우선, REST 최소화: 가능한 모든 실시간 데이터를 WebSocket으로 수집하고, REST는 초기화와 백필에만 사용합니다.
- 거래소별 지역 최적화: 각 거래소의 인프라 위치에 맞춰 ProxyHat의 지역 타겟팅을 설정합니다.
- 지능형 로테이션: 저빈도 엔드포인트는 스티키 세션, 고빈도는 요청별 로테이션. 429 응답 시 즉시 IP 전환.
- 이중 타임스탬프: 거래소 타임스탬프와 수신 타임스탬프를 항상 함께 저장합니다.
- 지연 모니터링: P50/P99 지연을 실시간으로 추적하고, 임계값 초과 시 자동 장애조치합니다.
- 계정 분리: 데이터 수집용 계정은 거래용 계정과 완전히 분리하고, 자산을 보유하지 않습니다.
- 규제 준수: 상업적 데이터 서비스의 경우 시장 데이터 라이선스를 확인하고, 지역 제한 우회의 법적 함의를 검토합니다.
핵심 요약
- 온체인 데이터(RPC)는 프록시가 보통 필요 없고, CEX 데이터는 IP 기반 제한과 지역 차단으로 인해 레지덴셜 프록시가 필수적입니다.
- 429에서 451로의 에스컬레이션을 방지하려면, 속도 제한에 도달하기 전에 선제적으로 IP를 로테이션해야 합니다.
- 거래소별 인프라 위치에 맞춰 프록시 지역을 선택하면 지연을 최소화할 수 있습니다: Binance/OKX/Bybit → 동남아, Coinbase → 미국.
- WebSocket을 우선 사용하고 REST는 폴백으로 제한합니다. REST 호출 시 요청 빈도에 따라 로테이션 전략을 조정합니다.
- 모든 데이터 포인트에 거래소 타임스탬프와 수신 타임스탬프를 함께 저장하여 데이터 무결성과 규제 준수를 보장합니다.
- 프록시로 지역 제한을 우회하기 전에 거래소 ToS와 현지 법률을 반드시 검토합니다. 상업적 데이터 서비스는 시장 데이터 라이선스가 필요할 수 있습니다.
ProxyHat의 레지덴셜 프록시 네트워크는 190개 이상의 국가를 지원하여, 거래소별 최적 지역 선택이 가능합니다. 요금제를 확인하거나, 지원 지역 목록에서 사용 가능한 국가를 확인하세요. SERP 및 가격 모니터링 관련 추가 정보는 웹 스크래핑 사용 사례 페이지에서 확인할 수 있습니다.






