트러블 슈팅)장고 시크릿 키 깃허브에 올렸을 때 (노출 됐을 때) 해결방법(feat.GPT)

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하기

현재 상태는 로컬에 있는 커밋 기록에서만 기존 시크릿키가 변경 된 것임.

(로컬 커밋 기록에서 잘 변경됐는지 확인 하고 싶으면?? ⬇️⬇️⬇️⬇️⬇️)

더보기

사진처럼 깃 그래프 누르면 여태까지의 내 커밋 기록을 볼 수 있는데,

 

 

그중에서도 settings.py가 올라가있는 부분을 찾아보면? 

기존 키가 우리가 원했던 대로 REMOVED_SECRET_KEY로 잘 대체된 것을 볼 수 있음.

원격저장소는 아직 변경되지 않았기 때문에 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를 반드시 만들고 시작하자!!"