이번 주 한 일들 정리
이번 주 한 일
1. quantagent-prac — 퀀트 에이전트 실습 레포
퀀트 에이전트 쪽 공부용으로 레포 새로 팠다. 여러 LLM/API 연동을 직접 붙여보는 게 목적이었다.
실습 내용
- Git LFS : 대용량 데이터 파일을 LFS로 관리하는 방식 연습.
.gitattributes로 특정 확장자 트래킹 지정 - Azure OpenAI (AOAI) : AOAI API 키 기반 연동 코드 작성, 모델 호출 흐름 파악
- Gemini key rotation : Gemini API 키 호출 한도에 걸릴 때 여러 키를 순환하며 재시도하는 로직 구현
- Slack API : 메시지 전송 연동. 웹훅 방식과 봇 토큰 방식 비교
- MCP-LLM (opencode) : opencode에 MCP 서버 연결하고 알리바바 클라우드도 붙여봄.
opencode.json,oh-my-opencode.json등 설정 파일 직접 작성 - data prac : 주가 데이터 등 금융 데이터 분석 연습 (
study.html)
느낀 점
퀀트 쪽은 완전 처음인데, 기획 단계에서부터 PER, 수익률, 리밸런싱 같은 기본 금융 개념을 모르니까 뭘 만들어야 할지조차 감이 안 잡혔다. AI 에이전트 붙이기 전에 금융 도메인 지식부터 좀 채워야 할 것 같다.
2. MASKIT — SAST+DAST 보안 취약점 자동화
문제 정의
솔루션 개발 중 API 엔드포인트에 JWT 인증이 누락된 취약점이 있다는 걸 발견했다. 수작업으로 일일이 확인하기엔 엔드포인트 수가 너무 많아서 자동화하기로 했다.
해결 방법
- 전체 엔드포인트 목록화 및 인증 여부 전수 조사 (AST 파싱 기반)
- 공격 시나리오 자동화 테스트 설계
- 비인증 접근, JWT 변조 (
alg:none), IDOR, 권한 상승 등
- 비인증 접근, JWT 변조 (
- CVSS v3.1 기준 Critical / High / Medium 3단계 위험도 분류
- 정량 지표(취약 엔드포인트 수, 인증 우회 성공률, 평균 CVSS) 자동 산출 리포트 구축
- GitHub Actions 워크플로우 (
security-sast.yml) 작성pip-audit: 의존성 CVE 스캔bandit: Python 코드 정적 분석- 커스텀 인증 커버리지 검증 스크립트 포함
- PR 생성 시 보안 결과 자동 코멘트
결과 (정량)
| 지표 | 패치 전 | 패치 후 |
|---|---|---|
| 인증 커버리지 | 55.0% | 96.2% (+41.2%p) |
| Critical 취약점 | 5건 | 0건 |
| DAST 인증 우회 성공률 | 38.8% (19/49) | — |
| 수정 완료 엔드포인트 | — | 33개 |
SAST 기준으로 전체 80개 엔드포인트 중 36개에서 인증 누락을 식별했다 (미적용률 45%).
삽질 포인트
처음엔 ast.FunctionDef만 파싱하도록 짰더니 async def로 선언된 엔드포인트가 전부 누락됐다. ast.AsyncFunctionDef도 같이 체크하도록 수정해서 해결했다.
# 수정 전
isinstance(node, ast.FunctionDef)
# 수정 후
isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))
3. 6puppy — 디코 봇 개발 + OCI 배포
6kitty.github.io 블로그 관리용 디스코드 봇을 만들고 OCI 서버에 올렸다.
봇 구조
Discord bot + FastAPI 웹훅 서버 를 하나의 프로세스에서 동시 실행하는 구조다. Discord 봇은 비동기로 돌고, 웹훅 서버는 별도 스레드에서 실행된다.
주요 기능:
- 매주 토요일 20시(Asia/Seoul)에 블로그 포스팅 리마인더 알림
- GitHub push 웹훅 수신 → Discord 채널로 알림
/add_account,/check_now,/list_accounts,/kitty_help슬래시 커맨드
OCI 배포 과정
1. VM 초기 세팅
ssh -v -i ssh-key-2026-03-26.key ubuntu@146.56.109.69
git clone https://github.com/6kitty/6puppy.git
cd 6kitty-bot
bash deploy/setup.sh
nano .env
setup.sh가 Python venv 구성, 의존성 설치, systemd 서비스 등록까지 한 번에 처리한다.
2. OCI Security List 포트 오픈
OCI는 OS 방화벽(iptables) 외에 콘솔에서 Security List도 별도로 열어야 한다.
Compute → Instance 상세 → Primary VNIC → Subnet → Security List
→ Add Ingress Rules
- Source CIDR: 0.0.0.0/0
- Protocol: TCP
- Destination Port: 8080
이걸 몰라서 iptables는 다 열어놨는데 웹훅이 계속 안 들어와서 한참 헤맸다. OCI 이중 방화벽 구조를 처음 알게 됐다.
3. GitHub Webhook 설정
Settings → Webhooks → Add webhook
- Payload URL: http://{OCI_IP}:8080/webhook/github
- Content type: application/json
- Secret: .env의 GITHUB_WEBHOOK_SECRET 값
- Events: Just the push event
4. GitHub Actions 자동 배포 (CI/CD)
main 브랜치에 push하면 OCI VM에 자동 배포되도록 구성했다. GitHub Secrets에 아래 세 가지를 등록하면 된다.
| Secret | 값 |
|---|---|
OCI_HOST |
VM 공개 IP |
OCI_USER |
ubuntu |
OCI_SSH_KEY |
SSH private key 전체 내용 |
봇 운영 명령어
sudo systemctl status 6kitty-bot # 상태 확인
sudo journalctl -u 6kitty-bot -f # 실시간 로그
sudo systemctl restart 6kitty-bot # 재시작
트러블슈팅 기록
- 웹훅이 안 들어올 때 : OCI Security List 8080 포트 먼저 확인 → iptables 확인 → GitHub Webhook Recent Deliveries에서 빨간 X 클릭해서 오류 메시지 확인
- 슬래시 커맨드가 안 보일 때 : Discord 글로벌 커맨드 동기화 최대 1시간 소요, 봇 권한에
applications.commands스코프 포함 여부 확인 - Claude 요약 기능 안 될 때 :
.env의ANTHROPIC_API_KEY및 크레딧 잔액 확인
그 외
-
안랩 장학금 신청 : 딱히 장학금 신청해본 적 없는데 학과 공지에 있고, 보려는 과목 다 A이기도 해서 넣어봤다. 1명만 뽑는 거라 경쟁이 빡세긴 하겠지만 붙었으면 좋겠다.
-
금융 도메인 공부 필요 : quantagent-prac 기획하면서 체감했다. 에이전트 기능 붙이기 전에 기초 지식부터 채워야 할 것 같다.
-
졸프 지도교수님이 공차 사주심 : 개인 포폴 준비하라고 하셨는데, 사실 필요하다고 생각하던 부분이라 말씀 자체가 도움이 많이 됐다.
-
자격증/어학 공부를 아예 못 했다 : 이런 것들 정리하고 개발하다 보면 정작 자격증이나 어학은 손도 못 댄다. 다음 주엔 진짜 기를 써서라도 해야 함.
-
취준 정병 : 점점 심해지는 중… 🥲