기술 스택 노출(핑거프린팅)은 응답 헤더·정적 파일·에러 페이지가 서버에서 돌아가는 프레임워크와 정확한 버전을 외부에 알려주는 정보 노출 결함이다.
그 자체로 데이터가 새지는 않지만, 공격자의 정찰 비용을 0으로 만든다. 버전을 알면 그 버전에 해당하는 공개 익스플로잇만 골라 쓰면 되기 때문이다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. 버전이 노출되는 게 왜 취약점인가요? A. 공격자는 취약점을 찾는 것이 아니라 이미 알려진 취약점에 맞는 대상을 찾습니다. 버전이 보이면 무차별 시도 없이 해당 버전용 공개 익스플로잇 하나만 쏘면 되므로, 정찰 단계가 통째로 생략됩니다. Q. 소스맵(.map)을 배포하면 뭐가 문제인가요? A. 소스맵은 난독화된 번들을 원본 코드로 되돌립니다. 내부 API 경로, 주석, 미사용 관리자 기능, 하드코딩된 상수까지 그대로 복원되므로 사실상 소스 공개와 같습니다. Q. 헤더만 지우면 핑거프린팅이 막히나요? A. 막히지 않습니다. 헤더는 가장 쉬운 경로일 뿐이고 쿠키 이름, 404 페이지의 기본 문구, 정적 경로 규칙(/_next/, /_nuxt/) 같은 구조적 시그니처로도 식별됩니다. 헤더 제거는 최소 조치이고, 핵심은 버전 자체를 최신으로 유지하는 것입니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | X-Powered-By·Server 헤더에 제품명과 버전을 그대로 노출 | 높음 |
| 2 | 프로덕션 번들에 소스맵(.map) 동봉 배포 — 원본 코드 복원 가능 | 치명 |
| 3 | package.json·composer.lock 등 의존성 파일이 웹 루트에서 접근 가능 | 치명 |
| 4 | 기본 에러 페이지 방치 — 프레임워크 시그니처와 스택 트레이스 노출 | 높음 |
| 5 | CMS·플러그인의 readme.txt·CHANGELOG가 정확한 버전을 공개 | 중간 |
| 6 | 버전 헤더만 숨기고 실제 구버전은 그대로 운영 — 보안이 아니라 은폐 | 높음 |
표준 구현 코드
# nginx — 제품 버전 토큰 제거 + 백엔드가 흘린 헤더 차단
server_tokens off;
proxy_hide_header X-Powered-By;
proxy_hide_header X-AspNet-Version;
add_header X-Content-Type-Options nosniff always;
# 의존성·메타 파일은 웹에서 아예 닫는다
location ~* /(package(-lock)?\.json|composer\.(json|lock)|yarn\.lock|readme\.txt|CHANGELOG.*)$ {
deny all;
}
# 소스맵 차단 (빌드에서 안 만드는 것이 우선, 이건 2차 방어)
location ~* \.map$ { deny all; }
핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.
30초 자가진단
# 1) 응답 헤더에 제품/버전이 있는가
curl -sI https://example.com | grep -iE 'server|x-powered-by|x-aspnet|x-generator'
# 2) 소스맵이 배포됐는가 (200이면 결함)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/static/js/main.js.map
# 3) 의존성 파일이 열려 있는가
for f in package.json composer.lock yarn.lock readme.txt; do
printf '%s ' "$f"; curl -s -o /dev/null -w '%{http_code}\n' "https://example.com/$f"
done
위 시그널이 발견되면 결함이다. Invicti — 웹 기술 탐지·핑거프린팅 문서를 함께 참조하라.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | 소스맵 프로덕션 배포 중단 — 빌드 설정에서 생성 자체를 끄고, 이미 올라간 .map 파일 삭제 |
| 2 | 웹 루트에서 접근 가능한 의존성·메타 파일(package.json, readme.txt 등) 차단 |
| 3 | server_tokens off + proxy_hide_header로 제품/버전 헤더 제거 |
| 4 | 기본 에러 페이지를 커스텀 페이지로 교체 (프레임워크 시그니처·스택 트레이스 제거) |
| 5 | 노출됐던 버전이 현재 최신인지 확인 — 구버전이면 헤더 숨김이 아니라 업그레이드가 조치다 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.