MagicTradeBot은 JWT (JSON Web Token)을 사용한 안전한 토큰 기반 인증을 구현하여 관리 API를 보호합니다. 이를 통해 인증된 봇 인스턴스와 사용자만 거래 서비스, 데이터, 거래소 관련 작업에 접근할 수 있습니다.
🚀 개요
관리 앱은 모든 API 요청에 대해 유효한 JWT 토큰 인증을 요구합니다. 토큰은 HMAC SHA-256(HS256) 알고리즘을 사용하여 보안 시크릿 키로 생성되며, 각 API 요청의 Authorization
헤더에 포함되어야 합니다.
⚙️ 구성 방법
1. JWT 시크릿 키 설정
appsettings.json
(또는 환경 변수)에 토큰 서명을 위한 JWT 시크릿 키를 설정하세요:
{
"JwtSettings": {
"SecretKey": "YOUR_SECURE_RANDOM_SECRET_KEY", // 최소 32자 이상 권장
"Issuer": "MagicTradeBot",
"Audience": "MagicTradeBotClients",
"TokenExpiryMinutes": 120
}
}
Docker나 클라우드 환경의 경우 다음과 같이 환경 변수를 사용할 수 있습니다:
JwtSettings__SecretKey=YOUR_SECURE_RANDOM_SECRET_KEY
2. 봇 시작 시 토큰 발급
MagicTradeBot 봇 인스턴스가 실행되면, 인증 정보(예: botId
및 authKey
)를 요청합니다. 이 정보는 관리 앱의 인증 엔드포인트로 안전하게 전송됩니다.
인증이 성공하면 관리 앱은 서명된 JWT 토큰을 발급합니다. 이 토큰은 봇 인스턴스에 저장되며 이후 모든 API 호출에 자동으로 Authorization
헤더로 첨부됩니다.
POST /api/auth/login
요청 본문:
{
"botId": "bot-eu-01",
"authKey": "your-secure-auth-key"
}
성공 응답:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
토큰 수신 후, 봇 인스턴스는 스캔, 거래, 상태 업데이트 등의 작업을 계속 진행하며, 모든 API 요청에 JWT를 포함합니다:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
이를 통해 봇과 관리 앱 간의 통신이 안전하고 인증된 상태로 유지됩니다.
🧩 접근 제어 및 역할 관리
- JWT 클레임에 역할 부여 (예:
role: "bot"
,"admin"
,"viewer"
) - 정책 또는 필터를 통해 API 엔드포인트 접근 제한 (예:
[Authorize(Roles = "admin")]
) - 봇 전용 엔드포인트의 경우,
botId
또는instanceId
클레임 확인 - 토큰이 만료되었거나, 조작되었거나, 유효하지 않은 경우 접근 거부
🧪 JWT를 사용한 API 호출 예시
GET /api/trade/symbols
헤더:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
✅ 보안 모범 사례
- HS256을 위한 길고 안전한 시크릿 키 사용 (256비트 이상 권장)
- 코드에 직접 저장하지 말고 환경 변수 또는 비밀 저장소 사용
- JWT 시크릿 키를 주기적으로 변경
- 짧은 토큰 유효 기간 설정 (예: 1~2시간), 필요 시 리프레시 토큰 사용
- HTTPS 사용으로 토큰 탈취 방지
- 토큰 검증 실패 시 로깅 및 경고 알림 설정
🔐 선택적 보안 강화
- 장기 세션을 위한 리프레시 토큰 메커니즘 구현
- 토큰 재사용 방지를 위한 HMAC 또는 HMAC+IP 바인딩 사용
- 로그아웃 또는 보안 사고 시 JWT 블랙리스트 또는 폐기 처리 기능 추가