러닝하이에서 submodule을 사용한 이유를 설명드리려면 일전에 있었던 하나의 사건에 대해 설명드려야 합니다.
이전에 저희 팀은
application.yml의 remote에서 노출이 되지 않게 하려고 많은 방법을 찾아봤었습니다. 그 중 저희는spring cloud config를 사용하였습니다.
spring cloud config서버를 배포하고 프로젝트를 진행하던 중 AWS 배포로 인해application.yml파일 내부에 access key를 설정하고 업데이트하게 되었는데요,,,, 예상치 못한 부분에서 해킹이 발생하였습니다.
Git Actions을 이용해 테스트 자동화를 설정해두었는데요...spring cloud config서버에 있는application.yml을 가져와 git actions 환경에서 테스트가 진행되도록 설정을 해둔 게 문제가 되었습니다. action이 돌아갈 때 spring cloud config의배포 주소가 노출되어서 Auto Bot에서 해당 주소로 접근을 해access key를 탈취해간 것입니다.덕분에 3시간 만에
누군가에겐 연봉,누군가에겐 차 값,누군가에겐 1년 치 점심 값,누군가에겐 십일조의 요금이 청구되었습니다.... 다행히 자비로운AWS에서 1회에 한 해 요금을 제외시켜주었습니다.
이러한 사건으로 인해 광적으로 안전한 방법을 찾게 되었습니다. 우선, 가장 안전하게 private repository와 git secrets, git submodule를 활용하는 방법을 적용하게 되었습니다.
Main Repository에선 submodule에 대한 메타데이터만 존재할 뿐, 안에 내용을 조회가 되지 않으므로 약간은 안심하게 되었습니다. 하지만 실 배포 시에는 submodule을 제외시켜 로컬에서만 키 값들을 관리할 것 같습니다.
깃허브 메인 레포와 별개로 private repository를 생성해주고 application을 올려줍니다.
이제 해당 레포에서만 application.yml을 관리할 예정입니다.
(clone 시에만 연동해서 가져온다고 생각하면 됩니다.)
git submodule add 서브모듈로 등록할 github repo 주소
ex) git submodule add https://github.com/~~~
위 명령어 입력 시, 프로젝트의 최상위 경로에 submodule의 repository name을 가진 폴더가 생성됩니다.
위 과정을 거치면 프로젝트 최상위 폴더에 .gitmodules 파일이 생성됩니다.
.gitmodules 파일은 submodule repo의 경로와 url을 알려줍니다.
메인 프로젝트를 remote에 push 하면 main repository에 submodule(private repository)가 생성됩니다.
main repository더라도 위 submodule 폴더는 private repository 권한이 없는 유저는 접근 불가합니다.
git submodule update --remote
위 명령어를 통해서 submodule의 최신 내용을 메인 프로젝트에 갱신할 수 있습니다.
main project를 새로 clone 하였을 경우에도 위 명령어를 통해서 submodule을 받아올 수 있습니다.
submodules 폴더에 있는 yml 파일들을 빌드 시에 “프로젝트 명/src/main/resources” 경로로 가져오게 하는 작업이 필요합니다.
build.gradle에 아래 코드 추가합니다.
task copyPrivate(type: Copy) {
copy{
from 'submodule폴더'
include "application.yml"
into 'src/main/resources'
}
}
from: submodule 의 폴더
include: 포함할 파일
into: 빌드 시에 넣을 경로gradle이
copyPrivate task를 수행할 때 from 경로의 repo에 있는application.yml파일을 메인 프로젝트의src/main/resources에 복사하라는 의미
위 작업 후에bulid.gradle refresh필수!!
intellij 의 오른쪽 바에서Gradle → Tasks → other → copyPrivate를 실행
submodule path로 이동하여 add / commit / push를 통해 private repository remote에 최신 버전으로 업데이트 해주어야 합니다.
그 후, main module에서도 설정된 private repository 파일에 변동 사항을 적용해주던지, 새로 git submodule update --remote --merge를 통해 private repository의 최신 버전을 pull 받고 진행해야 합니다.
이렇게 메인 프로젝트에 git submodule 적용 방법을 알아보았습니다. 정말 보안 부분은 항상 조심하고 또 조심해야 하는 것 같아요ㅠㅠ 한번 털리면 몇 년 치 월급과 인사해야 할 수 있어요😢😢 여러분들은 이런 경험 없으시길 바라겠습니다!
감사합니다:)