KV Secret Engine과 Transit Secret Engine 비교: Vault에서 저장 vs 암호화 서비스

목차

Vault를 도입할 때 가장 먼저 부딪히는 선택지는 “시크릿을 Vault에 저장할 것인가, 아니면 Vault를 암호화 서비스로만 사용할 것인가”입니다. 둘 다 Vault의 Secret Engine이지만, 데이터의 위치와 책임 경계가 완전히 다릅니다. 이 글은 KV 기반 저장 방식과 Transit 기반 암호화 서비스를 비교하고, 오픈소스 선택지를 분류해 정리합니다.

선 설명

  • 논리적 요청·응답 흐름
  • 외부 보관 책임
  • 굵은 테두리는 Vault 경계, 굵은 상자는 값이나 키가 남는 곳이다.

KV: 시크릿 저장·조회

KV: 시크릿 값을 Vault에 보관애플리케이션이 kv put으로 시크릿을 쓰고 kv get으로 읽는다. KV는 시크릿 값을 Vault 스토리지 백엔드에 보관하고 값을 반환한다.애플리케이션VaultKV스토리지백엔드시크릿 값 보관kv put으로 쓰기kv get으로 읽기시크릿 값 반환

Transit: 암호화 서비스, 데이터는 외부

Transit: 키는 Vault, 암호문은 외부애플리케이션이 평문을 base64로 인코딩해 encrypt 요청을 보내면 Vault Transit이 보관한 키로 연산해 ciphertext를 돌려준다. 앱은 ciphertext를 외부 DB나 앱 저장소에 보관한다. 복호화 때 ciphertext로 decrypt를 요청해 base64 plaintext를 돌려받는다. Transit은 평문을 저장하지 않지만 요청에는 평문이 전달된다.애플리케이션VaultTransit키 보관회전·rewrap암복호연산평문(base64)encrypt 요청ciphertext 반환ciphertext로decrypt 요청plaintext(base64) 반환외부 DB/앱 저장소ciphertext 보관보관하고 복호화 때 가져옴
KV는 Vault 스토리지 백엔드에 값을 보관하고, Transit은 키 보관과 암복호 연산만 맡아 평문을 저장하지 않지만 암호화 요청에는 평문(base64 인코딩이며 암호화가 아님)이 전달된다.
그림 관계를 글로 읽기
  1. KV: 애플리케이션이 kv put으로 시크릿 값을 Vault KV에 쓴다.
  2. KV는 시크릿 값을 Vault 스토리지 백엔드에 보관한다.
  3. kv get으로 읽으면 Vault가 시크릿 값을 반환한다.
  4. Transit: 애플리케이션이 평문을 base64로 인코딩해 encrypt 요청을 보낸다.
  5. Vault Transit이 보관한 키로 연산해 ciphertext를 반환한다. 평문은 저장하지 않는다.
  6. 애플리케이션이 ciphertext를 외부 DB/앱 저장소에 보관한다.
  7. 복호화: ciphertext로 decrypt를 요청하면 plaintext(base64)를 돌려받는다.

KV Secret Engine: 시크릿을 Vault 내부에 저장

KV는 말 그대로 Key-Value 저장소입니다. 애플리케이션이 필요한 시크릿(예: DB 비밀번호, API 토큰)을 Vault 내부에 저장하고 필요할 때 읽어옵니다. Vault의 접근 제어와 감사 로그를 그대로 받으며, Vault가 단일 진실 원천이 됩니다.

핵심 특징

예시: KV v2 기본 동작

bash
# 환경 변수
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="s.xxxxx"

# 시크릿 저장
vault kv put secret/app db_password="p@ssw0rd" api_key="abcd1234"

# 시크릿 조회
vault kv get secret/app

예상 출력 형태는 다음과 같습니다.

text
===== Data =====
Key             Value
---             -----
api_key         abcd1234
db_password     p@ssw0rd

