// Stripe key rotation 예시
constKEYS=[process.env.STRIPE_SECRET_KEY_NEW,process.env.STRIPE_SECRET_KEY_OLD].filter(Boolean);// 새 키 deploy 전후 짧은 기간 둘 다 valid.
🤔 의사결정 기준
환경
저장
로컬 dev
.env (gitignore)
CI
CI 자체 secret store (GitHub Actions Secrets, GitLab CI variables)
Cloud (AWS/GCP/Azure)
Secrets Manager / Parameter Store + IAM
Kubernetes
Sealed Secrets / External Secrets Operator
클라이언트 (모바일 / SPA)
API key 노출 금지 → BFF 또는 OAuth flow
Edge function
환경 변수 + 짧은 TTL key
❌ 안티패턴
하드코딩: const KEY = "sk_live_...". git history 영구 노출.
.env commit: 즉시 공개. rotate 필요.
Slack / 이메일로 비밀 전송: 평문 보관. 사용 후도 남음.
모든 사람이 prod secret 접근: 최소 권한 원칙. break-glass 절차.
rotation 없음: 한 번 leak 후 영구 노출.
secret 을 응답에 echo: error 메시지에 connection string. catch 후 generic.
client-side env (NEXT_PUBLIC_*) 에 진짜 secret: 번들에 들어가 누구나 봄.