Django를 활용해 서비스를 개발하던 중, SECRET_KEY를 커밋해버렸다.
SECRET_KEY의 commit history를 삭제하고, .env
를 활용해서 관리하는 방법을 기록하려고 한다.
1.암호화 및 서명(Signing)
Django에서는 다양한 데이터를 안전하게 다룰 때 암호화 또는 서명을 한다.
예를 들어, 세션 쿠키, CSRF 토큰, 비밀번호 리셋 링크, 사인된 URL 등
이때 데이터를 서명하고 검증하는데 SECRET_KEY가 사용된다.
즉, 이 값이 외부에 노출되면 서명을 위조할 수도 있다.
2.세션 데이터 보호
기본적으로 Django는 세션 정보를 암호화해서 클라이언트에 저장할 수 있어. 이때도 SECRET_KEY가 필요하다.
3.보안 해시 생성
비밀번호를 해시하거나 기타 민감한 정보를 다룰 때, 이 키가 내부적으로 해시 알고리즘의 솔트(salt)로 사용되기도 한다.
❗️ 주의할 점❗️
절대 유출되면 안 된다.
SECRET_KEY가 유출되면 누군가가 악의적인 세션 쿠키나 CSRF 토큰을 위조할 수 있다.
그래서 보통 .env 파일이나 환경 변수로 따로 관리하고, GitHub 같은 곳에 절대 올리면 안된다.
다행히도 배포 전에 노출되었다면 아직 공격에 노출된 상태는 아니니까,
SECRET_KEY를 변경만 하면 문제가 없다.
지금이라도 알아서 다행이다.
1.새로운 SECRET_KEY를 생성한다.
Django 콘솔이나 Python에서 쉽게 만들 수 있다.
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
2.새 키로 설정 변경
settings.py
에 하드코딩 되어 있다면, 다음처럼 .env
파일이나 환경 변수로 빼는 것을 추천한다.
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
.gitignore
에 .env
파일을 넣어야한다.
3.노출된 키는 더 이상 사용하지 말 것
Git에 푸시했다면 커밋에서 제거하고 기록도 지우는 걸 추천한다.
1. 저장소 백업
cp -r /Users/sujinkim/python/question_journal /Users/sujinkim/python/question_journal_backup
2. 필터 브랜치 실행
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch settings.py" \
--prune-empty --tag-name-filter cat -- --all
위 명령은 모든 커밋에서 settings.py
를 제거해서 SECRET_KEY를 기록에서 지우는 작업이다.
3. Git 기록 정리 (Garbage Collection)
git reflog expire --expire=now --all
git gc --prune=now --aggressive
4. 원격 저장소에 강제로 푸시
❗ 이 작업은 공용 저장소의 기록을 바꾸기 때문에, 협업 중이라면 팀원에게 먼저 공유하고 진행해야한다.
git push origin --force --all
git push origin --force --tags