KV v2를 쓰면 버전 관리가 가능하고, 삭제/복구/영구 삭제를 구분할 수 있습니다. 운영 중 오탈자나 잘못된 업데이트가 잦다면 v2가 훨씬 안전합니다.

Transit Secret Engine: 키는 Vault, 데이터는 외부

Transit은 “암호화 서비스”입니다. 데이터는 애플리케이션이나 DB에 남아 있고, Vault는 키 보관과 암호화/복호화 연산만 담당합니다. Vault가 평문을 저장하지 않는다는 점이 가장 큰 차이입니다.

핵심 특징

예시: Transit 기본 동작

bash
# 키 생성
vault write -f transit/keys/payments

# 평문을 base64로 인코딩해서 암호화 요청
PLAINTEXT=$(printf 'card-1234' | base64)
vault write transit/encrypt/payments plaintext="$PLAINTEXT"

예상 출력 형태는 다음과 같습니다.

text
Key         Value
---         -----
ciphertext  vault:v1:AbCdEf...==

복호화는 ciphertext를 전달해 plaintext(base64)를 돌려받는 형태입니다.

bash
vault write transit/decrypt/payments ciphertext="vault:v1:AbCdEf...=="
text
Key       Value
---       -----
plaintext Y2FyZC0xMjM0

KV vs Transit 비교표

항목 KV Secret Engine Transit Secret Engine
목적 시크릿 저장소 암호화/복호화 서비스
데이터 위치 Vault 내부 외부 시스템
책임 경계 Vault가 데이터까지 보관 Vault는 키와 연산만 담당
접근 패턴 read/write encrypt/decrypt/sign/verify
가용성 영향 시크릿 조회 시점에 영향 모든 암호화 요청에 영향
회전 전략 값 자체 갱신, 버전 관리 키 버전 회전, rewrap
백업/복구 Vault 백업이 곧 시크릿 백업 Vault 백업은 키 보존에 중요

선택 기준: 언제 KV, 언제 Transit인가

운영 관점 체크리스트 (Delegate → Review → Own)

실무에서는 “누가 무엇을 자동화하고, 누가 최종 책임을 지는가”가 보안 안정성을 좌우합니다.

오픈소스 옵션 맵

Vault의 KV/Transit 개념은 널리 알려졌지만, 오픈소스 생태계의 접근 방식은 다양합니다. 아래는 “KV 저장”과 “Transit형 암호화 서비스” 기준으로 분류한 목록입니다.

KV 기반 시크릿 저장소

프로젝트 유형 비고
HashiCorp Vault (OSS) 중앙 KV + 다양한 Secret Engine KV v1/v2, Transit 포함
OpenBao Vault 호환 포크 KV, Transit 포함
CyberArk Conjur OSS 중앙 시크릿 관리 정책 기반 접근 제어
Keywhiz 시크릿 배포 서버 대규모 배포 사례 있음
Confidant 시크릿 배포 서버 유지관리 상태 확인 필요
Kubernetes Secrets 클러스터 내 KV etcd 암호화 설정 필수

Transit형 암호화 서비스

프로젝트 유형 비고
HashiCorp Vault Transit 암호화/복호화 API 키 회전, rewrap 지원
OpenBao Transit Vault 호환 암호화 API Vault와 유사한 모델
OpenStack Barbican KMS 형태 키/시크릿 관리 API 제공

GitOps/파일 기반 암호화(보조 수단)

프로젝트 유형 비고
Mozilla SOPS 파일 암호화 도구 KMS 연동 기반
Bitnami Sealed Secrets Kubernetes CRD GitOps 시크릿 암호화

오픈소스는 기능 못지않게 유지보수 상태가 중요합니다. 실제 도입 전에는 릴리스 주기와 커뮤니티 활동성을 확인하는 것이 안전합니다.

도식

100%

끌어서 이동, 두 손가락이나 휠로 확대·축소. 키보드: 화살표 이동, + − 확대·축소, 0 맞춤, Esc 닫기. 같은 내용은 그림 아래 “그림 관계를 글로 읽기”에 있다.