대상: 공유/임대 호스팅이나 VPS에서 여러 사이트를 운영하며 공개 디렉터리(public/, public_html/, htdocs/ 등)로 배포하는 모든 사람. 공격 절차는 없습니다 — 오직 자기 서버를 점검해 구멍을 막는 것뿐입니다. .env 자체를 보호하는 법은 공유 호스팅에서 .env 보호하기를 보세요.
본 사이트의 견해: 어디에 두느냐가 곧 접근 제어다
시크릿은 교묘한 공격보다 배치 사고로 더 많이 샙니다. 웹루트는 "누구나 URL로 와서 가져갈 수 있는 곳"입니다. 거기에 시크릿을 두면 아무리 강한 서버 비밀번호도 무의미합니다. 본 사이트의 토대는 시크릿을 웹루트와 git 양쪽에서 빼두는 것입니다(→ 시크릿을 안전하게 보관하기). 발상은 단순합니다: 공개 디렉터리는 공개 선반입니다. 보여도 괜찮은 것만 올려놓으세요.
public/ = 누구나 URL로 가져갈 수 있음
두어도 OK
이미지, CSS, JS — 공개 에셋
절대 두지 말 것
.env, token.json, .sql, .git, .bak
앱 루트 위 = 서빙 안 됨
여기에 둘 것
시크릿, 토큰, 자격증명, 백업. 권한 600(소유자 읽기만). URL로 닿을 수 없음.
"공개 디렉터리의 잔여물"이 생기는 이유
흔한 패턴은 편의상 둔 파일, 혹은 보일러플레이트 안에 딸려 온 파일이 조용히 공개된 채 남는 것입니다.
예를 들어 제3자 연동용 액세스 토큰을 담은 JSON이 public/ 아래에 오래 놓여 있고 — 공유 템플릿에서 왔다면 같은 파일이 많은 사이트의 같은 자리에 복사되어 모두 같은 구멍을 공유합니다. 한 사이트만 고치는 것은 다른 사이트가 열려 있으면 무의미합니다. 똑같이 위험한 것: 남겨진 .env, 데이터베이스 백업(.sql), .git 디렉터리, 에디터 백업(*.bak), 단축 파일(관련: 경로 순회 · .env 전체가 노출됨).
자기 서버를 점검하라
먼저 "내 공개 디렉터리에 시크릿 같은 파일이 있는가"를 기계적으로 드러내세요. 이는 자기 자산을 점검하는 것이지 남의 사이트를 엿보는 것이 아닙니다.
공개 디렉터리 아래에서 시크릿 같은 파일을 검색한다
public/에 흘러든 시크릿 후보(토큰/자격증명 JSON, .env, 키, 단축 파일)를 드러내세요.확산을 전제로 — 모든 호스트와 사이트로 넓힌다
파일마다 정말 공개가 필요한지 판단한다
# audit under your own public directories (inspecting your own assets)
find ~ -path '*/public/*' \( -iname '*token*.json' -o -iname '*credential*.json' \
-o -iname '*.bak' -o -iname '*.sql' -o -iname '.env*' \) 2>/dev/null
# an exposed .git directory is dangerous too
find ~ -path '*/public/*/.git' -maxdepth 8 2>/dev/null찾았을 때 할 일
세 가지를 한 묶음으로 하세요 — 제거, 폐기, 이동. 하나라도 빠뜨리면 구멍이 완전히 닫히지 않습니다.
URL로 가져갈 수 없도록 웹루트에서 제거한다
샜을 수 있는 키나 토큰을 폐기/재발급한다
시크릿은 웹루트 밖에 권한 600으로 둔다
사람들이 빠지는 배치(위험)
- 연동용 JSON 토큰이
public/에 놓임 - 보일러플레이트에 딸려 온 시크릿 파일이 공개된 채 남음
- 백업(
.sql/.bak)이나.git이 공개 디렉터리 아래에 남음 - 한 사이트만 고치고 "처리 완료"라고 함
올바른 배치
- 공개 디렉터리엔 공개해도 되는 것만
- 시크릿은 웹루트 밖에 권한 600으로
- 민감한 확장자는 서빙이 거부됨
- 하나 찾으면 모든 호스트와 사이트를 점검
'공개해도 안전한 것만'을 상시 규칙으로
규칙이 일회성 수정을 이깁니다. 공개 디렉터리는 공개 선반이라고 정하고, 규칙상 시크릿·백업·버전 관리 데이터(.git)·설정 파일을 절대 거기 두지 마세요. 보일러플레이트를 갱신할 때는 템플릿 자체에서 시크릿을 제거하세요 — 그렇지 않으면 앞으로 대량 생산하는 모든 사이트가 같은 구멍을 계속 복사합니다.
본 사이트는 직접 어떻게 하는가
본 사이트의 토대는 시크릿 — 키, 토큰, 접속 문자열 — 을 공개 디렉터리와 코드 저장소 양쪽에서 빼두는 것입니다. 배포 산출물에는 빌드된 공개 에셋만 들어가고, 시크릿은 서빙되지 않는 곳에 런타임 환경 변수로 보관합니다. 이유는: 이 글의 사고 부류가 전형적인 "잔여물 하나, URL 하나로 전부가 샌다"이기 때문입니다. 우리는 배치 자체를 접근 제어로 설계하고, 이 점검을 취약점 대응 인벤토리와 같은 주기로 돌립니다.
다음으로 읽기
- 스택: 공유 호스팅에서 .env 보호하기 · 취약점 대응 플레이북(인벤토리)
- 용어집: .env 파일과 시크릿 · 경로 순회
- 사고: .env 전체가 노출됨
- 보관: 시크릿을 안전하게 보관하기
FAQ
Q공개 디렉터리에 파일을 두는 게 왜 위험한가요?
웹 공개 디렉터리(웹루트 — public/, public_html/ 등)의 모든 것은 그 URL을 친 누구든 가져갈 수 있습니다. 남겨진 토큰/자격증명 JSON, .env, 백업, 키 파일은 아무도 눈치채기 전에 회수되어 즉각적 피해로 이어집니다. 공개 디렉터리에는 공개되어도 안전한 것만 두어야 합니다.
Q한 사이트에서 하나 찾으면 다른 사이트도 확인해야 하나요?
그렇습니다. 공유 템플릿이나 보일러플레이트로 사이트를 대량 생산한다면, 같은 잔여물이 보통 전부에 확산되어 있습니다. 하나 찾으면 같은 출처의 모든 사이트와 호스트를 점검하세요.
Q찾으면 무엇을 해야 하나요?
1) 웹루트에서 파일을 제거해 URL로 404가 나오게 합니다. 2) 샜을 수 있는 토큰이나 키를 갱신/폐기합니다(샜다고 가정). 3) 앞으로는 시크릿을 웹루트 밖에 권한 600(소유자 읽기만)으로 둡니다. 셋을 한 묶음으로 하세요.