깃허브로 협업 프로젝트를 하던 도중 올려서는 안 될 시크릿 키를 실수로 코드 상에 노출을 했다.
이런 중요한 값의 경우 보통 application.properties 파일에 등록한 다음 .gitignore에 application.properties 파일을 등록해서 깃허브에 노출되지 않도록 한다.
항상 그렇게 해왔는데 실수로 시크릿 키가 깃허브에 노출이 되었다.
누군가 악의적으로 시크릿 키를 이용할 가능성이 있었기 때문에 빨리 깃허브에서 제거를 해야 했다.
그런데 약간의 까다로움이 있었는데 우선 커밋 로그는 다음과 같았다.
commit 1 -> commit 2 -> commit 3 (HEAD)
현재 깃허브에 올라가 있는 최신 커밋은 commit 3이고 시크릿 키가 노출된 커밋은 commit 1부터이다.
가장 최신 커밋인 commit 3에 있었다면 크게 어렵진 않았을텐데 commit 1에 있다보니 조금 까다로웠다.
그래도 다행히 commit 1부터 commit 3까지 코드의 변경이 많이 없어서 그냥 commit 1으로 초기화시킨 다음 다시 구현하기로 결정했다.
내가 선택한 방식은 다음과 같다.
- git reset --hard 명령어를 통해 commit 1으로 이동한다.
- 시크릿 키를 삭제한다.
- amend 옵션을 통해 현재 최신 커밋 (commit 1)을 덮어씌운다.
물론 commit 1도 삭제하는 것이 확실한 방법이지만 문제가 commit 1과 그 이전 커밋 사이 변경 사항이 너무 많다는 점이다.
commit 1과 commit 2, commit 3 사이에는 변경 사항이 거의 없어 commit 2, commit 3은 삭제해도 상관이 없었지만 commit 1과 그 이전 커밋은 변경 사항이 너무 많았다.
그래서 commit 2, commit 3을 삭제하고 commit 1 같은 경우 ammend 옵션을 통해서 시크릿 키가 드러나지 않는 코드로 덮어씌우려는 것이다.
해결 방법
우선 git reset --hard 명령어를 통해 commit 1으로 이동한다.
git reset --hard [커밋 아이디]
커밋 아이디는 git log 명령어를 통해 확인할 수 있다.
커밋 아이디는 앞 6글자만 입력해도 된다.
이제 로컬 커밋 로그는 다음과 같을 것이다.
<로컬 커밋 로그>
... -> commit 1 (HEAD)
그런데 아직도 깃허브에는 반영이 되지 않은 상태이다.
<깃허브 커밋 로그>
commit 1 -> commit 2 -> commit 3 (HEAD)
이럴 때는 강제로 깃허브에 푸쉬를 하면 된다.
그냥 push를 하면 충돌이 발생하기 때문에 -f 옵션을 추가하여 강제로 푸쉬를 한다.
git push -f origin [브랜치 이름]
위 명령어를 입력해주면 깃허브 커밋 로그도 로컬 커밋 로그와 같아진다.
<로컬 커밋 로그>
... -> commit 1 (HEAD)
<깃허브 커밋 로그>
... -> commit 1 (HEAD)
기존 시크릿 키가 담겨있던 commit 2와 commit 3가 삭제되었다.
그러나 아직도 commit 1에는 시크릿 키가 남아있다.
그래서 시크릿 키가 보이지 않도록 수정하고 amend 옵션을 준 상태로 커밋을 하면 가장 최신 커밋을 수정할 수 있다.
git commit --amend
명령어 입력하면 가장 윗 줄에는 현재 커밋 메시지가 나와있고 이를 변경할 수 있다.
또한 커밋 정보들이 나오는데 새로운 커밋 메시지를 수정했다면 vim 입력 모드 변환 -> :wq 를 통해 편집기를 빠져나오면 해당 커밋 수정이 반영된다.
그런데 역시나 아직 깃허브에는 반영이 되지 않았다.
똑같이 강제로 푸쉬를 해줘서 깃허브에도 반영을 해보자.
git push -f origin [브랜치 이름]
이렇게 실수로 올린 시크릿 키를 삭제하는 방법에 대해서 알아보았다.
시크릿 키와 같이 보안이 중요한 파일은 항상 applicatioin.properties에 저장하고 깃허브에 절대 노출하지 않도록 주의하자.
'공부 > Git & GitHub' 카테고리의 다른 글
[Git] git 비슷한 명령어 제대로 이해하기 (fetch/pull, checkout/switch, merge/rebase) (0) | 2024.08.19 |
---|---|
[Git&GitHub] 서로 다른 브랜치 병합하는 방법 (충돌 해결) (0) | 2023.03.16 |
[Git & GitHub] 깃 버전 관리 기초 사용법 (0) | 2023.03.14 |
댓글