콘텐츠로 이동
ProxerProxerv0.13.0

동작 방식

Proxer 터널을 지나는 요청 흐름입니다.

Proxer에는 두 쪽이 있습니다. 공개 서버는 브라우저와 reverse proxy가 닿을 수 있는 곳에서 대기합니다. 클라이언트는 사설 서비스 옆에서 실행되고 공개 서버로 먼저 접속합니다. 앱을 위해 사설망 안쪽으로 들어오는 방화벽 규칙을 열 필요가 없습니다.

공개 서버는 하나의 HTTP/WebSocket 리스너를 사용합니다. 다음 경로는 Proxer가 예약합니다.

/__proxer__/control
/__proxer__/health/live
/__proxer__/health/ready

--control-path 옵션은 없습니다. 클라이언트에는 wss://proxy.example.com 같은 base URL만 전달하면 되고, Proxer가 내부적으로 /__proxer__/control을 붙입니다.

proxer http/__proxer__/control로 WebSocket 연결을 엽니다. 토큰 인증 뒤에는 선택한 서브도메인 경로, 명시적인 루트 경로, 또는 서버가 할당한 임의 서브도메인 경로를 등록합니다.

공개 요청이 들어오면 서버는 터널 스트림을 만들고, 이미 열려 있는 제어 연결 위로 요청 프레임을 보냅니다. 클라이언트는 그 프레임을 127.0.0.1:<port> 요청으로 바꾸고, 응답 헤더와 본문 조각을 같은 스트림으로 되돌려 보냅니다.

각 스트림에는 고유한 streamId가 있으므로 여러 공개 요청이 하나의 제어 연결을 공유할 수 있습니다.

  1. 브라우저나 reverse proxy가 공개 Proxer 서버로 요청을 보냅니다.
  2. 서버는 유효한 호스트를 읽고 일치하는 루트 또는 서브도메인 경로를 찾습니다.
  3. 서버는 등록된 클라이언트의 제어 연결 위에 터널 스트림을 엽니다.
  4. 클라이언트는 요청을 127.0.0.1:<port>로 전달합니다.
  5. 응답 헤더와 본문 조각이 같은 터널 스트림으로 돌아옵니다.
  6. 공개 서버는 원래 호출자에게 응답을 씁니다.

HTTP 스트리밍과 Server-Sent Events는 전체 응답을 모아두지 않고 조각 단위로 전달됩니다. WebSocket 업그레이드는 같은 호스트 라우팅을 거친 뒤 양방향 터널 스트림이 됩니다.

이미 열린 제어 연결이 끊기면 클라이언트는 활성 스트림을 정리하고 다시 연결을 시도합니다. 같은 URL에서 서버에 닿으면 다시 인증하고 경로를 등록합니다.

처음 시작할 때는 더 엄격합니다. 서버가 내려가 있는 상태에서 클라이언트를 실행하면 재연결 루프에 들어가기 전에 명령이 실패할 수 있습니다. 서버를 먼저 시작하세요.

연결된 클라이언트가 하나뿐이라는 이유로 요청을 자동 전달하지 않습니다. 호스트가 루트 도메인 경로 또는 등록된 서브도메인 경로와 맞아야 합니다. 여러 사람이나 여러 서비스가 같은 터널 서버를 쓸 때 이 편이 문제를 찾기 쉽습니다.