Backend/Spring+Boot

spring cloud vault 으로 vault 연동

findmypiece 2023. 6. 14. 17:05
728x90

사내에 vault 서버가 있고 이곳에 주요정보들을 보관하고 있다. Spring 환경어어서 기존 프로젝트 들에서는 아래 의존성을 사용했었다.

org.springframework.vault:spring-vault-core

사용법은 매우 간단하다.

 

application.yml 파일에 아래와 같이 접속정보를 정의하고

vault:
  uri: https://vault....
  token: ...

 

 

Configuration 클래스는 아래와 같이 정의하면 된다.

@Configuration
@Import(EnvironmentVaultConfiguration.class)
@VaultPropertySource(value = {"secret/application/sandbox/db-info"}, propertyNamePrefix = "db-info.")
public class VaultConfig {
}

 

그리고 필요한 곳에서 아래와 같이 값을 사용하면 된다.

@Configuration
@RequiredArgsConstructor
public class CoreDataSourceConfig {

    private final Environment env;

    @Bean
	@ConfigurationProperties(prefix = "spring.datasource.mpoc.hikari")
	public HikariConfig hikariConfigMpoc() {
		HikariConfig HikariConfig = new HikariConfig();
		HikariConfig.setJdbcUrl(env.getProperty("db-info.url"));
		HikariConfig.setUsername(env.getProperty("db-info.username"));
		HikariConfig.setPassword(env.getProperty("db-info.password"));
		return HikariConfig;
	}
    
}

 

 

그런데 Spring 에서 spring-cloud 프로젝트가 활발하게 관리되고 있는 것 같아 해당 프로젝트에 포함된 의존성은 되도록 그걸 사용하는게 좋다고 판단해서 이번에는 아래 의존성을 활용했다.

org.springframework.cloud:spring-cloud-starter-vault-config

 

우선 application.yml 에 아래와 같은 내용을 추가한다.

spring:
  cloud.vault:
    host: ...
    port: 443
    scheme: https
    authentication: TOKEN
    token: ...
    kv:
      enabled: true
      backend: secret
      profile-separator: '/'
      default-context: dev/wallet/sandbox
      application-name:
      profiles:
  config:
    import:
     - vault://

여기에서 중요한 것은 profiles 은 반드시 공란으로 둬야 한다는 것이다. 이는 기본적으로 spring.profiles.active 이 사용되는데 위와 같다면 빈문자열로 재정의 된다.

 

이렇게 하는 이유는 위 설정에 따라 아래와 같은 다수의 secret path 와 연결을 시도하기 때문이다.

/{backend}/{default-context}

/{backend}/{default-context}/{profiles}

/{backend}/{application-name}

/{backend}/{application-name}/{profiles}

 

이 중 실제 존재하지 않는 secret path 는 연결이 실패하게 된다. 이에 해당하는 secret path를 모두 만들어서 활용한다면 상관없지만 그럴게 아니라면 위와 같이 명시적으로 빈문자열로 정의해줘야 연결을 시도 하지 않는다. 위 설정대로라면 아래와 같은 secret path 로만 연결을 시도한다.

/{backend}/{default-context}

 

위 secret path 에 정의되어 있는 key/value 는 그냥 application.yml 의 값을 읽는 것처럼 바인딩 해서 사용하면 된다.

예를 들어 아래와 같은 key/value 가 정의되어 있다면

vault.dbUrl / jdbc

 

@ConfigurationProperties("vault")를 활용해서 class 에 값을 바인딩해서 사용할 수 있다.

728x90