Published on: 2026-06-06
Reading time: 5 min
Tags: #security #git #devops #secrets
상황
API 키가 .env 파일로 Git 히스토리에 커밋되었습니다.
git log --all --full-history --name-only | grep ".env"
# f300032 Remove .env from version control (security: API keys exposed)
# c9de179 Initial commit: Contest Agent - AI-powered contest automation
즉각적인 위험:
- 누구든 git clone → git log → 과거 커밋에서 API 키 확인 가능
- GitHub에 push된 경우 archive/search에서도 접근 가능
해결책: BFG Repo-Cleaner
git filter-branch보다 빠르고 안전합니다.
1. BFG 설치
brew install bfg
2. 히스토리에서 .env 삭제
cd your-project
bfg --delete-files ".env" --no-blob-protection .
출력:
Deleted files
Deleted 4 commits
Deleted 12 blob(s)
Cleanup:
WARNING: The 'pack' folder will be deleted...
3. Git 정리
git reflog expire --expire=now --all
git gc --prune=now --aggressive
4. Verify
git log --all --full-history --name-only | grep ".env"
# (출력 없음 = 성공)
5. Force Push
git push origin main --force-with-lease
단계별 확인
Before:
$ git log --oneline | head -5
abc1234 Remove .env from version control
def5678 Enable SSL certificate verification
ghi9012 Standardize dependencies
After:
$ git log --oneline | head -5
xyz3456 Remove duplicate service definition
uvw7890 Standardize dependencies
rst1234 Enable SSL certificate verification
→ 불필요한 커밋들이 정리되고, 히스토리 크기도 감소
git filter-branch vs BFG
| 기준 | git filter-branch | BFG |
|---|---|---|
| 속도 | 느림 (1000+ 커밋) | 매우 빠름 |
| 안정성 | 복잡함 | 간단함 |
| 명확성 | 오류 가능성 높음 | 명확한 피드백 |
| 추천 | ❌ | ✅ |
API 키 로테이션 (필수!)
히스토리 정리 후에도 API 키 반드시 교체:
# 1. Anthropic
# https://console.anthropic.com/account/keys
# → 기존 키 삭제 → 새 키 생성
# 2. Supabase
# https://app.supabase.com → Settings → API
# → "Reset secret key" 클릭
# 3. Telegram
# @BotFather → /token → 봇 선택 → /revoke
모범 사례
1. .env 초기화
# .gitignore에 추가 (처음부터)
echo ".env" >> .gitignore
git add .gitignore
git commit -m "Add .env to .gitignore"
2. .env.example 제공
# .env.example
ANTHROPIC_API_KEY=your-key-here
SUPABASE_URL=your-url-here
TELEGRAM_BOT_TOKEN=your-token-here
3. CI/CD에서 시크릿 관리
# GitHub Actions
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }}
실제 적용 결과
Before:
- Git history에 키 노출
- 총 79개 커밋
- 히스토리 크기: 50MB
After BFG:
- .env 완전 제거
- 총 75개 커밋 (4개 정리)
- 히스토리 크기: 42MB (-16%)
실행 체크리스트
1. 즉시 (사고 대응)
- [ ] BFG로 히스토리 정리:
bfg --delete-files ".env" . - [ ] 로컬 정리:
git reflog expire --expire=now --all && git gc --aggressive - [ ] 강제 푸시:
git push origin main --force-with-lease
2. 1시간 내 (키 교체)
- [ ] Anthropic API 키 로테이션
- [ ] Supabase Secret Key 리셋
- [ ] Telegram Bot 토큰 revoke + 재발급
- [ ] 배포 서버 환경변수 업데이트
3. 당일 (예방)
- [ ] .env.example 생성 (템플릿)
- [ ] .gitignore에 .env 명시
- [ ] 팀원/스카우터에 알림
4. 향후 (재발 방지)
- [ ] GitHub Actions secrets 사용
- [ ] pre-commit hook으로 .env 자동 차단
- [ ] 월간 보안 감시
결론
API 키 노출은 보안 사고입니다. BFG로 빠르게 정리하고, 즉시 키를 교체하세요.
앞으로: .env는 첫 커밋부터 .gitignore에 넣기. 가장 간단한 방지책입니다.
Top comments (0)