본문 바로가기

SpringBoot

[연재] SpringBoot diary : 설정파일 분리 (IntelliJ, Jenkins)

728x90
반응형

원본은 spring boot : 설정파일 분리 (IntelliJ, Jenkins) 에서 보실 수 있습니다.

 

spring boot 프로젝트의 설정 파일인 application.yml (application.properties 확장자가 기본이야) 은 resources 디렉토리에 존재하기 때문에 프로그램을 빌드하면 해당 파일이 포함되어 보안에 문제가 있어.

Gradle 의 Tasks 항목 아래의 build/bootJar 를 선택해서 실행해보면 배포를 위한 빌드를 할 수 있어.


빌드된 파일은 프로젝트 폴더 아래의 build/libs 디렉토리에서 찾을 수가 있는데, study.diary-0.0.1-SNAPSHOT.jar 라고 되어 있네.


확장자는 .jar 이지만, 압축파일 포맷이기 때문에 확장자를 .zip 으로 변경하면 압축 프로그램을 이용해서 압축을 해제할 수가 있어.


압축을 해제한 다음에 BOOT-INF/classes 디렉토리로 이동해보면 application.yml 파일이 확인되지.


심지어 .bak 로 확장자를 변경해둔 application.properties.bak 파일도 들어있네.

프로젝트를 개발하고, 빌드해서 서버에 올려두었을 때 .jar 파일 안에 DB서버 관련정보(IP주소, 사용자아이디, 비밀번호)가 들어있다면 당연히 보안에 취약해질 수 밖에 없겠지.

이번 포스트에서는 보안에 민감한 정보를 프로그램 설정 파일에 담는 방법에 대해서 알아볼거야.

 

일단 보안에 민감한 정보라도 프로젝트에서 함께 관리가 되는게 좋을거야. 그렇다면 프로젝트 디렉토리 어딘가에 저장을 해야 하는데, 적절하지 않은 위치는 현재 application.yml(또는 application.properties) 파일이 저장되고 있는 /src/main/resources 야. 이 디렉토리에 저장되어 있던 파일이 프로젝트 빌드 아웃풋 파일의 BOOT-INF 디렉토리에 고스란히 담겨있던걸 보면 알 수가 있지. 최소한 /src/main 을 포함한 그 위쪽 계층에 저장되어야 한다는 얘기가 되지.


여기에서는 /src 디렉토리 아래에 config 라는 디렉토리를 만들고, 이 디렉토리 안에 설정 정보 파일을 생성해볼께.


새로 생성한 파일은 총 2개이고, 각각 application-local.yml 과 application-prod.yml 이야. 눈치빠른 사람이라면 이미 눈치챘겠는데, 프로그램 설정 파일은 반드시 application 으로 시작해야만 하는 규칙이 있어.

이름에서도 알 수 있듯이 application-local.yml 에는 로컬 정보를, application-prod.yml 에는 운영서버용 정보를 담을 계획이야. 만약 디버그서버가 별도로 준비되어 있다면, application-debug.yml 이나 application-dev.yml 파일을 만들어주면 되겠지.

이제 기존의 application.yml 파일에 들어있던 정보중에서 보안에 민감한 정보를 새로 만든 파일로 옮겨줄거야.

application.yml 파일에 들어있는 정보를 볼까?


보안상 가려야 하는 정보라면 데이터베이스 서버 주소와 사용자이름, 비밀번호 가 되겠네.

이제 이 정보들을 application-local.yml 과 application-prod.yml 에 각각 복사하고 정리해볼께.

application-local.yml 파일에는 로컬개발할 때 사용할 로컬 DB 정보를 넣었어.


application-prod.yml 파일에는 운영서버에서 접속할 DB 정보를 넣었어.

 

application.yml 에는 DB 연결정보를 제거했지.


자 이제 총 3개의 프로그램 설정 파일이 존재하는데, 이 파일들을 불러오는 방법에 대해서 알아볼께.

로컬 개발할 때에는 application.yml + application-local.yml, 운영서버에서는 application.yml + application-prod.yml 의 조합이 필요해.

