Files
llm-wiki/raw/official-docs/ngrok-http-tunnel-official.md
T

107 lines
8.4 KiB
Markdown

---
title: ngrok — HTTP tunnel for local dev with external OAuth (official)
source_type: official-doc
url: https://ngrok.com/docs/universal-gateway/http/
archive_url:
related_projects: [keycloak-patterns]
related_branches: [feature-keycloak-patterns, feature-keycloak-single-ec2-google-federation, feature-keycloak-public-domain-tunneling]
tags: [keycloak-patterns, p3b-single-ec2-google, ngrok, public-uri, oauth-callback, local-dev, official-doc]
status: raw
confidence: high
created: 2026-05-25
last_reviewed: 2026-05-27
---
# ngrok — HTTP Tunnel (공식)
> Layer: `raw/official-docs/` — ngrok Universal Gateway / HTTP endpoints 페이지 verbatim.
> P3B 단일 EC2 + Google federation 학습 단계에서 public HTTPS URL + Google OAuth 호환을 빠르게 확보하는 개발 환경 대안의 1차 근거.
## Parent / 활용 branch (필수)
| Branch | 이 자료가 정당화하는 결정 |
|---|---|
| [[raw/branch-notes/feature-keycloak-patterns]] | keycloak-patterns root — public 도메인이 필요한 외부 IdP federation 의 개발 환경 대안 |
| [[raw/branch-notes/feature-keycloak-single-ec2-google-federation]] | P3B 단일 EC2 학습 환경에서 ngrok 으로 Google OAuth callback redirect URI 확보 결정 근거 |
| [[raw/branch-notes/feature-keycloak-public-domain-tunneling]] | 자체 도메인 + Let's Encrypt vs ngrok / cloudflared tunneling 의 trade-off 비교 시 ngrok 측 baseline |
## 컨텍스트
Google OAuth 는 redirect URI 가 HTTPS + 도메인이어야 함 (localhost 예외). 자체 도메인 + Let's Encrypt 발급 + EC2 보안 그룹 80/443 개방 vs **ngrok 1줄로 HTTPS public URL 발급**. 학습 단계에서는 후자가 빠르지만 URL 이 매번 바뀌면 Google Console 등록을 매번 갱신해야 한다.
## 출처 / Source
- 원본 URL: https://ngrok.com/docs/universal-gateway/http/
- 아카이브 URL: (미수집)
- 저자 / 조직: ngrok
- 발행일: rolling docs
- 마지막 확인일: 2026-05-27
## 핵심 인용 / Key quotes (verbatim)
> [§Randomly assigned hostnames] "the command `ngrok http 80` may create an endpoint like `https://1eb2-181-80-12-3.ngrok.app`."
> [§Validation — URL Part defaults table] "Scheme | `https`"
> [§Bring your own domain] "Endpoints with randomly assigned hostnames are an exception and won't match an existing Domain object."
> [§Bring your own domain] "If you want to bring your own domain, first create a Domain record and set up a DNS CNAME record. Then create an endpoint on that domain by specifying a URL with a matching hostname."
> [§Google OAuth example] "The following example enforces a browser-based OAuth redirect flow in front of your endpoint using Google as the identity provider by using the OAuth Traffic Policy action."
## Claims Extracted / 추출된 주장
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|---|---|---|---|---|---|
| NGROK-C1 | `ngrok http <port>` 명령은 random hostname 의 HTTPS endpoint 를 생성 (예: `https://1eb2-181-80-12-3.ngrok.app`) | [§Randomly assigned hostnames] "the command `ngrok http 80` may create an endpoint like `https://1eb2-181-80-12-3.ngrok.app`." | `official-vendor-doc` | ngrok free plan 의 default 동작 | `ngrok http 8080` 의 정확한 출력 hostname 형식이 항상 `<hash>-<ip>.ngrok.app` 이라는 뜻 아님 — 시점/region 별 변경 가능 |
| NGROK-C2 | URL part default 의 scheme 은 `https` (HTTPS 가 default) | [§Validation — URL Part defaults table] "Scheme | `https`" | `official-vendor-doc` | URL 명시 없이 endpoint 생성 시 | HTTP 강제 옵션이 없다는 뜻 아님 — URL 명시 시 변경 가능 |
| NGROK-C3 | random hostname endpoint 는 기존 Domain object 와 매칭되지 않음 (= reserved domain 자동 적용 안 됨) | [§Bring your own domain] "Endpoints with randomly assigned hostnames are an exception and won't match an existing Domain object." | `official-vendor-doc` | ngrok 의 reserved domain 정책 | random hostname 의 lifetime / TTL 의 정확한 값은 본 인용 범위 밖 |
| NGROK-C4 | bring-your-own-domain 사용 시: (1) Domain record 생성 + DNS CNAME 설정 (2) 해당 hostname 으로 endpoint 생성 | [§Bring your own domain] "If you want to bring your own domain, first create a Domain record and set up a DNS CNAME record. Then create an endpoint on that domain by specifying a URL with a matching hostname." | `official-vendor-doc` | 고정 URL 이 필요한 OAuth callback 등록 시나리오 | paid plan 이 필수라는 뜻은 본 인용에 직접 없음 — pricing 별도 페이지 |
| NGROK-C5 | ngrok 의 Traffic Policy `OAuth` action 이 Google 을 IdP 로 사용하는 browser-based OAuth redirect flow 를 endpoint 앞단에서 enforce 가능 (공식 예제 존재) | [§Google OAuth example] "The following example enforces a browser-based OAuth redirect flow in front of your endpoint using Google as the identity provider by using the OAuth Traffic Policy action." | `official-vendor-doc` | ngrok Traffic Policy OAuth action 사용 | Keycloak 의 Google federation 을 대체한다는 뜻 아님 — ngrok 측 edge OAuth (다른 layer) |
## Usage Boundaries / 적용 경계
- **이 자료가 직접 증명하는 것**:
- `NGROK-C1`: `ngrok http <port>` 가 random HTTPS hostname 을 생성한다는 사실
- `NGROK-C2`: HTTPS 가 endpoint scheme default
- `NGROK-C3`: random hostname 은 Domain object 와 매칭되지 않음
- `NGROK-C4`: 자체 도메인 사용의 정확한 절차 (Domain record + DNS CNAME + endpoint URL)
- `NGROK-C5`: ngrok Traffic Policy 에 Google OAuth action 이 공식 예제로 존재한다는 사실
- **이 자료가 증명하지 않는 것**:
- free plan vs paid plan 의 정확한 hostname 정책 (free 에서도 reserved domain 가능 여부)
- free plan 에서 재시작 시 새 hostname 으로 변경된다는 명시적 정책 (관행적 사실이나 본 페이지에 직접 인용 없음)
- Keycloak `KC_HOSTNAME` + `KC_PROXY_HEADERS=xforwarded` 설정과의 통합 정확성
- ngrok 의 inbound traffic 에 대한 rate limit / TLS termination 의 정확한 동작
- production 운영 적합성 (본 페이지는 개발/시연 도구로 자주 사용되지만 production 적합 여부 직접 언급 없음)
- **내 프로젝트에 적용하려면 추가 확인이 필요한 것**:
- free plan 에서 `ngrok http 8080` 실행 시 재시작마다 hostname 이 변경되는지 (관행적 알려진 사실 → free plan 페이지 별도 확인)
- paid plan 의 reserved domain 가격 + Google Cloud Console redirect URI 등록 절차
- Keycloak `KC_HOSTNAME=<ngrok-url>` 설정 시 `iss` claim 의 정확한 형태와 backend `issuer-uri` 동기화 절차
## P3B 함의 (해석 — 내 프로젝트 메모)
> 본 섹션은 자료 직접 인용 아님. P3B 결정 컨텍스트 해석.
- 개발 환경: EC2 (또는 로컬) 에서 `ngrok http 8080` → Keycloak 외부 HTTPS URL 확보 (`NGROK-C1`/`C2`).
- Keycloak 설정: `KC_HOSTNAME=https://<ngrok-id>.ngrok.app` + `KC_PROXY_HEADERS=xforwarded` (별도 [[raw/official-docs/keycloak-hostname-configuration]] 결합).
- Google Cloud Console → Authorized redirect URIs 에 `https://<ngrok-id>.ngrok.app/realms/dev/broker/google/endpoint` 등록.
- **URL 변경 friction** (UNSUPPORTED — free plan 정책 별도 확인 필요): free plan 에서 ngrok 재시작 시마다 새 hostname → Keycloak `KC_HOSTNAME` + Google Console redirect URI 모두 갱신 필요. paid plan 의 reserved domain (`NGROK-C4`) 으로 고정 가능.
- 운영 (prod) 용도 아님 — 어디까지나 학습/시연 (본 페이지 직접 인용 아님, 관행).
## 대안
- **Cloudflare Tunnel** (`cloudflared`): 무료 + 안정적 hostname (Cloudflare 도메인 보유 시). [[raw/official-docs/cloudflare-tunnel-routing-official]] 참고.
- **자체 도메인 + EC2 public IP + Let's Encrypt**: 가장 운영-가까운 환경. P3B 본격 시도 시 권장.
## Related / 관련
- 같은 주제 다른 official-doc:
- [[raw/official-docs/cloudflare-tunnel-routing-official]] (동일 카테고리 — 무료 tunneling 대안)
- [[raw/official-docs/google-oauth2-redirect-uri-validation-official]] (Google OAuth 의 redirect URI 검증 규칙)
- [[raw/official-docs/keycloak-hostname-configuration]] (Keycloak `KC_HOSTNAME` 결합)
- 인용하는 branch:
- [[raw/branch-notes/feature-keycloak-patterns]]
- [[raw/branch-notes/feature-keycloak-single-ec2-google-federation]] (P3B)
- [[raw/branch-notes/feature-keycloak-public-domain-tunneling]]
- 인용하는 wiki: (미작성)