서브모듈 도입해서 민감정보 관리하기

luckygamza·2022년 1월 16일

민감정보가 퍼블릭레포지토리에 올라가지 않도록 하자

우리의 dev용 서버는 db로 mysql을 연결하고 있는데,

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/{database이름}?serverTimezone=Asia/Seoul
    username: {민감정보}
    password: {민감정보}

우리의 dev용 서버 레포지토리는 public이라 민감한 db설정 정보가 담긴 파일을 그대로 올릴 수 없었다.
따라서 우리는

  • 1) 민감정보가 들어있는 dev용 yml을 서버에 따로 저장해두고,
  • 2) 이 dev용 yml을 외부에서 우리 서버가 실행될 때마다 주입한다.
    (java -jar -Dspring.profiles.active=$Profile_Name $JAR_NAME -> 서버 jar 파일이 실행될 때 해당프로파일 yml파일을 찾아서 쓰도록 하는 설정.)

라는 방식으로 민감정보를 깃헙에 올리지 않으면서 우리 프로젝트에 쓰고 있었다.

민감정보에 대한 형상관리를 하고 싶은데..

하지만 이렇게 깃헙에 민감정보가 들어있는 파일이 안 올라가도록 하면, 민감정보에 대한 형상관리가 안된다는 문제점이 있었다.
누가 실수로라도 이 민감정보가 들어있는 파일을 날리거나 내용을 변경하면, 복구할 수가 없다.
따라서 우리는 민감정보가 공개되지 않도록 하면서 형상관리할 수 있는 방법을 고민했다.

서브모듈로 민감정보를 보호함과 동시에 형상관리하기

git submodule 은 메인 레포지토리 안에 다른 레포지토리를 마치 서브모듈처럼 넣어놓을 수 있는 기능이다.

이 서브모듈 기능을 잘 써먹으면 민감정보를 private으로 보호하면서 git으로 형상관리되게 할 수 있다.

간략한 과정

  • 1) 민감정보 데이터를 private 레포지토리에 올린다.
  • 2) 민감정보가 담긴 private 레포지토리를 public레포지토리에 서브모듈로 등록한다.
  • 3) 원격 서브모듈 레포지토리에 있는 파일들을 로컬에 있는 서브모듈 폴더로 땡겨온다.
  • 4) 땡겨온 파일들을 잘 활용해 사용한다. (이 때, 땡겨온 파일들을 서브모듈 바깥에다 두고 사용하게 될 경우, 해당 파일들을 .gitignore목록에 추가한다. )

상세한 과정

private 레포지토리를 메인 레포지토리에 서브모듈로 등록하기

git add submodule ${서브 모듈로 등록할 github repository의 주소}
메인레포지토리 폴더에서 위 명령어를 치게 되면 메인 레포지토리에

  • 서브모듈로 등록한 레포지토리와 같은 이름의 폴더
  • gitmodules 파일(서브모듈 폴더,서브모듈의 레포지토리url 매핑 정보 담김)

가 추가된다.

서브모듈 remote 레포지토리의 파일들을 땡겨오기

git submodule update --remote

서브모듈폴더 안에 들어가서 위 명령어를 치면 원격 레포지토리의 master 브랜치를 fetch한 후 현재 로컬 브랜치에 merge한 것과 같다.

보너스) gradle task로 복사해와서 쓰기

우리의 경우, 서브모듈 폴더안에 우리 서버의 민감정보가 담긴 yml 파일을 두어 관리하고 있고,

task copyPrivate(type: Copy) {
    copy {
        from '${서브모듈폴더위치}'
        include "*.yml"
        into 'src/main/resources/privates'
    }
}

gradle task로 서브모듈폴더안에 있는 yml 파일을 복사해서 src/resource 폴더 안에 붙여넣기하도록 하였다.
이런 task를 만든 이유는 스프링이 서버가 build 될 때 알아서 resource 폴더 안에 있는 yml 파일을 찾아서 서버의 설정정보로 주입하기 때문이다.

  • 주의사항
    복사해온 yml 파일이 절대로 public 레포지토리에 노출이 되지 않도록 .gitignore에 추가해주어야 한다.

0개의 댓글