Published on: 2026-06-06
Reading time: 8 min
Tags: #security #python #audit #devops
개요
3개월에 걸쳐 개발한 6개 Python 프로젝트(3개 봇 + 3개 라이브러리)를 종합 감사했습니다. 25개 보안/코드 이슈를 발견했고, 23개를 즉시 수정했습니다.
- 감사 대상: FastAPI + Telegram Bot + LLM 통합 시스템
- 총 파일: 91개 Python 파일
- 발견 이슈: 25개 (심각 5개, 중간 18개, 경미 2개)
- 수정율: 92% (23/25)
심각도 높음 - 5개 이슈
1. API 키가 Git 히스토리에 노출됨 🔴
문제: Anthropic, Supabase, Telegram API 키가 .env 파일로 커밋됨
# ❌ 노출된 상태 (git log에서 확인 가능)
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxx
SUPABASE_KEY=sb_publishable_xxxxxxxxxx
위험도: 누구든 이전 커밋으로 API 키 접근 가능 → 리소스 도용, 데이터 침해
해결책:
# 1. BFG로 히스토리 정리
bfg --delete-files ".env" --no-blob-protection .
# 2. Git에서 제거
git rm --cached .env
echo ".env" >> .gitignore
# 3. API 키 로테이션 (필수)
# - Anthropic: console.anthropic.com/account/keys
# - Supabase: app.supabase.com → Settings → API
# - Telegram: @BotFather → /token
2. SSL 검증 비활성화 (MITM 공격 위험) 🔴
문제: requests 호출에 verify=False 사용 (10곳)
# ❌ 위험한 코드
response = requests.get(url, verify=False)
# ✅ 안전한 코드
response = requests.get(url, verify=True) # 기본값
영향: HTTPS 중간자 공격(MITM) 가능 → 민감한 데이터 도청
수정: contest-agent, supabase-async 전체 10곳 제거
3. 광범위한 예외 처리 🔴
문제: except Exception 으로 모든 오류를 무시 (114곳)
# ❌ 버그 추적 불가
try:
result = await db_select("contests")
except Exception:
print("failed") # 어떤 오류인지 알 수 없음
# ✅ 구체적인 처리
try:
result = await db_select("contests")
except requests.HTTPError as e:
logger.error(f"DB error: {e}", exc_info=True)
raise
영향: 버그 원인 파악 불가 → 프로덕션 문제 대응 시간 증가
4. 라이브러리 __init__.py 부실
문제: llm-router, supabase-async, telegram-agent의 __init__.py 비어있음
# ❌ 기존 (빈 파일)
# __init__.py
# (아무것도 없음)
# ✅ 수정 후
from llm_router import LLMRouter
__version__ = "0.1.0"
__all__ = ["LLMRouter"]
영향: PyPI 설치 후 import 실패
from llm_router import LLMRouter # ❌ ImportError
5. 문법 오류 (try-except 들여쓰기)
ai-insight-curator의 processor.py에서 DB 작업이 try 블록 밖에 있었음 → 예외 처리 안 됨
심각도 중간 - 18개 이슈
의존성 버전 불일치
- Anthropic: 0.25.0 / 0.34.0 혼재 → 0.34.0으로 통일
- Supabase: 2.0.0 / 2.4.0 혼재 → 2.4.0으로 통일
- Python: 3.9 / 3.11 혼재 → 3.11로 통일 (3.9 EOL: 2025-10)
입력 검증 부재
-
/contests?status=invalid&limit=999같은 잘못된 입력 허용 - 해결: status enum, limit 1-100 범위 검증 추가
README와 코드 불일치
- ai-insight-curator README에 FastAPI 언급 → 실제로는 순수 Telegram Bot
- 구현 상태 명시 누락
통계
변경 내역
| 항목 | 수치 |
|---|---|
| 신규 커밋 | 15개 |
| 수정 파일 | 22개 |
| 삭제된 코드 | 347줄 |
| 추가된 코드 | 200줄 |
테스트 결과
✅ 91개 파일 Python 문법 검증 통과
✅ 라이브러리 import 테스트 3/3 통과
✅ 프로젝트 구조 검증 3/3 통과
배운 점
-
초기부터 보안:
.env는 처음부터.gitignore에 넣기 - 버전 관리: 모든 패키지를 명시적으로 고정 (>=는 피하기)
-
구체적인 예외:
Exception대신HTTPError,ValueError등 구체적으로 - 정기 감사: 3-6개월마다 보안 감사 실행
다음 단계
- API 키 로테이션 (필수)
- 모니터링 설정 (로그 수집, 알림)
- 자동 테스트 (pytest 70% 커버리지)
- CI/CD 강화 (GitHub Actions lint + test)
실행 체크리스트
위험도별 즉시 조치:
- [ ] 긴급 (24시간): API 키 로테이션
- [ ] 높음 (1주): SSL 검증 활성화 확인
- [ ] 중간 (2주): 예외처리 감사 (특정 예외로 변경)
- [ ] 진행: 정기 감사 일정 (분기별)
결론
3개월 개발 = 23개 이슈 발견 + 수정
초기부터 보안을 제대로 했다면:
- 감사 시간: 0시간
- 수정 비용: $0
- 배포 지연: 0일
지금이라도 시작하면:
- 향후 감사는 훨씬 빠름
- 버그 감소 → 운영 비용 절감
- 채용 시 신뢰도 향상
가장 중요한 건 "지금 시작하기"입니다.
Top comments (0)