.env는 매우 편리해 거의 모든 현대 프레임워크가 사용합니다. 하지만 한 번 잘못된 곳에 두면 현관문에 열쇠 꾸러미를 꽂아두는 것과 같습니다. 이것이 무엇인지, 그리고 어떻게 지키는지를 바닥부터 살펴봅니다.
조금 더 자세히
앱에는 "환경마다 바뀌는 값"과 "아무에게도 보이고 싶지 않은 값"이 있습니다: DB 비밀번호, 외부 API 키, 세션을 암호화하는 키. 이것들을 소스에 하드코딩하면 코드를 공유하는 순간 시크릿이 새어 나갑니다.
그래서 이를 하나의 .env 파일에 모아 코드에서 "환경 변수"로 읽습니다. Next.js, Laravel, Rails 등 많은 프레임워크가 이 방식으로 동작합니다.
왜 "가장 위험한 파일"인가
여러 키가 한 파일에 있기 때문에, 한 번의 노출이 피해를 빠르게 번지게 합니다. "유출된 각 값이 무엇을 여는지" 나열하면 심각성이 분명해집니다.
| 유출된 값 | 무슨 일이 일어나는가 |
|---|---|
| DB 자격 증명 | 데이터 읽기 / 변조 / 삭제 |
| 외부 API 키 | 사칭 사용, 부정 과금 |
암호화 키(예: Laravel APP_KEY, 서명 키) | 세션 위조, 사칭 로그인 |
| OAuth 시크릿 | 연동 앱 장악 |
실제로 .env 노출은 고전적인 사고입니다. → 전 세계에 노출된 .env
전형적인 유출 = 배치 실수
가장 큰 원인은 "앱 전체를 공개 디렉터리(문서 루트)에 두는 것"입니다. public/만 서빙되어야 할 곳에서 그 상위를 노출하면 .env까지 닿을 수 있게 됩니다.
✗ 위험(앱이 공개 루트에 있음)
public_html/ ├─ .env ← 읽힘! ├─ app/ └─ public/
✓ 안전(앱은 바깥, public만 서빙)
app-root/ ├─ .env ← 닿을 수 없음 ├─ app/ └─ public_html/ → public/
지키는 법
공개 디렉터리에 두지 않기
앱을 문서 루트 바깥에 두고 public/만 서빙하세요. 공유 호스팅의 구체적 절차: 이 가이드.
git에 커밋하지 않기
.env*를 .gitignore에 추가하고, 값이 비어 있는 .env.example만 공유하세요.
유출되면 전부 교체
확인된 키 하나만이 아니라 — .env에 있던 모든 키를 교체하세요. 전부 보였다고 가정하고 움직이세요.
정기적으로 자가 점검
자기 사이트에서 /.env를 열 수 없는지 확인하는 습관을 들이세요.
자가 점검(본인 소유 도메인에 대해서만)
# 본문이 있는 200이면 노출된 것입니다. 403/404이면 지금은 괜찮습니다.
curl -sI https://yourdomain/.env | head -1
curl -sI https://yourdomain/.git/config | head -1배포할 때마다 이를 점검하면 배치 실수를 일찍 잡아냅니다.
다음으로 읽기
FAQ
Q.env를 git에 커밋해도 되나요?
안 됩니다. .env를 .gitignore에 추가하세요. 대신 어떤 키가 필요한지 공유하기 위해 값이 비어 있는 .env.example을 커밋하세요.
Q.env에서 시크릿이 단 하나라도 새면 무엇을 교체해야 하나요?
확인된 것 하나만이 아니라 — .env에 있던 모든 키를 교체하세요. 우선순위: 외부 API / OAuth 시크릿 → 암호화 키 → 메일 → DB. 전부 보였다고 가정하고 움직이세요.
Q.env가 유출됐는지 어떻게 확인하나요?
브라우저에서 https://yourdomain/.env 를 열어보세요. 내용이 보이면 노출된 것입니다(본문이 있는 200 = 나쁨). 차단되면(403/404) 지금은 괜찮습니다.