그런데 로컬개발이든 운영이든 application.yml 은 무조건 포함되지. 그렇다면 로컬환경에서는 application-local.yml 을 운영환경에서는 application-prod.yml 을 추가적으로 로딩해서 포함시켜주면 되겠네.

java 를 실행시킬 때 지정할 수 있는 파라미터중에는 추가적인 환경설정 파일의 경로를 지정하는 지정자가 있어.

참고 : https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html

바로 spring.config.additional-location 이야.

이 파라미터의 사용법 예시를 볼께.

java -jar myproject.jar --spring.config.additional-location=/var/config/application-prod.yml

위 예시는 myproject.jar 에 기본 포함되는 application.yml 파일에 더해서 /var/config/application-prod.yml 파일을 환경설정 파일로 사용한다는 얘기야. 만약 application.yml 과 application-prod.yml 에 동일한 설정이 있을 경우에는 추가로 읽어들인 application-prod.yml 파일의 설정값이 적용되는 구조야.

그렇다면 IntelliJ 에서는 어떻게 설정을 해야 할까?

Run / Edit Configurations 메뉴항목을 선택한 다음에


IntelliJ Ultimate 버전에서는 Spring Boot / Application 항목에서 Build and run 그룹의 Modify options 를 선택해서

Java 의 Program arguments 메뉴를 선택해줘.

그리고 입력란에 옵션과 옵션값을 기록해주면 돼.

--spring.config.additional-location=file:./src/config/application-local.yml

IntelliJ Community 버전에는 프로그램 argument 입력란이 자동으로 표시되고 있으니까 그곳에 동일한 값을 입력해주면 돼.

그렇다면, Jenkins 에서도 추가한 설정파일에 대한 배포 로직을 추가하고, 실행시킬 때 파라미터도 지정을 해야겠지?

 

우선 프로젝트에서 관리하고 있는 서비스 설정 파일(script/diary.service) 의 내용에 –spring.config.additional-location 파라미터를 적용해볼께.

ExecStart=/usr/bin/java -Xms128m -Xmx256m -jar /var/webapp/diary/study.diary.jar --spring.config.additional-location=/var/webapp/diary/application-prod.yml

java 실행 명령어 뒤에 –spring.config.additional-location 파라미터를 추가해줬어. 설정 파일의 경로는 절대 경로로 잡아줬고.

젠킨스에서는 새로 추가된 application-prod.yml 파일을 배포 항목으로 추가시켜줘야겠네.

deploy Pipeline Item 의 스크립트를 수정해볼께.

pipeline {
    agent any

    stages {
        stage('deploy') {
            steps {
                echo 'deploying output'
                sh '''
                    ssh -o StrictHostKeyChecking=no webapp@10.10.1.2 "mkdir -p /var/webapp/diary"
                    cd /var/lib/jenkins/workspace/diary/clonesource/build/libs
                    ssh -o StrictHostKeyChecking=no webapp@10.10.1.2 "cp /var/webapp/diary/study.diary.jar /var/webapp/diary/study.diary.jar.bak"
                    scp study.diary-0.0.1-SNAPSHOT.jar webapp@10.10.1.2:/var/webapp/diary/study.diary.jar
                    cd /var/lib/jenkins/workspace/diary/clonesource/src/config
                    scp application-prod.yml webapp@10.10.1.2:/var/webapp/diary/
                '''
            }
        }
        stage('execute') {
            steps {
                echo 'executing program'
                sh '''
                    ssh -o StrictHostKeyChecking=no webapp@10.10.1.2 "sudo /var/webapp/diary/start.sh"
                '''
            }
        }
    }
}

서비스 설정 파일(diary.service)이 변경되었기 때문에 소스 클론(clonesource) → 서비스 설치(install as service) → 빌드(build project) → 배포(deploy) 순서로 진행해야 해.

로컬 개발할 때 연결할 데이터베이스는 localhost 이고, 운영서버에서 연결할 데이터베이스는 10.10.1.11 로 제대로 설정되어 프로그램이 동작하는걸 확인했으면 됐어.

반응형