Vault란?
Vault는 HashiCorp에 의해서 개발된 크로스플랫폼 패스워드 및 인증 관리 시스템이다. 공개되면 안되는 비밀번호, API 키, 토큰 등을 저장하고 관리한다.
https://www.vaultproject.io/ 에서 개발했다.
사용 이유
사용자명, 엔드포인트, 비밀번호, 포트 등 중요한 정보를 형상관리툴에 노출시키지 않게 하기위하여 사용한다.
Spring 과 Vault
spring cloud 에서 공식적으로 vault 연결해주는 dependency를 제공해준다.
https://spring.io/guides/gs/vault-config/
Vault설정
org.springframework.cloud:spring-cloud-starter-vault-config 가 있고
springframework-vault-core 가 따로 있지만 해당 포스팅에서는
최근 공식문서에서 소개한 전자로 진행했습니다.
Vault 설치
$ brew install vault
Server 실행
$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000" # vault 서버 실행
확인
localhost:8200
루트 토큰 아이디 접속하면
추가로
관리가 가능한 어드민 창이 나오고 해당 창에서 오른쪽 위에 Command Line을 사용할 수 있다.
해당 커맨드 라인을 사용해서 정책에 맞는 역할키와 시크릿키 발급 가능하다.
만약 Get "https://127.0.0.1:8200/v1/sys/internal/ui/mounts/secret/application/db": http: server gave HTTP response to HTTPS client 이러한 에러가 발생하였을 경우
$ export VAULT_ADDR='http://localhost:8200'
key 값을 만들어줘야한다.
- 생성
$ vault kv put secret/application username=coodori password=1234 # key, vaule 생성
- 확인
$ vault kv get secret/application # path 으로 key, vaule 조회
Spring Vault값 받아오기
Spring 환경 : Gradle, Java version 17 이상
- build.gradle에 추가
ext {
set('springCloudVersion', "2022.0.0-RC3")
}
repositories {
mavenCentral()
maven {
url "https://repo.spring.io/milestone/"
}
}
dependencies {
...
implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
- 설정값 받아올 클래스 생성
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties()
public class MyConfiguration {
private String username;
private String password;
}
여기서 vault에 키를 넣을 때 example.username이 아닌 username 으로 넣었다. 그래서 공백으로 처리했다.
더 좋은 방법
@Getter
@ConfigurationProperties()
public class MyConfiguration {
private final String username;
private final String password;
public MyConfiguration(String username, String password) {
this.username = username;
this.password = password;
}
}
username 과 password는 변경되지 않는 값이니 setter를 닫고
@ConfigurationProperties()는 생성자 주입이 가능하니 해당 기능을 사용하는 것이 좋을 듯 하다.
- yml 설정
spring:
application:
name: application // secret 뒤의 값
cloud.vault:
cloud:
vault:
token: 00000000-0000-0000-0000-000000000000
scheme: http
host: localhost // 기본값
kv:
enabled: true // 기본값
config:
import: vault://
기본값이긴하지만 이후 ec2에 올린 vault 값을 받아올 것이기 때문에 옵션을 미리 찾아봤다.
- Test
@Slf4j
@SpringBootApplication
@EnableConfigurationProperties(MyConfiguration.class) //추가
public class VaultApplication {
private final MyConfiguration myConfiguration;
public VoultApplication(MyConfiguration myConfiguration) {
this.myConfiguration = myConfiguration;
}
public static void main(String[] args) {
SpringApplication.run(VaultApplication.class, args);
}
// 테스트
@PostConstruct
public void run(){
log.info("username = {}",myConfiguration.getUsername());
log.info("password = {}", myConfiguration.getPassword());
}
}
@Slf4j로 테스트를 진행했다.
@PostConstruct를 활용하여 빈 주입이 완료되면 실행하도록 했다.
추가로
@EnableConfigurationProperties(MyConfiguration.class)를 추가해주어야 해당 클래스에 설정값 주입이 된 값을 사용할 수 있다.
결과
성공적으로 username 과 password를 불러왔다.
Reference
https://spring.io/guides/gs/vault-config/
https://mungmange.tistory.com/135
'Programming > Web-Spring' 카테고리의 다른 글
[intellij] 인텔리j spring boot 실행 시 , finished with non-zero exit value 1 해결 (0) | 2024.09.05 |
---|---|
[Spring] Annotation 커스텀 생성하기 (0) | 2024.07.26 |
[jwt] refreshToken을 db에서 유지하는 이유 (0) | 2024.06.07 |
[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 (0) | 2024.06.03 |
[Spring] QueryDsl의 Q클래스 빨간줄 에러 뜨는현상 방지 (0) | 2024.01.30 |