웹 크롤러(예: Googlebot, Bingbot 등)는 HTTP 요청 시 User-Agent 헤더를 포함하지만, 이는 쉽게 조작할 수 있습니다. 따라서 보다 신뢰할 수 있는 방법은 역방향 DNS 조회(Reverse DNS Lookup) 를 이용하여 요청한 IP 주소가 실제로 해당 크롤러의 공식 도메인에서 온 것인지 확인하는 것입니다.
1. 역방향 DNS 조회 개념
• 웹 크롤러가 사이트를 방문하면 요청의 IP 주소가 서버 로그에 기록됩니다.
• 해당 IP 주소의 도메인을 확인하기 위해 역방향 DNS 조회(reverse DNS lookup, rDNS) 를 수행합니다.
• 얻어진 도메인이 공식 크롤러 도메인(googlebot.com, bing.com 등)인지 확인합니다.
• 다시 해당 도메인으로 정방향 DNS 조회(forward DNS lookup)를 수행하여 원래 IP와 일치하는지 확인합니다.
→ 이렇게 하면 IP 스푸핑을 방지할 수 있습니다.
2. 역방향 DNS 조회 과정
(1) 클라이언트 IP 확인
• 웹 서버에서 크롤러의 IP 주소를 로그에서 확인합니다.
66.249.66.1 - - [19/Feb/2025:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 -
위의 66.249.66.1이 크롤러의 IP 주소입니다.
(2) 역방향 DNS 조회 (Reverse DNS Lookup)
• IP 주소에 대한 호스트명을 확인합니다.
nslookup 66.249.66.1
출력 예시:
Name: crawl-66-249-66-1.googlebot.com
Address: 66.249.66.1
googlebot.com 도메인을 포함하고 있으므로 Googlebot일 가능성이 높습니다.
(3) 정방향 DNS 조회 (Forward DNS Lookup)
• 역방향 DNS 조회만으로는 신뢰할 수 없으므로, 얻어진 도메인(crawl-66-249-66-1.googlebot.com)을 다시 정방향 DNS 조회하여 원래의 IP와 일치하는지 확인합니다.
nslookup crawl-66-249-66-1.googlebot.com
출력 예시:
Name: crawl-66-249-66-1.googlebot.com
Address: 66.249.66.1
• 여기서 다시 원래의 IP 주소(66.249.66.1)가 반환되면 진짜 Googlebot입니다.
• 만약 다른 IP가 반환되거나 조회가 실패하면 가짜 크롤러(스푸핑된 봇) 일 가능성이 높습니다.
3. Python으로 역방향 DNS 조회 자동화
• 아래 Python 코드를 사용하면 요청한 크롤러의 IP가 실제 Googlebot 또는 Bingbot인지 확인할 수 있습니다.
import socket
def is_valid_bot(ip, valid_domains):
try:
# 1. 역방향 DNS 조회 (Reverse Lookup)
host = socket.gethostbyaddr(ip)[0] # IP 주소 → 도메인 확인
print(f"Reverse Lookup: {ip} → {host}")
# 2. 도메인이 공식 크롤러 도메인인지 확인
if not any(host.endswith(domain) for domain in valid_domains):
print("Invalid bot: Domain mismatch")
return False
# 3. 정방향 DNS 조회 (Forward Lookup)
verified_ip = socket.gethostbyname(host) # 도메인 → IP 주소 확인
print(f"Forward Lookup: {host} → {verified_ip}")
# 4. 원래 IP와 비교
return verified_ip == ip
except Exception as e:
print(f"Error: {e}")
return False
# 테스트할 크롤러 IP
test_ip = "66.249.66.1" # Googlebot 예제 IP
# 공식 크롤러 도메인 목록
valid_bot_domains = ["googlebot.com", "bing.com"]
if is_valid_bot(test_ip, valid_bot_domains):
print(f"{test_ip} is a valid bot!")
else:
print(f"{test_ip} is NOT a valid bot!")
4. 주요 검색 엔진 크롤러의 공식 도메인
• 아래 도메인을 역방향 DNS 조회 결과에서 확인하면 해당 크롤러가 진짜인지 판별할 수 있습니다.
검색 엔진 | 공식 크롤러 도메인 |
Googlebot | googlebot.com |
Bingbot | bing.com |
Yahoo Slurp | crawl.yahoo.net |
Baidu Spider | baidu.com |
YandexBot | yandex.ru |
5. 자동화하여 서버에서 크롤러 차단
• 서버에서 nginx 또는 Apache 설정을 통해 정식 크롤러가 아닌 봇을 차단할 수 있습니다.
(1) Nginx에서 크롤러 차단
map $remote_addr $is_bot {
default 0;
"66.249.66.1" 1; # Googlebot IP 예제
}
server {
location / {
if ($is_bot = 0) {
return 403;
}
}
}
• 66.249.66.1과 같이 확인된 IP만 허용하고, 나머지는 403 Forbidden 응답.
(2) Apache에서 크롤러 차단
.htaccess에서 특정 크롤러 차단:
RewriteEngine On
RewriteCond %{REMOTE_HOST} !googlebot\.com$ [NC]
RewriteCond %{REMOTE_HOST} !bing\.com$ [NC]
RewriteRule .* - [F]
• googlebot.com, bing.com이 아닌 크롤러의 요청을 차단.
관련 블로그
robots.txt 파일을 이용한 웹 크롤링 여부 판단
robots.txt 파일을 사용하여 웹 크롤러(특히 Googlebot 등 검색 엔진 크롤러)가 사이트를 크롤링하는지 확인하는 방법은 다음과 같습니다.1. robots.txt 파일의 위치 • 웹사이트의 robots.txt 파일은 항상
make2t.tistory.com
HTTP 헤더 정보를 통한 웹 크롤러 여부 판단
웹 서버는 HTTP 헤더 정보를 활용하여 클라이언트가 웹 크롤러인지 아닌지를 판단할 수 있습니다. 이를 위한 주요 방법들은 다음과 같습니다.1. User-Agent 확인 • 대부분의 웹 크롤러는 User-Agent
make2t.tistory.com
'IT > WEB, WAS' 카테고리의 다른 글
HTTP 헤더 정보를 통한 웹 크롤러 여부 판단 (0) | 2025.02.23 |
---|---|
제우스 WAS에서 역방향 DNS 조회로 크롤러 필터링 적용하는 방법 (1) | 2025.02.20 |
JSON Web Token(JWT) (1) | 2025.02.18 |
http 307 에러 원인 및 조치 방법 (1) | 2025.02.13 |
소셜 로그인 (0) | 2025.02.04 |