Kilho.net

Apache에서 GPTBot·Amazonbot·AhrefsBot의 게시판 이미지 요청 막기

관리하는 서버 중 한 대의 하루 전송량은 평소 약 12GB였다. 그런데 이날은 24GB를 넘었다. 로그를 따라가 보니 9월 26일 이후 들어오기 시작한 봇 세 개가 증가분 대부분을 차지했다.

게시글까지 막을 생각은 없었다. 세 봇이 받아 가는 무거운 이미지만 막으면 됐다. Apache에서 이미지 폴더를 기준으로 차단한 과정과 확인할 점을 적어 둔다.

로그에서 이미지 전송량이 늘어난 원인을 찾았다

GPTBot은 이날 이미지 4.95GB를 받아 갔다. Amazonbot은 3.31GB, AhrefsBot은 2.87GB였다. 세 봇이 요청한 게시판 본문 이미지는 모두 15,596개 파일에 걸쳐 있었다.

파일 중에는 10~23MB짜리 GIF도 여러 개 있었다. 이런 파일을 반복해서 내보내면 전송량이 빠르게 늘어난다. 이 수준이 이어지면 Lightsail의 월 전송 한도를 넘거나 서버가 느려질 수 있었다.

이 이미지 수집은 방문자나 검색 노출에 도움이 되지 않는다고 판단했다. 그래서 세 봇의 게시판 이미지 요청만 차단하기로 했다.

User-Agent가 일치하면 이미지 접근을 거절했다

봇은 요청 헤더의 User-Agent에 자기 이름을 넣는다. GPTBot 요청에는 다음처럼 이름과 버전이 들어 있었다.

Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.4; +https://openai.com/gptbot)

Apache 설정 파일을 하나 만들었다. 아래 경로는 실제 서버 경로 대신 예시로 바꾼 것이다. 다른 서버에 적용한다면 이미지가 저장된 실제 경로를 넣어야 한다.

# /etc/httpd/conf.d/bot-block.conf
<Directory "/var/www/example/forum/data">
    <If "%{HTTP_USER_AGENT} =~ /GPTBot|Amazonbot|AhrefsBot/">
        Require all denied
    </If>
</Directory>

User-Agent에 세 이름 중 하나가 들어 있으면 403을 돌려준다. 접근 권한 검사가 파일 전송보다 먼저 실행되므로 이미지 본문은 나가지 않는다. 20MB GIF 요청도 작은 403 응답으로 끝난다.

여러 도메인이 공유하는 폴더에 규칙을 걸었다

이 서버에서는 도메인 네 개가 같은 게시판 이미지 폴더를 쓴다. 도메인별 가상 호스트 설정에 규칙을 넣으면 네 곳을 각각 관리해야 한다. 한 곳을 빠뜨릴 가능성도 있다.

Apache의 Directory 설정은 요청에 사용한 도메인이 아니라 실제 파일 위치를 기준으로 적용된다. 공유 폴더에 규칙 하나를 두면 네 도메인으로 들어오는 해당 이미지 요청을 함께 막을 수 있다.

설정은 별도 파일로 뒀다. 나중에 규칙을 살피거나 되돌릴 때 해당 파일 하나를 찾으면 된다.

캐시가 권한 검사를 건너뛰지 않는지 확인했다

이 서버는 mod_cache로 이미지를 캐시한다. 캐시된 파일이 권한 검사보다 먼저 나가면 새 차단 규칙이 적용되지 않을 수 있다. 적용 전에 캐시 설정을 확인했다.

CacheQuickHandler Off

이 설정에서는 권한 검사가 캐시 응답보다 먼저 실행된다. 같은 규칙을 다른 서버에 옮길 때도 캐시 설정을 확인해야 한다. 설정이 다르면 봇 요청에 403 대신 이미지가 나갈 수 있다.

이미지 폴더 안에는 PHP 실행 파일을 막는 설정도 있었다. 새 규칙이 기존 설정과 충돌하지 않는지도 확인했다.

forum/data/.htaccess

설정을 다시 읽힌 뒤 응답 코드를 비교했다

먼저 Apache 설정 문법을 검사했다. 오류가 없다는 것을 확인한 뒤 서비스를 재시작하지 않고 설정만 다시 읽혔다.

apachectl -t
systemctl reload httpd

이어서 curl에서 User-Agent를 바꿔 이미지 요청을 보냈다. GPTBot, Amazonbot, AhrefsBot 요청은 403이었다. Googlebot과 일반 브라우저 요청은 200이었다.

직접 만든 요청만으로 확인을 끝내지 않았다. 실제 접근 로그에서도 세 봇의 이미지 요청이 403을 받는지 확인했다.

게시글과 일반 방문자의 이미지 접근은 유지했다

이번 규칙은 게시판 이미지 폴더에만 걸었다. 세 봇은 게시글 페이지를 계속 읽을 수 있다. 글 내용의 AI 검색·답변 노출은 유지하고 무거운 이미지 전송만 막은 셈이다.

Googlebot과 Bingbot도 차단 대상에 넣지 않았다. 일반 방문자의 이미지 요청 역시 그대로 처리된다. 검색과 방문자 이용에 필요한 경로는 유지하려는 판단이었다.

만약 특정 도메인에서만 이미지가 계속 내려온다면 실제 파일 경로를 확인해야 한다. 도메인들이 서로 다른 폴더를 쓰는 환경에서는 이번처럼 규칙 하나로 모두 처리되지 않는다.

요청이 계속 들어오면 추가 차단 범위를 판단해야 한다

User-Agent는 요청을 보내는 쪽에서 바꿀 수 있다. 브라우저인 척하는 수집기는 이번 규칙으로 걸러지지 않는다. 그런 요청이 늘면 IP 대역이나 Cloudflare 규칙을 검토해야 한다.

403으로 응답해도 봇의 요청 자체는 계속 들어올 수 있다. 요청 수까지 줄이려면 robots.txt에서 세 봇의 이미지 경로 접근을 따로 제한할 수 있다. 다른 검색 봇의 이미지 접근까지 막지 않도록 대상을 지정해야 하며, 이번에는 적용하지 않았다.

GPTBot의 게시판 목록 크롤링도 이번 작업 범위 밖이다. 그 요청은 하루 약 1.6GB를 쓰고 CPU 부하도 만든다. 우선 전송량이 큰 이미지 요청을 막았고, 목록 요청은 별도로 살펴볼 문제로 남겨 뒀다.

Comments

Tips & Tech

Linux Apache에서 GPTBot·Amazonbot·AhrefsBot의 게시판 이미지 …
Others Midjourney, DALL·E, ChatGPT에서 Y2K 파스텔 UI 프롬프트…
Linux Cloudflare R2 자동 업로드 구성하기. 특정 폴더에 파일만…
WordPress 워드프레스 7.0 관리자 링크 색상 변경 후 이전 색상으로 …
WordPress 캐시 환경에서 AJAX 댓글(코멘트) 분리로 서버 응답시간 …
Linux 아파치 일반 계정 파일 접근 권한 설정과 mod-ruid2 적용 …
Delphi Delphi IDE 메인 폼 안열림 dproj 설정으로 해결
Dev tips VSCode 한국어 설정법, Configure Display Language로 UI …
Others RustDesk 자체 서버 구축으로 공용 서버 로그인 문제 해결
Linux Dante SOCKS5 프록시 서버 구축 및 설정
Windows 윈도우 실행파일(exe) 서비스 등록 자동화 쉽게 하는 방법…
Others CLIProxyAPI Windows 설치 가이드
WordPress 그누보드7 데이터를 WordPress WXR로 변환하기
Others Ollama 설치 경로 C드라이브 고정 문제 해결 및 드라이브 …
Dev tips Apache Access Log 기반 도메인별 방문자 카운터 구현
Windows ZImage AI 이미지 생성 환경 구축 방법
Windows 파일 복사 후 실행 배치파일 - 에러 감지 포함
Dev tips 네이버 검색 Open API
Dev tips 네이버 검색광고 키워드 도구 API 검색
Dev tips MariaDB column_stats 테이블 오류 해결 방법
Dev tips PHP-FPM 에러 로그 실시간 모니터링
Windows 윈도우11 업데이트 후 네트워크 드라이브 접근 불가 문제 …
Dev tips 다국어 번역 함수 구현 방법
WordPress "치명적인 오류가 발생했습니다" 디버깅 가이드
Linux Apache 웹 로그 분석하기 – awk와 GoAccess 활용
Kilho.net 칼무리 - 외부 명령으로 캡처 자동화하기
Windows 윈도11 강제업데이트 피하고 윈도10 계속 쓰기
Linux PHP 파일 업로드 용량 늘리기
Dev tips 애드센스 충돌 문제 해결하기
Python Python Playwright로 Edge 브라우저 제어하기