프로덕션에서 Secrets와 .env 다루기
웹루트/레포에 시크릿을 두지 않고, 운영에서 안전하게 주입/백업/차단하는 체크리스트
운영에서 가장 흔한 사고 중 하나는 “코드 배포”가 아니라 시크릿(키/토큰/비밀번호) 유출입니다. .env는 편리하지만, 프로덕션에서는 관리 방식이 중요합니다.
운영 기본 원칙 3가지
- 코드와 시크릿을 분리합니다. (레포/웹루트에 두지 않기)
- 시크릿은 최소 권한으로 읽히게 합니다. (권한/소유자/경로)
- 시크릿은 백업/로그/에러 리포트로 새지 않게 합니다.
체크리스트 (익명화된 실전 패턴)
1) 레포/배포 산출물
.env는 커밋하지 않고,.env.example만 제공합니다.- CI/CD 로그에 환경변수가 출력되지 않게 합니다. (특히
printenv,set -x) - “정적 사이트 빌드 산출물”에 시크릿이 섞이지 않게 합니다. (프론트 번들에 키가 들어가면 끝)
2) 시크릿 파일 위치/권한
- 시크릿 파일은 앱 디렉터리 밖(예:
/etc/myapp/myapp.env)에 둡니다. - 권한은
0600또는 최소 접근으로, 소유자는root또는 해당 서비스 계정으로 제한합니다. - 웹서버가 접근 가능한 경로(예: 정적 root, 업로드 경로)에 시크릿 파일을 두지 않습니다.
3) 주입 방식
- systemd를 쓴다면
EnvironmentFile=로 주입합니다. →EnvironmentFile - 애플리케이션은 “환경변수에서 읽는다”만 알고, 파일 위치/권한은 운영이 책임집니다.
관련 문서: systemd EnvironmentFile로 환경변수 주입하기
4) nginx에서 “실수 방지” (노출 차단)
/.env,/.git/, 백업 파일(.bak,.sql) 등은 무조건 차단합니다.- 단,
/.well-known/acme-challenge/는 SSL 갱신을 위해 예외가 필요할 수 있습니다.
바로 쓰는 스니펫: nginx: 민감 파일(.env/.git/백업) 차단
5) 백업/복구
- 백업은 “성공 로그”가 아니라 복구 테스트가 기준입니다.
- 백업에 시크릿이 섞이면, 백업 유출 = 운영 전체 유출이 됩니다.
- DB 덤프/파일 백업을 분리하고, 시크릿은 별도 저장/암호화/접근통제합니다.
체크리스트: 백업 설계: 복구 가능 + secrets 제외
권장 구조 예시
/srv/myapp/ # 코드/빌드 산출물 (배포 대상)
current/
releases/
/etc/myapp/myapp.env # 시크릿 (권한 제한)
/var/log/myapp/ # 로그