자동매매 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의 콘텐츠 팀입니다.