카테고리 없음

[Spring Cloud Vault] 1. 설정

noahkim_ 2025. 8. 31. 05:00

1. ConfigData API

  • 외부 설정을 가져오는 역할을 하는 API
  • ✅ Vault, Config Server 등
  • 어떤 설정 시스템을 가져올지, 순서를 어떻게 할지 지정 가능
  • ➡️ 유연성 높음

 

ConfigData Locations

위치

  • vault://
  • vault:///<context-path> (컨텍스트 지정 가능)
  • vault:///<context-path>?prefix=<prefix> (prefix 지정 가능)

 

기본 경로

  • /secret/${spring.application.name}/${profile}

 

예시) application.yml

더보기
spring.config.import: vault://first/context/path, vault://other/path, vault://
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
  • 여러 경로 등록 가능
  • 키 중복 시, 병합됨 (앞에 온것이 우선순위 높음)

 

Conditionally enable/disable Vault Configuration

  • 'optional:' prefix를 사용하면, vault 연결이 꺼져있어도 애플리케이션이 기동됨

 

예시) application.yml

더보기
spring.config.import: optional:vault://
spring.config.import: optional:vault:///<context-path>

 

Infrastructure Customization

  • Vault와 통신하기 위해 내부적으로 여러 인프라 클래스를 의존함 (HTTP Client, RestTemplateBuilder 등)
  • ✅ Spring Context 생성 전에, 필요한 인프라 빈을 직접 등록하여 커스터마이징할 수 있음
  • ConfigData API 사용 시, VaultConfigDataLoader가 Bean을 등록함
  • ConfigData API 사용 안할시, VaultAutoConfiguration이 Bean 등록함

 

커스터마이징) ClientHttpRequestFactory

더보기
ClientOptions options = new ClientOptions();
SslConfiguration sslConfiguration = SslConfiguration.unconfigured();
HttpClientBuilder builder = HttpComponents.getHttpClientBuilder(options, sslConfiguration);

InstanceSupplier<ClientFactoryWrapper> supplier = context ->
new ClientFactoryWrapper(new HttpComponentsClientHttpRequestFactory(builder.build()));

SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(ClientFactoryWrapper.class, supplier));
  • Vault 연결 방식을 제어 가능
  • ✅ 커넥션 타임아웃, SSL 설정, 프록시 설정 가능

 

커스터마이징) RestTemplateBuilder

더보기
InstanceSupplier<RestTemplateBuilder> supplier = context -> {

	return RestTemplateBuilder
			.builder()
			.requestFactory(context.get(ClientFactoryWrapper.class).getClientHttpRequestFactory())
			.defaultHeader("X-Vault-Namespace", "my-namespace");
};

SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(RestTemplateBuilder.class, supplier));
  • 커스텀 헤더 추가 가능
  • Namespace 헤더 지정 가능

 

2. Authentication methods

Token

  • Vault의 기본 인증 방식
  • ✅ 애플리케이션이 고정 토큰을 설정으로 넘겨 Vault에 접근함
  •  설정에 토큰이 없으면, ~/.vault-token 파일에서 토큰을 찾아 쓰려 시도함
  • ⚠️ 토큰이 유출되면 권한 안에서 secrets에 접근이 가능

 

설정) application.yml

더보기
spring:
  cloud:
    vault:
      authentication: TOKEN      # 인증 방식: 토큰
      token: 00000000-0000-0000-0000-000000000000  # 사용할 고정 토큰

 

AppRole

  • Vault에서 머신/애플리케이션 인증을 위해 사용되는 방법
  •  

 

 

3. Secret Backends

Key-Vaule Backend

  • application 이름 + active profile을 조합해 vault의 secret 경로를 탐색함
  • vault에 저장된 키는 그대로 Spring Property로 노출됨

 

기본 조회 경로

더보기
/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}

 

 

출처