시작하기 전에
스프링 또는 스프링 부트 개발을 하다 보면 *.properties 혹은 *.yml로 관리되는 환경설정 값이 필연적으로 존재할 수밖에 없습니다. 그리고 이러한 설정 값 중에서는 노출되어서는 안 되는 정보도 있을 수 있고, 운영 중 변경될 여지가 있는 설정도 존재할 수 있습니다.
지금 생각나는 설정들
- DataSource 정보 (JDBC url, username, password 등)
- 암복호화 관련 Salt Key
- API의 인증키 또는 엔드포인트 정보
- @ConditionalOnProperty로 생성 여부가 결정되는 Bean의 설정값
- Object Storage를 사용하지 않는다면, 파일 업로드 경로
그런데 이러한 많고 다양한 설정들은 배포되는 스테이지에 따라 그 값이 다를 것입니다. 때문에 관리되어야하는 설정의 갯수는 설정수 x 스테이지 수로 늘어날것입니다. 또, 설정이 변경될 때마다 다시 배포가 이루어져야 하기 때문에 아무래도 번거롭고 시간이 소요될 수 밖에 없습니다. 만약 설정값에 민감한 정보가 포함되어있다면 소스코드와 SCM에 그대로 노출됩니다.
설정값을 분리하지 못했을 때 문제점
- 설정이 많아질수록 관리가 어려움
- 설정 변경 시, 배포->빌드 단계가 필요
- 민감 정보가 소스코드와 SCM에 노출
Spring Cloud Config란
이러한 문제를 해결하기 위해, Spring Cloud Config는 설정을 외부로 분리할 수 있는 기능을 제공합니다. Spring Cloud Config는 외부에 설정 서버(Config Server)를 구성하고 설정값을 관리합니다. 클라이언트(Config Client)에서는 애플리케이션 구동 시 설정 서버로부터 설정을 응답받는 구조로 동작하게끔 되어있습니다.
주요 기능
- 분산된 환경에 외부에서 정의 및 관리된 설정을 제공
- 환경 및 스테이지별 설정을 중앙에서 관리
- 키-값 형태, YAML 형태로 설정 제공
- 다양한 형태의 설정 저장소를 지원 (Git, File, Vault, JDBC, Redis, S3 등)
- 재배포 없이 변경된 설정을 실시간으로 적용시킬 수 있음
(이 경우에는 SpringBoot Actuator가 추가로 필요합니다.) - Config 서버와 클라이언트에 설정값 암복호화 제공
설정 방법
- 의존성 추가
- 설정 서버 : spring-cloud-config-server
- 클라이언트 : spring-cloud-starter-config
- Spring Boot 2.4 이전 : bootstrap.yml 파일에 Config Server URI 지정
spring: cloud: config: uri: [Config Server URI]
- Spring Boot 2.4 이후 : application.yml 파일에 Config Server URL 지정
spring: config: import: “optional:configserver:http://configserverdomain.com”
Spring Cloud Config는 어떻게 동작할까요?
클라이언트 구동 시
- 클라이언트에서 Config Server로 설정값을 요청합니다.
- Config Server에서 설정 저장소로부터 최신 설정값을 읽어옵니다.
- Config Server에서 클라이언트로 읽어온 설정값을 응답합니다.
- 클라이언트 애플리케이션에 설정이 적용되고 구동됩니다.
운영중 설정값이 변경되었을 때
- 개발자/관리자가 설정 저장소에서 설정값을 변경합니다.
- 설정을 갱신할 클라이언트에 POST /actuator/refresh 요청을 보냅니다.
- 클라이언트에서 Config Server로 설정값을 요청합니다.
- Config Server에서 설정 저장소로부터 최신 설정값을 읽어옵니다.
- Config Server에서 클라이언트로 읽어온 설정값을 응답합니다.
- 클라이언트 애플리케이션에 변경된 설정이 적용됩니다.
Spring Cloud Config with Vault
앞서 Spring Cloud Config에서 제공하는 설정 저장소에 대해 간단히 목록 정도로 알아보았는데, 이번 포스팅에서는 Vault를 사용해보도록 하겠습니다.
Vault 란
- API Key, Password 등 민감한 정보를 안전하게 관리 및 접근할 수 있도록 하는 오픈소스 프로젝트
- WEB UI 제공
- 계정 및 토큰별 접근 권한 제어 가능
- Spring Cloud Config에서 설정 저장소로 Vault를 지원하고 있음
- https://www.vaultproject.io/
다음 포스트 실습편에서 이어집니다!
References
반응형
'🌱 SPRING' 카테고리의 다른 글
[Spring Security] 스프링 시큐리티 주요 아키텍쳐 1 - DelegatingFilterProxy, FilterChainProxy (0) | 2021.12.06 |
---|---|
[Spring Cloud Config] 설정값을 외부에서 관리하자! - 실습 (4) | 2021.10.10 |
[SpringCloud] Resilience4j와 Spring Cloud Circuit Breaker (0) | 2021.05.16 |
[SpringBoot] 컨트롤러, View(JSP) 작성하기 (0) | 2020.05.30 |
[SpringBoot] 스프링 부트 프로젝트 생성 (0) | 2020.05.30 |