스프링 부트 application.yml 설정 파일 암호화 및 외부 관리
개요
스프링 부트 프로젝트의 애플리케이션 설정 파일의 관리 방법을 변경했다.
먼저 랜손챗 백엔드 서버의 경우 마이크로 서비스 패턴을 통해 구현함을 목표로 하고 있다. 따라서 프로젝트의 마이크로 서비스들은 다음과 같다.
- eureka-server
- gateway-service
- user-service
- chat-service
- gesture-service
문제점
1. 마이크로 서비스 설정 파일들의 중복성
각각의 마이크로 서비스들은 공통적인 설정들을 가지므로 파일이 중복되어 관리되며 한 가지 변경점이 생기면 각각의 마이크로 서비스의 설정 파일들을 모두 변경해 주어야 하는 문제가 있다.
2. 설정 파일 변경 시 서버를 재기동 해야 하는 문제
변경된 설정 파일을 적용하려면 서버를 재기동해야한다. 하나의 WAS에서, 또는 개발 환경에서 충분히 수용할 수 있는 점이지만 프로젝트가 완성되며 배포가 완료된 후의 관리를 생각해 보면 임의로 서버를 재기동하는 것은 옳지 않다.
3. 설정 파일 암호화 필요
설정 파일마다 외부에 공개되어 서는 안되는 값들이 존재한다. (IP, PORT, ID, PWD, etc..) 따라서 설정 파일을 외부 환경에서 관리함과 동시에 설정 파일들의 암호화, 복호화 기능 또한 필요된다.
대안
build.gradle
의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
설정 파일 분리 & config github repository 생성
keytool 을 통하여 암호화 키 생성(RSA)
keytool -genkeypair -alias [ALIAS] -keyalg RSA \
-dname “CN=[COMMON NAME], OU=[ORGANIZATION UNIT], O=[ORGANIZATION], L=[LOCALITY], C=[COUNTRY]” \
-keypass “[PWD]” -keystore KEY.jks -storepass “[PWD]”
keypair 를 생성했으므로 -export
, -import
를 통해 인증서와 공개키를 생성할 수 있다.
config-service 생성
- Config Server 설정
@SpringBootApplication
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
- config-service
application.yml
encrypt:
key-store:
password: PWD
alias: apiEncryptionKey
location: file:apiEncryptionKey.jks
생성한 암호화 키를 통하여 즉석에서 암호화 복호화가 가능하다. 서버를 기동한 후 POST : localhost:8888/encrypt
, POST : localhost:8888/decrypt
요청을 통해 plain text 를 전송하면 된다.
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: "{cipher}AQBEBc4+UYBaxE4msjjZoP9On3PHqe4xbxcYRsOA69FGvXSzFyLNdn8zbAmvjDA4Mjc58M/847CkxuxbImQx0SJUkBLb/8gCCnefayWWp8jDmk2eD46wDngApGY/XPvs/jmJi0VYui+9PXna8x2q8yyC/JeCPYWCK2iwrsKWrJoYroFWdCYJFrDD7BYcyxXlAa6R4wlsxo/j3EIbSWSac+r9ZZWfgJkNJiZ+jRV+cQTt+yJrn8eT8VuLGlpcVmKSSRhNhgqmZeoroSmZGjJaDL6I/lYww+ozH1+xQ25ynw872I5oIkYKaL1NiLyNJ56YLn25GWVlEExhJfD40kyRiH4GNW3AYZTzZ+GJPhf/DBtn77SOmMnB72ghAthI3TCL4f6/Z0DzMMpFQMg/ZveWLD0GYfQlDp2BZVEWCs4rBSmQVA=="
username: "{cipher}AQBgbJQdI7dlmpwhEeFcFpNHg2AjtrAboXWzKswP1oEKB8e5LCHWF98MiZBWqvExtFj0RJG5EPicZzv2FztD0xo74dcpI1nYTBqMQoGciyb7JI5ms/WqMhHcYd0U1GbtKuezKrFceWuvzQwZLiK0LZ01Ti0J9k/3hKgN5kpUMYXT0m5GMWkZbvlFbFssBkifqv5vmOJlXN1DZD75tjAIMzMJZsxAhZK49gFyChzHrXbxlxNmisx85NnfrLvBqXsZVf/rNj3fgLVCL3hdy4VAYqaOpvtiVwOcc+fvykQWIObYLJ8poKm36o8JgZVvxpQXZEKFEGJ7Ra+eoryneQb8KTjPJvsgB80UJ8Nd44T/4Q3Quzj0fqa8ajfCFADr1fl6X0Y="
password: "{cipher}AQAVJnTwVqx9/CN3yuhsSeMCgMHD9ho1r2uF5anNltOI3bXz/Whi+UkCeQG4bdC1RG9mSONwms1Uovq096PHXOtz2Ur53Irso8tLVJOs6WwhVekxQLDtR8qub5oX6STXSd8bOTaeSsXb+mOEjJ21NeY+JhYrvNkeCRO54XnAL+sw31uDYGPTG0FUf8dTaY86TPD/5CGR9ld6wfTcpml44ygQvrucKbbGbXQE77MpbwjqM5nr8QLZ/oIJxG7aARQfU++Didni4gNhTS+Qa+1bxRlKGtKVr3Ou4zRRo5c+NHcAViGAxnF09Fn8bQjBuZm+3kq0GLEtDBvp9DbnCZjiSRt7wWyxvj93wJbNX0JXhmR6JSsmccKc8qllU781lc019l4="
암호화된 값들은 설정파일에 입력할 때 {cipher}CIPHER_TEXT
와 같이 입력하면 spring cloud config에서 알아서 복호화를 해준다.
RabbitMQ 의 메시징 큐 서비스 이용
application.yml
설정 파일에 rabbitmq 관련 설정들을 해주지 않으면 기본 값으로 localhost:5672, guest 계정으로 스프링 부트와 연동이 된다.
(배포 시에는 host, port 값 설정이 필요하다!)
Spring Cloud Bus
GET : localhost:8888/bus/refresh
또는 GET : localhost:8888/actuator/busrefresh
를 통하여 실시간 설정 파일 수정이 가능하다.
Spring Cloud Config
⬆ config-service 접속 결과(모든 설정 파일들을 GET 할 수 있으며 암호문이 복호화 된 상태로 출력된다.)
마이크로 서비스 설정 파일 적용
- config-service와 동일한 의존성 추가
build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
resources/bootstrap.yml
생성
spring:
cloud:
config:
uri: http://127.0.0.1:8888
name: randhand
profiles:
active: default, datasource, token
⬆ 서비스 시작 시 설정된 uri에서 여러 프로파일들을 가져오게 된다.
구현된 코드는 RandHand-config, config-service 에서 확인하실 수 있습니다.
댓글남기기