.env가 깃허브에 올라가면 무슨 일이 벌어지나
깃허브는 공개 저장소 전체를 실시간으로 스캔하는 봇이 돌고 있다. AWS 키, OpenAI 키, Supabase 서비스 키 같은 패턴이 감지되면 평균 30초 이내에 탈취가 시작된다.
실제 사례: 2025년 한 바이브코더가 Cursor로 프로젝트를 만들고 git push했다. .gitignore에 .env가 없었다. 3시간 후 AWS 요금 알림 — GPU 인스턴스 12대가 암호화폐 채굴에 동원되고 있었다. 청구 금액 $4,800.
왜 바이브코딩에서 특히 자주 발생하나
AI 코딩 도구는 .env 파일을 잘 만들어준다. 하지만 .gitignore 업데이트를 깜빡하는 경우가 많다. 특히 이런 상황:
- 프로젝트 중간에 새 API 키를 추가할 때 — AI가 .env에 넣으라고 안내하지만 .gitignore 확인은 빠짐
.env.local,.env.production같은 변형 파일 — .gitignore에 .env만 등록되어 있으면 이 파일들은 그대로 올라감- AI가 생성한
docker-compose.yml에 환경변수가 하드코딩된 경우
즉시 대응 5단계
1단계: 노출된 키 전부 폐기 (0~5분)
가장 먼저 할 일은 깃허브에서 파일을 삭제하는 게 아니라, 노출된 키를 폐기하는 것이다.
- AWS: IAM 콘솔 → 해당 액세스 키 비활성화 → 새 키 발급
- OpenAI: API Keys 페이지 → 해당 키 삭제 → 새 키 생성
- Supabase: 프로젝트 설정 → API → service_role 키 재생성
- DB 비밀번호: 즉시 변경
키를 먼저 죽여야 한다. 깃허브에서 파일을 삭제해도 커밋 히스토리에 그대로 남아있기 때문이다.
2단계: .env 파일 히스토리에서 제거 (5~15분)
# git filter-branch로 .env 히스토리 완전 삭제
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch .env" \
--prune-empty --tag-name-filter cat -- --all
# 강제 푸시
git push origin --force --all
또는 BFG Repo-Cleaner를 사용하면 더 빠르다:
java -jar bfg.jar --delete-files .env
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push --force
3단계: .gitignore 완성 (5분)
바이브코딩 프로젝트에서 반드시 .gitignore에 들어가야 할 항목:
# 환경변수 — 모든 변형 포함
.env
.env.*
.env.local
.env.production
.env.development
# IDE/에디터
.cursor/
.vscode/
.idea/
# 의존성
node_modules/
__pycache__/
venv/
# 빌드
dist/
build/
.next/
4단계: 피해 범위 확인 (15~30분)
- AWS: CloudTrail에서 해당 키로 실행된 API 호출 확인
- Supabase: 대시보드 → Logs에서 비정상 쿼리 확인
- DB: 최근 접속 로그, 데이터 변경 이력 확인
- OpenAI: 사용량 대시보드에서 비정상 호출 확인
5단계: 재발 방지 (30분)
git-secrets를 설치하면 커밋 시점에 시크릿 패턴을 차단한다:
# 설치
brew install git-secrets # Mac
# Windows: https://github.com/awslabs/git-secrets 에서 다운로드
# 프로젝트에 적용
git secrets --install
git secrets --register-aws
# 커밋할 때 자동으로 AWS 키 패턴 차단
내 코드에 시크릿이 노출됐는지 확인하는 법
CodeScan의 시크릿 스캐너는 배포된 웹사이트의 JavaScript에서 25개 패턴(AWS, OpenAI, Supabase, Stripe, Firebase 등)의 API 키 노출을 자동 탐지한다.
깃허브뿐 아니라 프론트엔드 번들에 실수로 포함된 키까지 잡아낸다.