ngrok은 어떻게 동작하나? 역방향 터널과, 돈을 내는 진짜 이유
원리는 단순하다. 값은 공개 서버 운영비라서 frp · bore 로 직접 세울 수도 있다
로컬에 띄운 개발 서버를 휴대폰이나 Webhook 보내는 서비스, 고객에게 잠깐 보여줘야 할 때 늘 ngrok 이 나온다. 원리는 한 줄이다. 밖에 있는 서버에 내가 먼저 전화를 걸어 두고, 그 통화로 요청을 받는다. 이걸 알면 「유료 플랜을 살지, 직접 세울지」 도 정할 수 있다.
왜 방화벽을 뚫는가
공유기나 회사 방화벽은 밖에서 안으로 들어오는 연결을 막는다. 안에서 밖으로 나가는 연결은 보통 열어 둔다.
ngrok 에이전트(ngrok http 3000)는 시작하자마자 ngrok 엣지 서버로 밖으로 나가는 연결을 하나 맺는다. 엣지는 공개 URL 을 내주고, 그 URL 로 들어온 요청을 이미 열려 있는 연결에 실어 내 PC 로 보낸다. 포트 개방도 고정 IP 도 필요 없는 이유다. ssh -R 리버스 포워딩과 같은 발상이다.
TLS 는 엣지에서 푼다. 그래서 로컬이 http 여도 밖에서는 https URL 이 나온다.
Host 헤더로 앱을 가르는 서버라면 하나 조심할 게 있다. 요청은 공개 URL 의 Host 를 달고 들어온다. 우리 Rails 저장소처럼 appNN.localhost 로 앱을 고르는 구조면, 그 공개 호스트도 받아 주게 해 둬야 엉뚱한 앱이 응답하지 않는다.
돈을 내는 건 기술이 아니다
2026-09-26 에 ngrok.com/pricing 을 보고 정리했다. 값은 바뀌니 쓰기 전에 공식 페이지를 다시 본다.
| 플랜 | 값 | 요지 |
|---|---|---|
| Free | $0 | 전송 1GB, HTTP 요청 월 2만, 경고용 중간 페이지가 뜬다 |
| Hobbyist | $10/월 | 전송 5GB, 요청 월 10만, 중간 페이지 없음 |
| Pay-as-you-go | $20/월 + 사용량 | 자기 도메인, SSO · mTLS |
무료에서 실제로 걸리는 건 용량보다 중간 페이지다. 사람은 버튼 한 번 누르면 되지만, Webhook 처럼 기계가 받는 요청에는 그 HTML 이 응답으로 갈 수 있다.
이 표를 오래 보고 있으면 무엇에 돈을 내는지가 보인다. 터널 원리는 위 세 문단이 전부다. 값은 공개 서버를 24시간 띄워 두고, 와일드카드 도메인과 TLS 인증서를 갱신하고, 그 서버가 악용되지 않게 지키는 운영비다.
직접 세운다면 — frp · bore
| 이름 | 성격 | 이럴 때 |
|---|---|---|
| frp | 서버(frps)는 VPS 에, 클라이언트(frpc)는 로컬에. HTTP · HTTPS · TCP · UDP | 오래 쓸 터널, 자기 도메인 |
| bore | Rust 로 쓴 아주 작은 TCP 터널 | TCP 하나면 될 때, 원리를 코드로 보고 싶을 때 |
ssh -R |
설치 없이 VPS 하나로 | 가끔 잠깐 |
| Cloudflare Tunnel | 관리형, 클라이언트는 cloudflared | 도메인이 이미 Cloudflare 에 있을 때 |
직접 세우면 그 운영비를 내가 떠안는다. VPS 값, DNS, 인증서 갱신, 공개 서버 보안 패치. 그래서 이렇게 고른다. 잠깐 보여주기면 ngrok 무료. Webhook 을 자주 받아 중간 페이지가 걸리면 Hobbyist. 이미 VPS 와 도메인을 굴리고 있으면 frp. frp 를 VPS 에 세워 값을 견줘 보는 건 아직 안 해 봤다.
로컬 서버를 밖에 보여주는 구성이나 Webhook 받는 경로를 어떻게 둘지 고민이라면 https://www.negabaro.com/contact 로 물어봐도 된다.
구조 다이어그램
ngrok http 3000실행- agent가 ngrok 클라우드에 아웃바운드 TLS 터널 수립
- 공개 URL(abc123.ngrok.io) 할당
- 외부 트래픽이 공개 URL로 도착
- ngrok 클라우드가 터널을 통해 로컬로 전달
- 로컬 응답이 터널을 타고 외부에 반환
동작 흐름
ngrok agent가 로컬에서 실행 (ngrok http 3000)
agent가 ngrok 엣지에 밖으로 나가는 TLS 연결을 먼저 맺는다 (역방향 터널)
엣지가 공개 URL 을 내준다
외부 요청이 공개 URL 로 들어오면 엣지가 이미 열린 연결로 로컬에 전달
로컬 서버의 응답이 같은 연결을 타고 돌아간다
장점
- ✓ 방화벽 · NAT 뒤에서도 동작
- ✓ 공개 URL 과 HTTPS 를 바로 받는다
단점
- ✗ 무료 플랜은 중간 경고 페이지 때문에 Webhook 에 안 맞을 수 있다
- ✗ 엣지를 한 번 거치니 레이턴시가 는다