FastAPI(파이썬)
FastAPI는 고성능 비동기 웹 애플리케이션을 위해 구축되었습니다. 이러한 속도를 유지하기 위해 우리는 사용자 정의BaseHTTPMiddleware와 비동기 HTTP 클라이언트(httpx)를 사용하여 ProxyTracer를 통합하여 이벤트 루프가 차단되지 않도록 합니다.
미들웨어
이 구현은 실제 클라이언트 IP를 안전하게 추출하고 비동기 연결 풀을 활용하여 ProxyTracer를 쿼리하며 proxy 플래그가 true를 반환하는 경우 엄격한 403 Forbidden을 반환합니다.
import os
import httpx
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware
app = FastAPI()
class ProxyTracerMiddleware(BaseHTTPMiddleware):
def __init__(self, app):
super().__init__(app)
self.api_key = os.getenv("PROXYTRACER_API_KEY")
# 연결 풀링 및 빠른 속도를 위한 영구 비동기 클라이언트 초기화
self.client = httpx.AsyncClient(timeout=0.5) # 엄격한 500ms 타임아웃
async def dispatch(self, request: Request, call_next):
# 1. 로드 밸런서/프록시 뒤의 실제 IP를 안전하게 추출
forwarded_for = request.headers.get("x-forwarded-for")
if forwarded_for:
ip = forwarded_for.split(",")[0].strip()
else:
ip = request.client.host if request.client else None
# 로컬 개발 IP 건너뛰기
if ip and ip not in ["127.0.0.1", "::1", "testclient"]:
try:
# 2. ProxyTracer API 비동기 쿼리
response = await self.client.get(
f"https://api.proxytracer.com/v1/check/{ip}",
headers={"Authorization": f"Bearer {self.api_key}"}
)
if response.status_code == 200:
data = response.json()
# 3. 프록시가 감지되면 즉시 연결 차단
if data.get("proxy") is True:
return JSONResponse(
status_code=status.HTTP_403_FORBIDDEN,
content={"error": "Access Denied: VPN or Proxy detected."}
)
except httpx.RequestError as e:
# Fail open: 네트워크 오류를 기록하고 요청 진행 허용
print(f"ProxyTracer API timeout or failure: {e}")
# 4. 정상 트래픽인 경우 라우트 핸들러로 전달
return await call_next(request)
# 미들웨어를 전역으로 적용
app.add_middleware(ProxyTracerMiddleware)종속성 참고: 이 구현에는 비동기 HTTP 요청을 위한 httpx 라이브러리가 필요합니다. pip install httpx를 통해 설치하세요.
최종 수정일: