Skip to Content

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 클래스에 이 인터셉터를 등록해야 합니다.

최종 수정일: