SameOS ~/tools/new-domain-bot-scanners.md

새 도메인을 열자마자 봇이 찾아오는 이유

작성일 2026-07-06 · SameOS Tools

최근 새 도메인으로 사이트를 하나 열었습니다. 어디에도 주소를 공개하지 않았고 검색엔진 색인도 막아 둔 상태였는데, 몇 시간 만에 처음 보는 봇들이 접속 기록에 나타났습니다. .env(비밀번호·접속 정보 같은 설정을 담는 파일), Dockerfile, 설정 파일 경로를 차례로 찔러 보는 전형적인 취약점 스캐너였습니다. 이 글은 봇이 새 사이트를 어떻게 찾아내는지, 그리고 개인 서버가 무엇을 준비해야 하는지 정리합니다.

숨긴 적 없는 비밀, 인증서 투명성 로그

봇이 새 도메인을 찾는 경로는 생각보다 단순합니다. HTTPS 인증서는 발급되는 순간 인증서 투명성(Certificate Transparency) 로그라는 공개 장부에 기록되고, 누구나 실시간으로 구독할 수 있습니다. 스캐너들은 이 장부를 지켜보다가 새 도메인이 등장하면 즉시 방문합니다. 즉 인증서가 붙은 사이트는 공개 여부와 무관하게 몇 시간 안에 발각된다고 보는 것이 맞습니다.

도착한 스캐너가 찾는 것은 노출된 비밀입니다. .env 파일, 백업 파일, .git 폴더, 설정 스크립트처럼 웹 루트에 실수로 남은 파일들이 대상입니다. 막을 방법은 없고, 찔러도 나올 것이 없게 만드는 것이 유일한 대응입니다.

개인 서버가 준비할 것

첫째, 정적 파일 서빙을 화이트리스트(허용 목록에 올린 것만 내주는 방식)로 좁힙니다. "존재하는 파일은 다 내준다"가 기본값인 서버 구성이 많은데, 저도 점검 과정에서 데이터 파일이 다운로드 가능한 상태였던 것을 발견하고 CSS·이미지 폴더와 지정한 루트 파일만 내주도록 바꿨습니다. 둘째, IP당 요청 속도 제한을 둬서 과열 스캔을 자동으로 끊습니다. 셋째, CDN(방문자와 서버 사이에서 요청을 대신 받아 주는 중계망)을 쓴다면 봇 차단 기능을 켜 두면 상당수가 서버에 도달하기 전에 걸러집니다.

실전 예제 코드

// PHP 내장 서버 라우터: 정적 파일은 화이트리스트만 서빙
// ("존재하면 다 내준다" 기본값이 사고의 근원)
$real = realpath(__DIR__ . $path);   // ../ 경로 탈출 무력화
if ($real !== false && is_file($real) && !str_ends_with($real, '.php')) {
    $okRoot   = in_array($path, ['/favicon.ico', '/robots.txt'], true)
                && dirname($real) === __DIR__;
    $okAssets = str_starts_with($real, __DIR__ . '/assets/');
    if ($okRoot || $okAssets) {
        return false;   // 이 두 경우만 정적으로 서빙
    }
}
// 그 외는 전부 라우터 → 404 (데이터·로그·백업 노출 차단)

// IP당 속도 제한: 5분 창에서 임계치를 넘으면 429
$stmt = $db->prepare(
    "SELECT COUNT(*) FROM visits
     WHERE ip = ? AND ts > datetime('now', '-300 seconds')"
);
$stmt->execute([$clientIp]);
if ((int)$stmt->fetchColumn() > $limit) {
    http_response_code(429);
    header('Retry-After: 300');
    exit('Too Many Requests');
}

중요한 것은 이런 스캔이 "공격받고 있다"는 신호가 아니라 인터넷의 평상시 배경 소음이라는 점입니다. 접속 기록을 남겨 두면 무엇이 왔다 갔는지 확인할 수 있고, 이상 징후는 웹훅(외부 프로그램이 메신저 채널로 메시지를 보내게 해 주는 전용 주소) 알림으로 받아보면 마음이 편합니다. 비공개 파일을 라우터 뒤로 숨기는 구조는 별도 글에서 다루고 있습니다.

GitHub에서 예제 코드 보기 · View example on GitHub →

비공개 파일 보호 글 보기 서버 상태 웹훅 알림 글 보기