자동매매 API 보안: 내 돈을 지키는 5가지 원칙
API 키가 유출되면 전재산을 잃을 수 있습니다. API 보안 관리부터 해킹 방지까지 완벽 가이드.
럿지 AI 팀
10분 읽기
목차
자동매매 API 보안: 내 돈을 지키는 5가지 원칙
"API 키만 있으면 내 자산을 전부 빼갈 수 있다"
무서운 사실입니다.
**2024년 API 유출 피해액: 약 500억원 (국내)**
이 글에서는 API를 안전하게 관리하는 방법을 알려드립니다.
API 보안이 중요한 이유
실제 피해 사례
**사례 1: GitHub 업로드**
``
개발자 A씨가 코드를 GitHub에 업로드
→ API 키 포함
→ 3시간 만에 전액 출금 (1,200만원)
`
**사례 2: 서버 해킹**
`
B씨의 AWS 서버 해킹
→ 환경 변수에서 API 키 탈취
→ 자동 거래 봇으로 손실 유발 (800만원)
`
**사례 3: 피싱**
`
C씨가 가짜 거래소 사이트에 API 키 입력
→ 즉시 전액 출금 (2,500만원)
`
API 권한의 위험성
**읽기 권한**:
- ✅ 잔고 조회
- ✅ 거래 내역 조회
- ⚠️ 개인 정보 노출
**쓰기 권한**:
- ❌ 주문 (매수/매도)
- ❌ 출금 (일부 거래소)
- ❌ 계정 설정 변경
**쓰기 권한 = 돈을 마음대로 쓸 수 있는 권한**
원칙 1: API 키 안전하게 보관
❌ 절대 하지 말아야 할 것
`python
1. 코드에 직접 작성 (최악)
api_key = "abc123def456"
api_secret = "xyz789ghi012"
2. 주석으로 남기기
API Key: abc123def456
Secret: xyz789ghi012
3. GitHub 업로드
git add api_keys.py
git commit -m "add keys"
git push
`
✅ 올바른 방법
**방법 1: 환경 변수**
`bash
.env 파일 생성
UPBIT_ACCESS_KEY=your_access_key
UPBIT_SECRET_KEY=your_secret_key
`
`python
Python에서 사용
import os
from dotenv import load_dotenv
load_dotenv()
ACCESS_KEY = os.getenv('UPBIT_ACCESS_KEY')
SECRET_KEY = os.getenv('UPBIT_SECRET_KEY')
`
**방법 2: 설정 파일 (암호화)**
`python
import json
from cryptography.fernet import Fernet
암호화 키 생성 (최초 1회)
key = Fernet.generate_key()
with open('secret.key', 'wb') as f:
f.write(key)
API 키 암호화
def encrypt_config(config_dict, key_file='secret.key'):
with open(key_file, 'rb') as f:
key = f.read()
fernet = Fernet(key)
config_str = json.dumps(config_dict)
encrypted = fernet.encrypt(config_str.encode())
with open('config.encrypted', 'wb') as f:
f.write(encrypted)
사용
config = {
'access_key': 'your_access_key',
'secret_key': 'your_secret_key'
}
encrypt_config(config)
복호화
def decrypt_config(key_file='secret.key', config_file='config.encrypted'):
with open(key_file, 'rb') as f:
key = f.read()
with open(config_file, 'rb') as f:
encrypted = f.read()
fernet = Fernet(key)
decrypted = fernet.decrypt(encrypted)
return json.loads(decrypted.decode())
사용
config = decrypt_config()
ACCESS_KEY = config['access_key']
`
.gitignore 설정
`
.gitignore 파일
환경 변수
.env
*.env
설정 파일
config.json
config.encrypted
secret.key
API 키 파일
api_keys.py
keys.txt
로그
*.log
`
원칙 2: API 권한 최소화
업비트 권한 설정
**필수 권한만** 체크:
- ✅ 자산 조회
- ✅ 주문 조회
- ✅ 주문하기
- ❌ ~~출금하기~~ (절대 금지)
`python
권한 확인 코드
import pyupbit
access = os.getenv('UPBIT_ACCESS_KEY')
secret = os.getenv('UPBIT_SECRET_KEY')
try:
upbit = pyupbit.Upbit(access, secret)
# 잔고 조회 (읽기 권한)
balance = upbit.get_balance("KRW")
print(f"✅ 읽기 권한 확인: {balance:,.0f}원")
# 주문 (쓰기 권한) - 소액 테스트
order = upbit.buy_market_order("KRW-BTC", 5000)
if order:
print("✅ 쓰기 권한 확인")
# 즉시 취소
upbit.cancel_order(order['uuid'])
else:
print("❌ 쓰기 권한 없음")
except Exception as e:
print(f"❌ API 오류: {e}")
`
IP 화이트리스트
**업비트 설정**:
1. 마이페이지 → Open API 관리
2. IP 주소 등록
3. 허용된 IP에서만 접근 가능
`bash
현재 서버 IP 확인
curl ifconfig.me
출력: 123.45.67.89
`
**장점**:
- 다른 곳에서 API 사용 불가
- 유출되어도 안전
원칙 3: 2FA (2단계 인증)
OTP 설정
**필수 설정**:
- 업비트: 로그인 OTP
- 바이낸스: 로그인 + 출금 OTP
- 구글 OTP 앱 사용
API 키 생성 시 OTP
`python
API 키 사용 시 OTP 확인 (선택 거래소)
import pyotp
def verify_otp(secret):
"""OTP 확인"""
totp = pyotp.TOTP(secret)
current_otp = totp.now()
user_input = input("OTP 입력: ")
if user_input == current_otp:
print("✅ OTP 확인")
return True
else:
print("❌ OTP 불일치")
return False
사용
if verify_otp(OTP_SECRET):
# API 사용
upbit = pyupbit.Upbit(ACCESS_KEY, SECRET_KEY)
`
원칙 4: 정기 키 교체
3개월마다 API 키 교체
`python
import schedule
from datetime import datetime, timedelta
class APIKeyManager:
def __init__(self):
self.key_created_date = datetime.now()
self.rotation_period = 90 # 90일
def needs_rotation(self):
"""키 교체 필요 여부"""
days_passed = (datetime.now() - self.key_created_date).days
if days_passed >= self.rotation_period:
print(f"⚠️ API 키 교체 필요! ({days_passed}일 경과)")
return True
days_left = self.rotation_period - days_passed
print(f"✅ 다음 교체까지 {days_left}일")
return False
def rotate_keys(self):
"""키 교체 프로세스"""
print("=== API 키 교체 시작 ===")
print("1. 거래소에서 새 API 키 발급")
print("2. .env 파일 업데이트")
print("3. 봇 재시작")
print("4. 구 API 키 삭제")
# 텔레그램 알림
send_telegram("⚠️ API 키 교체 시기입니다!")
매일 체크
manager = APIKeyManager()
schedule.every().day.at("09:00").do(manager.needs_rotation)
`
원칙 5: 모니터링 및 알림
이상 거래 감지
`python
class SecurityMonitor:
def __init__(self):
self.last_trade_time = None
self.trade_count = 0
self.max_trades_per_hour = 60
def check_abnormal_activity(self, current_time):
"""비정상 활동 감지"""
# 1시간 내 거래 횟수 체크
if self.last_trade_time:
time_diff = (current_time - self.last_trade_time).seconds
if time_diff < 3600: # 1시간
self.trade_count += 1
if self.trade_count > self.max_trades_per_hour:
print("⚠️ 비정상적으로 많은 거래 감지!")
send_telegram("🚨 비정상 거래 패턴 감지! 봇 중단됨")
return True
else:
self.trade_count = 0
self.last_trade_time = current_time
return False
사용
monitor = SecurityMonitor()
def safe_trade():
if monitor.check_abnormal_activity(datetime.now()):
print("⛔ 거래 중단")
return
# 정상 거래 진행
execute_trade()
`
로그인 알림
`python
def notify_login():
"""로그인 알림"""
message = f"""
🔐 API 접근 감지
시간: {datetime.now()}
서버: {socket.gethostname()}
IP: {get_public_ip()}
"""
send_telegram(message)
봇 시작 시 실행
notify_login()
`
보안 체크리스트
설정 시
- [ ] API 키를 코드에 직접 작성하지 않았나?
- [ ] .gitignore에 .env 추가했나?
- [ ] 출금 권한을 제거했나?
- [ ] IP 화이트리스트 설정했나?
- [ ] 2FA (OTP) 활성화했나?
운영 중
- [ ] 3개월마다 API 키 교체하나?
- [ ] 이상 거래 모니터링하나?
- [ ] 로그를 정기적으로 확인하나?
- [ ] 서버 보안 업데이트하나?
사고 발생 시
- [ ] 즉시 API 키 삭제
- [ ] 거래소 비밀번호 변경
- [ ] OTP 재설정
- [ ] 거래 내역 확인
- [ ] 피해 신고 (필요 시)
서버 보안
SSH 키 인증
`bash
비밀번호 로그인 비활성화
sudo nano /etc/ssh/sshd_config
다음 항목 변경
PasswordAuthentication no
PubkeyAuthentication yes
SSH 재시작
sudo systemctl restart sshd
`
방화벽 설정
`bash
UFW 방화벽 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 443/tcp
sudo ufw enable
상태 확인
sudo ufw status
`
자동 업데이트
`bash
Ubuntu 자동 보안 업데이트
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
`
실전 보안 시스템
`python
import os
from dotenv import load_dotenv
from datetime import datetime
import socket
class SecureTrader:
def __init__(self):
# 환경 변수 로드
load_dotenv()
# API 키 확인
self.access_key = os.getenv('UPBIT_ACCESS_KEY')
self.secret_key = os.getenv('UPBIT_SECRET_KEY')
if not self.access_key or not self.secret_key:
raise ValueError("❌ API 키가 설정되지 않았습니다!")
# 보안 모니터
self.monitor = SecurityMonitor()
# 로그인 알림
self.notify_startup()
def notify_startup(self):
"""시작 알림"""
message = f"""
✅ 자동매매 봇 시작
시간: {datetime.now()}
서버: {socket.gethostname()}
보안: OTP 활성화
"""
send_telegram(message)
def execute_trade_safely(self, action, symbol, amount):
"""안전한 거래 실행"""
# 비정상 활동 체크
if self.monitor.check_abnormal_activity(datetime.now()):
print("⛔ 보안 경고: 거래 중단")
return None
try:
# 거래 실행
if action == 'buy':
order = upbit.buy_market_order(symbol, amount)
else:
order = upbit.sell_market_order(symbol, amount)
# 알림
send_telegram(f"✅ {action} 완료: {symbol}")
return order
except Exception as e:
# 에러 알림
send_telegram(f"⚠️ 거래 실패: {e}")
return None
사용
trader = SecureTrader()
trader.execute_trade_safely('buy', 'KRW-BTC', 10000)
``추천 학습 자료
보안을 포함한 완전한 자동매매 시스템을 배우고 싶다면:
파이썬 비트코인 자동매매 봇 강의
**포함 내용**:
- ✅ API 보안 설정
- ✅ 환경 변수 관리
- ✅ 모니터링 시스템
- ✅ 에러 핸들링
**안전한 자동매매를 위한 필수 강의!**
---
결론: 보안은 선택이 아닌 필수
핵심 정리
1. **API 키 안전 보관** - 환경 변수, 암호화
2. **권한 최소화** - 출금 권한 제거
3. **2FA 필수** - OTP 활성화
4. **정기 키 교체** - 3개월마다
5. **모니터링** - 이상 거래 감지
마지막 조언
"나는 괜찮겠지" ❌
"언제든 해킹당할 수 있다" ✅
**API 보안은 자산을 지키는 첫걸음입니다!**
---
**면책 조언**: 보안 사고는 언제든 발생할 수 있습니다. 주기적인 보안 점검이 필요합니다.
L
럿지 AI 팀
AI 기술과 비즈니스 혁신을 선도하는 럿지 AI의 콘텐츠 팀입니다.
관련 포스트
튜토리얼
B2B SEO 완벽 가이드: 의사결정권자를 검색으로 확보하는 법
B2B 기업을 위한 SEO 전략. 영업 없이 리드를 자동으로 확보하는 검색 최적화 완벽 가이드입니다.
•1분 읽기
튜토리얼
백링크 완벽 가이드: 초보자도 이해하는 SEO의 핵심
백링크가 무엇인지, 왜 중요한지, 어떻게 만들어야 하는지 초보자도 쉽게 이해할 수 있도록 완벽 정리한 가이드입니다.
•4분 읽기
튜토리얼
콘텐츠 마케팅 + SEO 완벽 결합: 트래픽 10배 올리는 전략
콘텐츠 마케팅과 SEO를 결합한 통합 전략. 버크닐 백링크로 콘텐츠 효과를 극대화하는 방법을 정리했습니다.
•1분 읽기