한눈에 보기
- 코드·설정 파일에 박혀 있는 비밀번호·키를 Azure Key Vault로 빼내는 방법.
- 핵심은 관리 ID(Managed Identity)로 비밀번호 없이 Key Vault에 접근하는 것.
- 시크릿이 유출돼도 회전(rotation)·접근 제어로 피해를 줄입니다.
가장 흔한 사고가 ‘GitHub에 올린 코드에 DB 비밀번호가 들어 있던’ 경우입니다. 시크릿을 코드에서 분리하고, 접근은 자격증명 없이 ID로 하는 게 정석입니다. Key Vault가 그 역할을 합니다.
Key Vault가 보관하는 것
| 유형 | 예시 | 용도 |
|---|---|---|
| Secrets | DB 비밀번호, API 키, 연결 문자열 | 앱이 런타임에 읽기 |
| Keys | 암호화 키(RSA 등) | 암·복호화, 서명 |
| Certificates | TLS 인증서 | HTTPS, 자동 갱신 |
핵심: 관리 ID로 ‘비밀번호 없이’ 접근
앱(App Service·VM·Functions)에 관리 ID를 부여하면, 그 ID에 Key Vault 접근 권한을 주는 것으로 끝납니다. 코드엔 비밀번호가 전혀 없습니다. Key Vault에 접근하기 위한 또 다른 비밀번호가 필요 없다는 점이 핵심입니다.
# 1) 시크릿 저장
az keyvault secret set --vault-name <VAULT> --name DbPassword --value '****'
# 2) App Service에 관리 ID 부여
az webapp identity assign -g <RG> -n <APP>
# 3) 그 ID에 시크릿 읽기 권한(RBAC) 부여
az role assignment create --assignee <APP_IDENTITY> \
--role "Key Vault Secrets User" --scope <VAULT_RESOURCE_ID>
코드에서 읽기
SDK의 기본 자격증명 체인을 쓰면, 로컬에선 개발자 로그인으로 클라우드에선 관리 ID로 자동 인증됩니다. 코드 변경 없이 환경만 바뀝니다.
// Node 예시
const { SecretClient } = require("@azure/keyvault-secrets");
const { DefaultAzureCredential } = require("@azure/identity");
const client = new SecretClient(vaultUrl, new DefaultAzureCredential());
const pw = (await client.getSecret("DbPassword")).value;
흔한 실수
- Key Vault 접근용 비밀번호를 또 코드에 — 관리 ID를 쓰면 그 비밀번호 자체가 사라집니다.
- 접근 정책 너무 넓게 — 앱마다 필요한 시크릿만, 최소 권한으로.
- 회전(rotation) 미설정 — 유출 대비 정기 교체와 만료를 설정하세요.
자주 묻는 질문(FAQ)
- Q. Key Vault에 접근하려면 또 비밀번호가 필요하지 않나요? A. 관리 ID를 쓰면 필요 없습니다. ID에 권한만 주면 자격증명 없이 접근합니다.
- Q. 로컬 개발 땐 어떻게 인증하나요? A. DefaultAzureCredential이 개발자 로그인(az login)을 자동 사용합니다.
- Q. 환경변수에 넣는 것과 뭐가 다른가요? A. 중앙 관리·접근 로그·회전·세밀한 권한 제어가 가능해 보안이 훨씬 강합니다.
마치며
‘시크릿은 코드 밖으로, 접근은 관리 ID로’. 이 두 원칙만 지켜도 가장 흔한 유출 사고를 막습니다. Key Vault는 그 표준 도구입니다.