유출된 비밀 스캐너
유출된 비밀 스캐너는 절대 공개되어서는 안 되는 파일과 자격 증명이 누구나 웹사이트에서 가져갈 수 있는 상태인지 확인합니다. 데이터베이스 비밀번호가 담긴 .env 파일, 소스 기록 전체를 넘겨주는 .git 폴더, 웹 루트에 남겨진 백업 아카이브, JavaScript 번들 속의 실제 API 키 등이 해당합니다. URL을 입력하면 이 스캐너는 알려진 노출 경로를 탐색하고, 응답한 것들의 내용을 검증하며, 페이지와 스크립트에서 알려진 비밀 패턴을 찾습니다. 표시되는 것은 마스킹된 값뿐이며 비밀 자체는 절대 표시되지 않습니다. 동반 가이드인 노출된 .env 파일과 유출된 키는 이런 노출이 어떻게 발생하는지, 그리고 파일을 삭제하는 것만으로는 절대 충분하지 않은 이유를 설명합니다. 응답 강화에는 보안 헤더 검사와, 다른 곳에서 불러오는 스크립트에는 타사 스크립트 감사를 함께 사용하세요.
마지막 업데이트:
계속 감시하고 싶으신가요? myeventwatch로 무료 감시 — 만료 및 중단 알림, 카드 불필요.
노출로 간주되는 것 — 간주되지 않는 것
스캐너는 공개된 알려진 경로 목록 — /.env와 그 흔한 변형, /.git/HEAD와 /.git/config, 설정 파일, 백업 아카이브, 키 파일 — 을 공격자, 검색 엔진, 호기심 많은 방문자가 보낼 수 있는 것과 똑같은 평범한 공개 GET 요청으로 탐색합니다. 경로는 응답 내용이 그 파일이 실제로 어떤 모습이어야 하는지와 일치할 때만 노출로 간주됩니다. env 파일은 키-값 줄로 파싱될 수 있어야 하고, Git HEAD는 Git 참조처럼 보여야 합니다. 많은 서버는 모든 경로에 200으로 응답합니다 — 단일 페이지 앱 폴백, 맞춤 오류 페이지, 포괄 리라이트 등 — 그리고 홈페이지 HTML이 담긴 200은 유출이 아닙니다. 그런 경로는 결과에 응답했지만 확인되지 않음으로 따로 나열되어 직접 판단할 수 있습니다. 이 도구는 확인되지 않은 200을 절대 유출이라고 부르지 않으며, 어떤 스캐너를 사용하든 그래서는 안 됩니다.
파일 탐색과 함께 스캐너는 페이지 자체와 최대 약 열다섯 개의 JavaScript 번들을 가져와 알려진 비밀 형태를 찾습니다. 클라우드 액세스 키 ID, 개인 키 헤더, 일반적인 API 키와 토큰 할당, 데이터베이스 연결 문자열 같은 신호가 강한 패턴입니다. 클라이언트 측 코드는 정의상 공개입니다 — 브라우저로 전송된 것은 모든 방문자가 읽을 수 있습니다 — 따라서 어떤 파일도 잘못 구성되지 않았더라도 번들에서 발견된 실제 자격 증명은 노출된 것입니다. 발견 사항은 유형, 소스 파일, 발생 횟수별로 보고되며 값은 처음 최대 네 문자까지 마스킹됩니다. 어떤 키인지 알아보기에는 충분하지만, 보고서를 읽는 사람이 그것을 사용하기에는 절대 부족합니다. 완전한 비밀은 이 보고서로 가져오거나, 저장하거나, 표시하는 일이 절대 없습니다.
한계, 분명히 말합니다
이것은 알려진 경로에 대한 공개 읽기 전용 탐색이며, 그 한계는 결과의 일부입니다. 공개 목록에 있는 경로만 요청하므로 특이한 이름의 파일에 있는 비밀은 찾지 못합니다. 랜딩 페이지와 약 열다섯 개의 스크립트 번들을 스캔할 뿐 큰 사이트의 모든 자산을 스캔하지 않으며, 로그인하지 않고, 인증 뒤를 크롤링하지 않고, 파일명을 무차별 대입하지 않으며, 인증되지 않은 GET으로 원래 닿을 수 없는 것은 테스트하지 않습니다. 스캔은 방문자당 시간당 5회로 제한되고 결과는 10분 동안 캐시되므로, 그 시간 안에 다시 스캔하면 캐시된 판정이 표시될 수 있습니다. 스캔에는 시간 예산도 있습니다. 느린 대상이 이를 소진하면 결과는 부분으로 표시되고 그 사실을 밝힙니다. 부분적인 깨끗한 결과는 "깨끗함"이 아니라 "완전히 확인되지 않음"으로 취급하세요.
스캔에서 무언가 발견되면 삭제 속도보다 작업 순서가 더 중요합니다. 복사본이 이미 캐시, 아카이브, 타인의 손에 있을 수 있으므로, 먼저 자격 증명을 교체하세요 — 노출된 키를 폐기하고 새 키를 발급하세요. 파일을 삭제하면 새 다운로드만 멈출 뿐 이미 나간 키에는 아무 효과가 없습니다. 그런 다음 서버에서 파일을 제거하거나 경로를 차단하고, 복사본을 보유했을 수 있는 CDN과 프록시 캐시를 비우며, 같은 경로에 대한 이전 가져오기가 있는지 액세스 로그를 확인하세요. 동반 글인 노출된 .env 파일과 유출된 키는 공격자가 사용하는 첫 한 시간의 절차와 전체 복구 순서를 차례대로 안내합니다.
이웃 검사가 전체 그림을 완성합니다. 타사 스크립트 감사는 페이지가 불러오는 외부 스크립트를 다루며 — 이는 자신의 파일 유출과는 다른 공급망 위험입니다 — 보안 헤더 검사는 응답이 갖춘 브라우저 보호를 평가합니다. 방법에 대한 참고: 깨끗한 결과란 스캔 시점에 검사기의 네트워크 위치에서 볼 때 탐색한 경로 중 어느 것도 일치하는 내용으로 응답하지 않았고, 스캔한 파일에 알려진 비밀 패턴이 나타나지 않았다는 뜻입니다. 이는 해당 경로와 파일에 대한 증거이지 서버 전체에 대한 보증이 아닙니다. 애초에 파일을 웹 루트 밖에 두고, 서버가 게시하는 내용에 닿는 배포 변경이 있을 때마다 다시 스캔하세요.
공개된 탐색 목록
| /.env와 변형 | 데이터베이스 비밀번호, 메일 자격 증명, API 키를 담고 있는 환경 파일(.env, .env.local, .env.production 등). 본문이 키-값 줄로 파싱될 때만 확인됩니다. |
| /.git/HEAD와 /.git/config | 제공되는 .git 폴더는 저장소를 드러냅니다. HEAD는 구조를 증명하고 config는 대개 원격을 명시합니다. 둘이 함께 있으면 전체 소스 기록을 보통 재구성할 수 있습니다. |
| 설정 파일 | 평문 자격 증명을 담고 있는 알려진 설정 경로(예: wp-config 백업, config.php 복사본, 프레임워크 설정 파일). |
| 백업 및 아카이브 파일 | 웹 루트에 남겨진 데이터베이스 덤프, .zip / .tar.gz 사이트 아카이브, 편집기 백업 복사본 — 자격 증명을 포함해 사이트의 완전한 복사본인 경우가 많습니다. |
| 키 및 인증서 파일 | 절대 웹으로 접근할 수 있어서는 안 되는 개인 키 형태의 파일(.pem, .key, id_rsa 식 이름). 제공되는 개인 키는 그 자체로 심각한 발견입니다. |
| JavaScript 번들 | 페이지와 최대 약 15개의 스크립트 번들에서 클라우드 키 ID, 개인 키 헤더, 토큰 할당, 연결 문자열을 검색합니다. 값은 처음 최대 네 문자까지 마스킹됩니다. |
| 확인 규칙 | 탐색은 응답 내용이 예상되는 파일 형태와 일치할 때만 노출로 간주됩니다. 맨 200은 응답했지만 확인되지 않음으로 나열되며 유출로 보고되는 일은 절대 없습니다. |
| 예산과 캐싱 | 공개 GET 탐색만, 읽기 전용, 방문자당 시간당 5회 스캔, 결과 10분 캐시. 시간 예산을 소진한 스캔은 부분으로 표시됩니다. |
자주 묻는 질문
스캔에서 경로가 "응답했지만 확인되지 않음"이라고 합니다. 유출인가요?
이 증거로는 아닙니다. 해당 경로가 HTTP 200으로 응답했지만 내용이 탐색하던 파일의 형태와 일치하지 않았다는 뜻입니다. 흔한 원인은 모든 URL에 홈페이지나 앱 셸로 응답하는 포괄 경로 또는 폴백 페이지입니다. 비공개 창에서 직접 해당 경로를 열어 실제로 무엇이 돌아오는지 보세요. 실제 파일 내용이 보이면 노출로 취급하고, 평소처럼 사이트가 보이면 폴백입니다.
스캐너가 제 키 중 하나를 찾았습니다. 먼저 무엇을 해야 하나요?
다른 무엇보다 먼저 교체하세요 — 노출된 자격 증명을 폐기하고 대체품을 발급하세요. 공개 파일의 복사본은 캐시, 아카이브, 스캐너 데이터베이스로 빠르게 빠져나가므로 파일을 삭제해도 키가 "유출 취소"되지 않습니다. 그런 다음 파일을 제거하거나 차단하고, CDN과 프록시 캐시를 비우고, 해당 경로의 액세스 로그를 검토하며, 같은 자격 증명이 다른 곳에 사용되지 않았는지 확인하세요.
스캐너가 찾은 완전한 비밀을 저장하거나 표시하나요?
아닙니다. 검사기는 비밀 유형, 발견된 파일, 발생 횟수를 보고하며 값은 처음 최대 네 문자까지 마스킹합니다 — 어떤 자격 증명인지 식별하기에는 충분하지만 사용하기에는 절대 부족합니다. 보고서에는 훔칠 가치가 있는 것이 의도적으로 들어 있지 않습니다. 유출 보고서가 두 번째 유출이 되어서는 안 되기 때문입니다.
스테이징 사이트나 로그인 뒤의 페이지를 스캔할 수 있나요?
아닙니다. 스캐너는 인증되지 않은 공개 GET 요청만 보내므로 로그인, VPN, IP 허용 목록 뒤에 있는 모든 것은 닿을 수 없습니다 — 의도된 것입니다. 이 도구가 답하는 질문은 인터넷의 낯선 사람이 무엇을 가져갈 수 있는가이기 때문입니다. 이 사이트 자체의 인프라 주소를 포함한 차단 대상은 단호히 거부됩니다.
왜 제 결과는 캐시되었거나 부분적인가요?
결과는 10분 동안 캐시되어 반복 검사를 저렴하게 유지하고 대상 서버에 예의 바른 손님이 되게 합니다. 결과에는 캐시 여부가 명시됩니다. 부분 결과란 스캔이 모든 탐색을 마치기 전에 시간 예산에 도달했다는 뜻입니다 — 보통 느린 대상이나 큰 번들이 많은 경우입니다 — 배너가 그 사실을 알리며, 부분적인 깨끗한 결과는 완전히 깨끗하다고 믿기보다 다시 실행해야 합니다.