제우스 WAS는 TmaxSoft의 Java EE 기반 애플리케이션 서버로, 필터(Filter) 또는 인터셉터(Interceptor)를 활용하여 Googlebot 등 공식 검색 엔진 크롤러를 판별하고 비공식 크롤러를 차단할 수 있습니다.
역방향 DNS 조회 적용 순서
1. 클라이언트 요청을 인터셉트 (Servlet Filter 활용)
2. 클라이언트 IP 확인
3. 역방향 DNS 조회 수행 (IP → 도메인)
4. 도메인이 공식 크롤러 도메인(googlebot.com, bing.com 등)인지 검증
5. 정방향 DNS 조회 수행 (도메인 → IP)
6. IP 주소가 원래 요청한 IP와 일치하는지 확인
7. 검증 실패 시 요청 차단 (403 Forbidden 반환)
JEUS WAS에 적용하는 방법
• 제우스 WAS는 Java EE 기반이므로 Servlet Filter를 구현하여 전역 필터로 적용하는 것이 가장 효과적입니다.
(1) Java Servlet Filter 구현
• 다음 필터(Filter)는 web.xml 또는 @WebFilter를 이용하여 등록할 수 있습니다.
• 필터 클래스 (ReverseDNSFilter.java)
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ReverseDNSFilter implements Filter {
// 공식 크롤러 도메인 목록
private static final String[] VALID_BOT_DOMAINS = {"googlebot.com", "bing.com"};
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String clientIp = httpRequest.getRemoteAddr();
if (isValidBot(clientIp)) {
chain.doFilter(request, response); // 정상적인 크롤러라면 요청 계속 진행
} else {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
}
}
@Override
public void destroy() {}
private boolean isValidBot(String ip) {
try {
// 1. 역방향 DNS 조회 (IP → 도메인 확인)
InetAddress addr = InetAddress.getByName(ip);
String hostName = addr.getCanonicalHostName();
System.out.println("Reverse Lookup: " + ip + " → " + hostName);
// 2. 도메인이 공식 크롤러 도메인인지 확인
for (String domain : VALID_BOT_DOMAINS) {
if (hostName.endsWith(domain)) {
// 3. 정방향 DNS 조회 (도메인 → IP 확인)
InetAddress verifiedAddr = InetAddress.getByName(hostName);
System.out.println("Forward Lookup: " + hostName + " → " + verifiedAddr.getHostAddress());
// 4. 원래 IP와 비교하여 검증
return verifiedAddr.getHostAddress().equals(ip);
}
}
} catch (UnknownHostException e) {
System.out.println("DNS Lookup Failed: " + e.getMessage());
}
return false;
}
}
(2) JEUS WAS에 필터 등록
• 제우스 WAS는 web.xml을 사용하여 필터를 등록할 수 있습니다.
• 방법 1: web.xml 설정 (JEUS 기본 방식)
Jeus WAS의 web.xml 파일(WEB-INF/web.xml)에 아래 내용을 추가합니다.
<filter>
<filter-name>ReverseDNSFilter</filter-name>
<filter-class>com.example.ReverseDNSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ReverseDNSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
• url-pattern을 /*로 설정하면 모든 요청에 대해 크롤러 검사를 수행합니다.
• com.example.ReverseDNSFilter는 패키지 경로에 맞게 변경해야 합니다.
• 방법 2: @WebFilter 어노테이션 사용 (Java EE 6 이상)
• JEUS WAS 8 이상에서는 @WebFilter 어노테이션을 지원하므로, web.xml을 수정하지 않고 직접 Java 코드에서 필터를 설정할 수도 있습니다.
import javax.servlet.annotation.WebFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
@WebFilter("/*")
public class ReverseDNSFilter implements Filter {
// 동일한 코드 사용
}
• @WebFilter("/*") → 모든 요청을 필터링
3. JEUS WAS에서 테스트 및 적용
1) DNS 조회 테스트
• 위의 Java 코드가 정상적으로 동작하는지 확인하기 위해 로컬 또는 JEUS WAS 서버에서 다음 테스트를 수행합니다
public class ReverseDNSTest {
public static void main(String[] args) {
String testIp = "66.249.66.1"; // Googlebot 테스트 IP
try {
InetAddress addr = InetAddress.getByName(testIp);
System.out.println("Reverse Lookup: " + testIp + " → " + addr.getCanonicalHostName());
InetAddress verifiedAddr = InetAddress.getByName(addr.getCanonicalHostName());
System.out.println("Forward Lookup: " + addr.getCanonicalHostName() + " → " + verifiedAddr.getHostAddress());
if (verifiedAddr.getHostAddress().equals(testIp)) {
System.out.println("✅ 유효한 크롤러입니다.");
} else {
System.out.println("❌ 가짜 크롤러입니다.");
}
} catch (UnknownHostException e) {
System.out.println("DNS 조회 실패: " + e.getMessage());
}
}
}
• Googlebot, Bingbot의 실제 IP를 입력하여 테스트 수행
• googlebot.com 또는 bing.com 도메인이 출력되면 정상
• 다른 도메인이거나 DNS 조회가 실패하면 가짜 크롤러(스푸핑된 봇) 일 가능성 있음
4. 크롤러 차단 정책 설정
• 위의 필터를 적용한 후, 추가적인 차단 정책을 적용할 수 있습니다.
• IP 차단 목록 적용 (비정상적인 크롤러 차단)
JEUS jeus.conf에서 특정 IP 차단
$JEUS_HOME/configs/jeus.conf 파일을 수정하여 특정 IP 차단 가능
deny_ip = 192.168.1.100 # 특정 IP 차단
deny_ip_range = 203.0.113.0/24 # 특정 IP 대역 차단
'IT > WEB, WAS' 카테고리의 다른 글
robots.txt 파일을 이용한 웹 크롤링 여부 판단 (0) | 2025.02.23 |
---|---|
HTTP 헤더 정보를 통한 웹 크롤러 여부 판단 (0) | 2025.02.23 |
역방향 DNS 조회(Reverse DNS Lookup)로 웹 크롤링 확인하는 방법 (0) | 2025.02.20 |
JSON Web Token(JWT) (1) | 2025.02.18 |
HTTP 429 Too Many Requests 오류 (2) | 2025.02.15 |