2025. 2. 4. 13:00ㆍ문제해결
한창 진행하고 있던 프로젝트에서 엄청난 실수를 발견해버렸다.
장고 시크릿 키를 그대로 깃허브에 올려버린 것이다(실화냐)
레포지토리를 날릴 순 없기 때문에 GPT를 열심히 괴롭히고 시행착오를 한 끝에
해결했다.
오늘은 그 해결방법을 정리한 글이다. (feat.GPT)
해결 방법 간단정리
- 모든 커밋 기록에서 시크릿 키를 찾아낸 다음 "REMOVED_SECRET_KEY"로 대체한다.
- 새 키를 발급받고 깃헙에 올라가지 않도록 .env에 넣은 후 깃헙에 올린다.
이걸 실행하기 위해 다음과 같은 순서를 따르면 된다.
기존 키 없애기
1. replace.txt 를 만든다.
2. replace.txt에 다음과 같이 작성한다.
3. git-filter-repo 설치하기
4. 깃의 커밋 기록에서 기존 키를 찾아 replace.txt로 대체하는 명령어를 실행한다.
5. replace.txt 를 .gitignore에 추가해주기
6. origin 추가하기
7. 지금까지 했던 걸 push하기
8. 필요없는 데이터 정리하기
9. replace.txt 삭제하기
새로운 키 발급 받기
1. 키 발급 받기
2. django-environ 설치
3. .env 만들기
4. settings.py 수정하기
5. 서버 실행해보기
기존 키 없애기
1. replace.txt 를 만든다.
이 파일의 위치는 .git이 있는 곳이어야한다.
터미널에 ls -a를 쳐서 .git이 있는 곳에서 만들어주면 된다.
이렇게 .git이 있는 곳에 replace.txt를 만들어주었다.
2. replace.txt에 다음과 같이 작성한다.
기존시크릿키를 여기에 작성==>REMOVED_SECRET_KEY
시크릿키는 django-insecure- 까지는 동일하고, 그 뒤로는 랜덤한 문자&숫자로 이루어져있다.
그래서 replace.txt안에 기존 키를 넣고 ==>REMOVED_SECRET_KEY를 뒤에 작성해주면 된다.
이런식의 모습일 거다.
django-insecure-a6m1r^ro_*wvasdfdfge9387%j9n0c59(9dl^^r$-9xqbfzqgt!^l==>REMOVED_SECRET_KEY
3. git-filter-repo 설치하기
pip install git-filter-repo
4. 깃의 커밋 기록에서 기존 키를 찾아 replace.txt로 대체하는 명령어를 실행한다.
git filter-repo --replace-text replace.txt --force
명령어 설명
- "git filter-repo" => 말그대로 레포에 있는 거 필터 걸겠다는 뜻
- "--replace-text" => 글자 대체하겠다는 뜻
- "replace.txt" => 변경할 문자열을 replace.txt에 정의해놨음.
- "--force" => 기존 저장소에서 강제 실행하겠다는 옵션 (원본을 변경하는 작업이므로 신중하게 진행)
--force 명령어는 실행하기 무서울 수 있지만 어차피.... 시크릿키 변경 못 하면 기존 저장소는 폐기해야됨
이러나저러나.... 난 걍 했음 ㅎ
팀플젝이면 팀원들이랑 잘 상의해서 하길~
저 명령어를 치면 이런식으로 터미널에 뜰 것임.
git filter-repo --replace-text replace.txt --force
NOTICE: Removing 'origin' remote; see 'Why is my origin removed?'
in the manual if you want to push back there.
(was https://github.com/hsjoo126/stocks.git)
Parsed 12 commits
New history written in 0.07 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 90e9ce8 어쩌구저쩌구...
Enumerating objects: 155, done.
Counting objects: 100% (155/155), done.
Delta compression using up to 8 threads
Compressing objects: 100% (64/64), done.
Writing objects: 100% (155/155), done.
Total 155 (delta 73), reused 155 (delta 73), pack-reused 0
Completely finished after 0.19 seconds.
일단 그런가 보다 하고 넘어가고 다음 단계 ㄱ
5. replace.txt 를 .gitignore에 추가해주기
사진 처럼 넣으면 됨
6. origin 추가하기
위에 4번에서, 명령어를 실행할 경우 터미널에 어떤 게 뜨는지 넣어놨었는데
git filter-repo --replace-text replace.txt --force
NOTICE: Removing 'origin' remote; see 'Why is my origin removed?'
in the manual if you want to push back there.
(was https://github.com/hsjoo126/stocks.git)
Parsed 12 commits
New history written in 0.07 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 90e9ce8 어쩌구저쩌구...
Enumerating objects: 155, done.
Counting objects: 100% (155/155), done.
Delta compression using up to 8 threads
Compressing objects: 100% (64/64), done.
Writing objects: 100% (155/155), done.
Total 155 (delta 73), reused 155 (delta 73), pack-reused 0
Completely finished after 0.19 seconds.
그 중에서 볼 것은 이것임.
"NOTICE: Removing 'origin' remote; see 'Why is my origin removed?'"
git filter-repo는 실행 후 기본적으로 origin을 삭제함
그래서 origin을 다시 추가해주고 push 해줘야됨.
다음 명령어를 터미널에 입력하자
git remote add origin 깃허브 주소
추가해줬으면 다음단계 ㄱ
7. 지금까지 했던 걸 push하기
현재 상태는 로컬에 있는 커밋 기록에서만 기존 시크릿키가 변경 된 것임.
(로컬 커밋 기록에서 잘 변경됐는지 확인 하고 싶으면?? ⬇️⬇️⬇️⬇️⬇️)
사진처럼 깃 그래프 누르면 여태까지의 내 커밋 기록을 볼 수 있는데,
![](https://blog.kakaocdn.net/dn/btbRgv/btsL5s4e0lJ/H72Uon2zszBIfZZ9iKovi1/img.png)
![](https://blog.kakaocdn.net/dn/Na0yc/btsL6kLoAle/qrSKby7hLdV2aHU9lDkmek/img.png)
그중에서도 settings.py가 올라가있는 부분을 찾아보면?
기존 키가 우리가 원했던 대로 REMOVED_SECRET_KEY로 잘 대체된 것을 볼 수 있음.
![](https://blog.kakaocdn.net/dn/wo0Fg/btsL4QEBDt6/M0AMco1xXf28xA03KYNeO0/img.png)
원격저장소는 아직 변경되지 않았기 때문에 push 해줘야 함
git push origin --force --all
이 명령어는 강제로 push하는 명령어임.
--force 옵션은 앞서 설명했던 것처럼 강제로 실행하는 옵션이니
팀플젝이면 팀원들과 잘 상의해서 할 것!
이 명령어를 사용하면 원격저장소에도(깃허브) 잘 바뀐 것을 볼 수 있음.
한 번 더 강조하자면 replace.txt는 올라가면 안됨!!!
.gitignore에 넣었는지 잘 확인하고 push 때리면 됨.
8. 필요없는 데이터 정리하기
git gc --prune=now
- git gc(garbage collection, 쓰레기 수집) 명령어는 필요 없는 Git 객체를 정리하는 명령어임
- --prune=now 옵션을 사용하면, 더 이상 참조되지 않는(commit 그래프에서 삭제된) 커밋을 즉시 제거함.
git filter-repo를 실행하면, 기존 히스토리는 사라졌지만, Git 내부에는 "쓰레기 데이터" 가 남아 있을 수 있음
그래서 정리 필요. (git gc를 실행하지 않으면, 로컬 저장소의 .git 폴더 크기가 커진 채로 남을 수 있음)
이상 GPT 선생님의 정리..
그냥 혹시 모를 쓰레기 데이터 정리한다고 생각하면 됨!
9. replace.txt 삭제하기
이제 replace.txt는 쓸모가 없어졌으니 지워주도록하자.
.gitignore에 추가해놨던 것도 걍 지워주셈
이 파일 안에는 기존 키가 들어있으니 깔끔하게 지워주는 게 좋겠죠 ? ㅎㅎ
새로운 키 발급 받기
기존키를 말끔하게 지웠으니, 키를 새로 발급 받아 추가해보자.
1. 키 발급 받기
터미널에 다음과 같은 명령어를 치자
python -c 'import secrets; print(secrets.token_urlsafe(50))'
그럼 새로운 키가 나올 것이다.
이걸 어디에 잘 복사해두자.
2. django-environ 설치
pip install django-environ
3. .env 만들기
프로젝트 폴더에 .env를 만들고
그 안에 새로 발급 받은 키를 넣어주자.
DJANGO_SECRET_KEY=django-insecure-새로 발급 받은 키를 넣어주세요
사진 참고
아 그리고 .env도 .gitignore에 들어가 있어야됨!
4. settings.py 수정하기
settings.py에서 secret_key 부분을 찾은 다음
다음과 같이 넣어주자.
from pathlib import Path
import environ
# 환경변수 초기화
env = environ.Env()
environ.Env.read_env()
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('DJANGO_SECRET_KEY')
import, 환경변수 초기화, secret_key 부분을 추가했음.
5. 서버 실행해보기
시크릿 키가 잘 들어가는지 확인 하기 위해 서버를 켜보자.
오류없이 잘 켜지면 시크릿 키 잘 들어간 거임!
휴. 원래는 이걸 하려던 게 아니었는데
어쨌든 잘 해결했으니까 다음 글은 프로젝트로 다시 찾아오겠다!
오늘의 교훈
"프로젝트 시작할 땐, config.py or .env 와 .gitignore를 반드시 만들고 시작하자!!"