본문으로 건너뛰기

forwarder

forwarder는 Playwright 기반 세션 유지형 포워드 프록시 모듈입니다. requestKey로 허용된 대상만 호출하며, 사용자별 브라우저 컨텍스트와 SQLite 세션 저장소를 사용해 쿠키, localStorage, IndexedDB 상태를 유지합니다.

책임 범위

  • ForwardUrls에 등록된 requestKey를 실제 target URL로 변환합니다.
  • BearerToken과 클라이언트 IP 허용 목록을 확인한 뒤 프록시 요청을 실행합니다.
  • 브라우저형 요청과 프로그램형 요청을 구분해 세션 유지 전략을 적용합니다.
  • HTML 응답에는 <base> 태그를 주입해 상대 경로 리소스가 원본 사이트 기준으로 동작하게 합니다.
  • 상위 프록시, HTTPS 인증서 예외, 타임아웃, redirect 제한을 설정으로 제어합니다.

주요 API

메서드경로용도
GET/forwarder/api/proxy/get-client-ip호출자의 IP 확인용 API입니다.
ALL/forwarder/api/proxy/pipe?requestKey=...등록된 target으로 요청을 포워딩합니다.
GET/forwarder/api/forward-proxy-lab/*개발/검증용 lab 대상 페이지와 응답입니다.
POST/forwarder/api/forward-proxy-lab/program-executelab 화면에서 프로그램형 프록시 호출을 시험합니다.

핵심 구현

  • Areas/forwarder/Controllers/ProxyController.cs: 실제 프록시 API입니다.
  • Areas/forwarder/Controllers/ForwardProxyLabController.cs: 개발 검증용 target과 lab UI를 제공합니다.
  • Services/ForwardProxyService.cs: Playwright 실행, 브라우저 컨텍스트 재사용, 응답 변환을 담당합니다.
  • Services/SQLiteForwardProxySessionStore.cs: 사용자별 세션 파일을 관리합니다.
  • Extensions/ForwarderAuthorizationExtensions.cs: IP 허용과 BearerToken 검증을 담당합니다.

주요 설정

설정설명
ForwardUrlsrequestKey -> targetUrl 화이트리스트입니다. 등록되지 않은 key는 프록시할 수 없습니다.
AllowClientIP접근 가능한 클라이언트 IP 목록입니다.
UseProxy, ProxyServer, ProxyUsername, ProxyPassword, ProxyBypass상위 프록시 체인 설정입니다.
IgnoreHTTPSErrors테스트 환경의 TLS 오류를 무시할지 결정합니다.
RequestTimeoutMS기본 요청 제한 시간입니다.
MaxRedirectsredirect 최대 횟수입니다.
SessionStorageBasePath사용자별 SQLite 세션 파일 저장 위치입니다.
BrowserIdleTimeoutSecond미사용 브라우저 컨텍스트 정리 기준입니다.

ForwardUrls 예시는 다음과 같습니다.

{
"ForwardUrls": [
{ "sample-api": "https://example.com" },
{ "lab-json": "http://localhost:8421/forwarder/api/forward-proxy-lab/target/json" }
]
}

Playwright Chromium

forwarder는 실행 환경에 Playwright Chromium이 설치되어 있어야 합니다. 자동 설치가 실패하는 서버에서는 실제 호스트가 로드하는 modules/forwarder 경로에서 다음 명령으로 설치합니다.

pwsh .\playwright.ps1 install chromium

설치 상태는 다음 명령으로 확인합니다.

pwsh .\playwright.ps1 install --list

운영 주의사항

  • ForwardUrls는 외부 호출 allowlist이므로 운영 배포 전에 불필요한 lab key를 제거합니다.
  • SessionStorageBasePath에는 사용자별 세션 상태가 저장되므로 접근 권한, 보관 기간, 디스크 정리 정책을 둡니다.
  • IgnoreHTTPSErrors=true는 개발/검증 환경에만 사용합니다.
  • BrowserIdleTimeoutSecond를 길게 두면 로그인 재사용성은 좋아지지만 메모리 점유가 증가합니다.