Spring Boot (Java)
엔터프라이즈 Java 애플리케이션의 경우 ProxyTracer를 연동하는 가장 확실한 방법은 전역 HandlerInterceptor를 생성하는 것입니다. 이를 통해 모든 수신 HTTP 요청이 컨트롤러에 도달하기 전에 안전하게 검증됩니다.
인터셉터
이 코드는 로드 밸런서에서 IP를 안전하게 추출(X-Forwarded-For 처리)하고, Java의 기본 HttpClient를 사용하여 ProxyTracer를 호출한 뒤 위험이 감지되면 요청을 차단합니다.
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
@Component
public class ProxyTracerInterceptor implements HandlerInterceptor {
private static final String API_KEY = System.getenv("PROXYTRACER_API_KEY");
private final HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofMillis(500)) // 병목 현상을 방지하기 위한 엄격한 타임아웃
.build();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 로드 밸런서/NGINX 뒤의 실제 IP를 안전하게 추출
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.isEmpty()) {
ipAddress = request.getRemoteAddr();
} else {
ipAddress = ipAddress.split(",")[0].trim();
}
// 2. ProxyTracer API 쿼리
HttpRequest ptRequest = HttpRequest.newBuilder()
.uri(URI.create("https://api.proxytracer.com/v1/check/" + ipAddress))
.header("Authorization", "Bearer " + API_KEY)
.GET()
.build();
try {
HttpResponse<String> ptResponse = httpClient.send(ptRequest, HttpResponse.BodyHandlers.ofString());
if (ptResponse.statusCode() == 200) {
// 3. 단순 문자열 매칭 (빠른 속도를 위해 무거운 JSON 파싱 라이브러리 사용을 피함)
if (ptResponse.body().contains("\"proxy\": true") || ptResponse.body().contains("\"proxy\":true")) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.getWriter().write("{\"error\": \"Access Denied: VPN or Proxy detected.\"}");
response.setContentType("application/json");
return false; // 요청을 삭제합니다
}
}
} catch (Exception e) {
// Fail open: 오류를 기록하고 요청 통과 허용
System.err.println("ProxyTracer validation failed: " + e.getMessage());
}
// 4. 정상 트래픽인 경우 컨트롤러로 전달
return true;
}
}구성:
애플리케이션 전체에 적용하려면 WebMvcConfigurer 클래스에 이 인터셉터를 등록해야 합니다.
최종 수정일: