환경 변수와 비밀 관리: dotenv와 Vault 비교
Node.js 환경에서 dotenv와 HashiCorp Vault를 통해 환경 변수와 비밀을 안전하게 관리하는 원칙과 구현 방법에 대한 실무적 요약
목차
개요
애플리케이션 구성에서 환경 변수와 비밀(secret)은 운영과 보안의 핵심 요소다. 단순한 .env 파일은 개발 편의성을 주지만, 운영 환경에서는 유출 위험과 권한 관리 한계가 있다. 반면 HashiCorp Vault는 중앙 집중형 비밀 저장소로 감사, 권한 분리, 동적 자격증명 발급 기능을 제공한다. 이 글에서는 Node.js 환경에서 dotenv와 Vault를 각각 어떻게 사용하고, 언제 전환해야 하는지 실무 관점에서 정리한다.
왜 환경 변수와 비밀 관리가 중요한가
안전성
API 키, DB 비밀번호 같은 민감 정보가 코드 저장소에 포함되면 회복 비용이 크다. 직권 탈취, 로그 노출, 백업 파일 유출 등의 위험을 줄이려면 비밀을 별도 수단으로 관리해야 한다.
운영·배포 편의성
환경별 구성(개발/스테이징/운영)을 분리하면 배포 파이프라인과 인프라 코드가 명확해진다. CI/CD에서 환경 변수를 주입하거나, 비밀 서비스에서 런타임에 가져오는 방식이 권장된다.
dotenv: 개발에서의 표준
dotenv는 .env 파일을 로컬 환경에 두고 process.env에 값을 주입하는 간단한 라이브러리다. 설정이 쉬워 빠르게 시작할 수 있지만, 파일을 깃에 커밋하지 않는 규칙과 접근 통제 외에는 추가 보호가 없다.
사용 예시
NODE_ENV=development
DB_HOST=localhost
DB_USER=myuser
DB_PASS=secret_password
const dotenv = require('dotenv');
dotenv.config();
const host = process.env.DB_HOST;
console.log('DB host:', host);
실무 팁:
- .env 파일을 .gitignore에 추가하고 샘플은 .env.example로 관리한다.
- 민감 정보는 로컬에서만 .env로 두고 CI/CD에서는 별도 비밀 관리 시스템을 사용한다.
- dotenv만으로는 접근 제어나 감사로그를 제공하지 않는다.
HashiCorp Vault: 운영환경을 위한 비밀 관리
Vault는 중앙 집중형 비밀 저장소로서 비밀의 안전한 저장, 접근 정책, 감사, 동적 자격증명 발급을 지원한다. 특히 단기 토큰이나 DB 사용자 동적 생성과 같은 기능은 유출 리스크를 크게 줄여준다.
기본 흐름
- 앱은 적절한 인증(토큰, AppRole, Kubernetes Auth 등)을 통해 Vault에 접근
- Vault 정책으로 세밀한 권한 제어 적용
- 앱은 런타임에 비밀을 요청해 사용하고 메모리에서 안전하게 처리
Node에서 Vault 사용 예시
const vault = require('node-vault')({ endpoint: process.env.VAULT_ADDR, token: process.env.VAULT_TOKEN });
async function getSecret() {
const res = await vault.read('secret/data/myapp/config');
// KV v2의 경우 실제 값은 res.data.data 내부에 존재
return res.data.data;
}
getSecret().then(s => console.log(s)).catch(err => console.error(err));
주의: 토큰은 환경변수로 주입되더라도 최소 권한 정책과 단기 유효 기간을 적용한다.
비교: 언제 dotenv, 언제 Vault?
- 로컬 개발, 간단한 실험: dotenv 적합
- 팀 협업 환경에서 민감 정보 공유 필요: Vault로 전환 고려
- 운영환경에서 규정 준수, 감사가 필요하거나 동적 자격증명 필요: Vault 권장
구현 시 핵심 베스트 프랙티스
- 비밀은 최소 권한 원칙(Principle of Least Privilege)을 적용한다.
- 토큰·자격증명은 주기적 갱신과 단기화. 장기 토큰 사용은 피함.
- 비밀은 로그와 에러 메시지에 절대 출력하지 않는다.
- 개발용 .env는 로컬 전용으로 관리하고 샘플 파일만 저장소에 둠.
- CI/CD에는 자체 비밀 스토어(예: GitHub Secrets, GitLab CI 변수)를 사용하거나 Vault를 연동.
- Vault 정책을 통해 경계(프로덕션/스테이징)를 명확히 분리.
- 비밀 접근은 런타임에만 수행하고 필요시 메모리에서 안전하게 지운다.
운영 전환 체크리스트
- 현재 사용 중인 민감 정보 목록 작성
- 권한 모델 설계(누가 어떤 비밀에 접근하는지 정의)
- Vault 혹은 관리 도구 선택 및 PoC 수행
- CI/CD와 런타임 통합 계획 수립
- 감사 로그 활성화 및 주기적 검토 절차 마련
- 토큰/자격증명 회전 정책 적용
정리
Node.js 환경에서는 개발 편의를 위해 dotenv를 사용하되, 운영 단계에서는 중앙 비밀 관리 도구로 전환하는 것이 안전하고 확장성 있는 접근이다. HashiCorp Vault는 권한 제어, 감사, 동적 자격증명 등 운영환경에 필요한 기능을 제공하므로 장기적으로 보안성과 운영 효율을 높인다. 중요한 점은 도구 선택보다도 최소 권한, 비밀 회전, 로그 관리 같은 원칙을 조직에 정착시키는 것이다.