DEV Community

JustJinoIT
JustJinoIT

Posted on

API 키 Git 히스토리에서 완전 제거: BFG + force push 가이드

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
Enter fullscreen mode Exit fullscreen mode

즉각적인 위험:

  • 누구든 git clone → git log → 과거 커밋에서 API 키 확인 가능
  • GitHub에 push된 경우 archive/search에서도 접근 가능

해결책: BFG Repo-Cleaner

git filter-branch보다 빠르고 안전합니다.

1. BFG 설치

brew install bfg
Enter fullscreen mode Exit fullscreen mode

2. 히스토리에서 .env 삭제

cd your-project
bfg --delete-files ".env" --no-blob-protection .
Enter fullscreen mode Exit fullscreen mode

출력:

Deleted files

  Deleted 4 commits
  Deleted 12 blob(s)

Cleanup:

  WARNING: The 'pack' folder will be deleted...
Enter fullscreen mode Exit fullscreen mode

3. Git 정리

git reflog expire --expire=now --all
git gc --prune=now --aggressive
Enter fullscreen mode Exit fullscreen mode

4. Verify

git log --all --full-history --name-only | grep ".env"
# (출력 없음 = 성공)
Enter fullscreen mode Exit fullscreen mode

5. Force Push

git push origin main --force-with-lease
Enter fullscreen mode Exit fullscreen mode

단계별 확인

Before:

$ git log --oneline | head -5
abc1234 Remove .env from version control
def5678 Enable SSL certificate verification
ghi9012 Standardize dependencies
Enter fullscreen mode Exit fullscreen mode

After:

$ git log --oneline | head -5
xyz3456 Remove duplicate service definition
uvw7890 Standardize dependencies
rst1234 Enable SSL certificate verification
Enter fullscreen mode Exit fullscreen mode

→ 불필요한 커밋들이 정리되고, 히스토리 크기도 감소

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
Enter fullscreen mode Exit fullscreen mode

모범 사례

1. .env 초기화

# .gitignore에 추가 (처음부터)
echo ".env" >> .gitignore
git add .gitignore
git commit -m "Add .env to .gitignore"
Enter fullscreen mode Exit fullscreen mode

2. .env.example 제공

# .env.example
ANTHROPIC_API_KEY=your-key-here
SUPABASE_URL=your-url-here
TELEGRAM_BOT_TOKEN=your-token-here
Enter fullscreen mode Exit fullscreen mode

3. CI/CD에서 시크릿 관리

# GitHub Actions
env:
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
  SUPABASE_KEY: ${{ secrets.SUPABASE_KEY }}
Enter fullscreen mode Exit fullscreen mode

실제 적용 결과

Before:
  - Git history에 키 노출
  - 총 79개 커밋
  - 히스토리 크기: 50MB

After BFG:
  - .env 완전 제거
  - 총 75개 커밋 (4개 정리)
  - 히스토리 크기: 42MB (-16%)
Enter fullscreen mode Exit fullscreen mode

실행 체크리스트

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)