Vault KV v1 vs v2 — 경로 차이

보안2분조회

Vault 의 KV Secret Engine 은 v1 과 v2 가 있습니다. 둘이 호환이 안 돼서, 운영 중에 혼동하면 API 경로가 달라 에러가 납니다.

v1과 v2의 차이

구분 KV v1 KV v2
버전 히스토리 없음 있음 (최대 N개 보관)
경로 secret/foo secret/data/foo(쓰기), secret/metadata/foo(메타)
삭제 즉시 삭제 soft delete (destroy 로 영구 삭제)
CAS 없음 Check-And-Set (동시 쓰기 방지)

v2 가 버전 관리와 soft delete 를 지원합니다. 실수로 지운 시크릿을 되살리거나 이전 버전으로 돌아갈 수 있습니다. 대신 경로 구조가 바뀝니다.

경로에 끼어드는 /data/

가장 헷갈리는 건 경로인데, v2 는 데이터와 메타데이터를 분리하느라 실제 HTTP 경로에 /data/ 가 끼어듭니다.

# KV v1
GET /v1/secret/foo

# KV v2 — 내부적으로 /data/ 삽입
GET /v1/secret/data/foo

vault kv get secret/foo 로 CLI 를 쓰면 v1 이든 v2 든 알아서 처리해줍니다. 그런데 REST API 를 직접 호출하거나 다른 도구에서 경로를 명시할 때는 이 /data/ 를 직접 신경 써야 합니다.

v1 경로에 v2로 접근하면 404

이게 실무에서 사고로 이어지는데, VaultStaticSecret 같은 걸 쓸 때 type: kv-v2 를 명시해 놓고 정작 그 경로가 v1 으로 마운트돼 있으면 v2 방식으로 /data/ 를 붙여 조회하다 404 가 납니다.

시크릿이 분명히 있는데 “not found” 가 나오면, 값이 없는 게 아니라 엔진 버전이 안 맞아서 엉뚱한 경로를 보는 경우를 의심해야 합니다. 마운트가 v1 인지 v2 인지 먼저 확인하고, 도구 설정의 타입을 거기 맞춥니다.

버전이 섞인 환경이면 어느 경로가 어느 버전인지 정리해두는 게 안전합니다. 같은 secret/ 아래라도 마운트마다 다를 수 있습니다.

참고

  1. 불러오는 중