[Django] SECRET_KEY가 노출되었다

sujin·4일 전
0

development

목록 보기
3/3
post-thumbnail

Django를 활용해 서비스를 개발하던 중, SECRET_KEY를 커밋해버렸다.
SECRET_KEY의 commit history를 삭제하고, .env를 활용해서 관리하는 방법을 기록하려고 한다.


🔐 SECRET_KEY의 주요 용도

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에 푸시했다면 커밋에서 제거하고 기록도 지우는 걸 추천한다.


🛠 Git 기록에서 SECRET_KEY 노출된 파일 제거하기

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
profile
감자 그리고 NLP

0개의 댓글

관련 채용 정보