n8n 한국어 교재 · Ch.7

Webhook 받기 — 외부에서 트리거

Schedule 의 정반대 모드. 시간이 아니라 외부 요청이 워크플로를 깨웁니다. Stripe 결제 · GitHub PR · Slack 슬래시 명령 — 모두 Webhook 의 영역.

POST /webhook/xyz 요청이 워크플로를 트리거하는 일러스트

Ch.6 의 Schedule 이 "내 워크플로가 알아서 일어남" 이었다면, Webhook 은 "외부 누군가가 두드려서 일어남". 흔한 시나리오: 결제 시스템이 결제 완료 이벤트를 우리에게 알리고, 우리는 영수증 메일 발송. Slack 에서 누가 /deploy staging 명령을 치면 그게 우리에게 도착해서 배포 워크플로 실행. 이런 게 모두 Webhook.

Webhook 이 뭔가 — Schedule 과 정반대 모드

Webhook 의 본질은 단순. n8n 이 외부에 URL 하나 공개해두고, 누가 그 URL 을 요청하면 워크플로 한 번 실행. 그 URL 이 Webhook URL.

구분ScheduleWebhook
누가 깨우나n8n 의 시계외부 요청 (curl, 다른 SaaS, 브라우저)
실행 주기정해진 시각·간격예측 불가 (요청 올 때마다)
받는 데이터없음 (트리거만)HTTP body·query·headers
예시매일 9시 RSSStripe 결제 알림, Slack 명령

실제로 Webhook 노드 만들기

아래 캡처가 격리 인스턴스에서 직접 만든 Webhook 노드의 설정 패널. 박준성 따라하시면 동일한 화면이 뜹니다.

1
새 워크플로 → Add first step → "webhook" 검색

트리거 패널 검색창에 webhook 입력 → 첫 결과 Webhook 클릭 (그 아래 "Respond to Webhook" 은 응답 보낼 때 쓰는 별도 노드).

2
설정 패널이 열리면 — Webhook URL 확인
Webhook 노드 설정 패널 — Test URL과 Production URL 토글, GET 메서드, 자동 생성된 Path UUID, Authentication 옵션
실제 Webhook 노드 패널. 상단 Test URL / Production URL 토글이 핵심. 아래 자동 생성된 UUID Path 가 보입니다.

n8n 이 자동으로 생성해주는 두 URL:

Test URL (개발용 — Listen 중일 때만 작동) http://localhost:5679/webhook-test/f250c952-48e2-4d75-... Production URL (운영용 — workflow Active 면 항상 작동) http://localhost:5679/webhook/f250c952-48e2-4d75-...

차이는 마지막 H2 에서 다시. 일단 두 URL 이 다르다는 점만 인지.

3
3개 핵심 필드
  • HTTP Method — 어떤 메서드로 받을지. 기본 GET, 데이터 받을 거면 POST.
  • Path — 자동 UUID 그대로 둬도 OK. 의미 있는 이름(github-pr)으로 바꿔도 됨. URL 의 마지막 부분.
  • Authentication — None / Basic / Header / JWT. 처음엔 None, 운영에선 Header Auth 권장 (Ch.17).

오른쪽의 Listen for test event 또는 Test this trigger 버튼을 누르면 n8n 이 60초간 대기 → 그 사이 누가 Test URL 을 호출하면 즉시 캐치.

받은 데이터 가공 — Set 노드 연결

Webhook 만 단독으로 쓰는 일은 거의 없습니다. 받은 데이터를 가공하거나 다른 곳으로 보내는 게 보통.

Webhook 트리거 + Set 노드 두 개가 캔버스에 연결된 모습
실제 캔버스 — Webhook 다음에 Set 노드를 붙인 상태. 좌→우 흐름이 그대로 데이터 흐름.
Set 노드 설정 패널 — Fields to Set 영역에서 새 필드 추가 UI
Set 노드 패널. 받은 Webhook body 의 필드를 가공해 새 모양으로 짤 수 있어요.

예를 들어 Webhook 으로 {"name":"박준성","amount":50000} 이 들어오면 Set 에서:

# Set 노드 표현식 인사: ={{ "안녕 " + $json.body.name + "님" }} 금액: ={{ $json.body.amount + "원" }} 받은시각: ={{ $now.toFormat("yyyy-MM-dd HH:mm") }}

주의 — Webhook 으로 들어온 body 는 $json.body 로 접근. 헤더는 $json.headers, 쿼리는 $json.query. 일반 노드처럼 $json.name 으로 바로 꺼낼 수 없어요.

실전 호출 — curl 로 직접 쏘기

Webhook URL 을 받았으니 진짜로 한 번 호출. 노드 패널의 Listen for test event 누른 다음 터미널에서:

# GET 방식 (간단 테스트) $ curl "http://localhost:5679/webhook-test/f250c952-48e2-4d75-..." { "message": "Workflow was started" } # POST 방식 (JSON 데이터 포함) $ curl -X POST "http://localhost:5679/webhook-test/f250c952-..." \ -H "Content-Type: application/json" \ -d '{"name":"박준성","amount":50000}' { "message": "Workflow was started" }

n8n 화면으로 돌아가면 — 워크플로가 깨어나 Webhook 노드에 ✓ 표시, OUTPUT 에 받은 데이터가 그대로 보입니다. 그 다음 Set 노드도 차례로 실행되며 가공된 결과 출력.

Test URL vs Production URL — 가장 흔한 함정

Webhook 의 가장 큰 함정. 두 URL 이 완전히 다르게 동작합니다.

Test URL/webhook-test/...
"Listen for test event" 를 누른 직후 60초 동안만 작동. 한 번 트리거되면 자동 중지. 워크플로 짤 때 들어오는 데이터 구조 확인용.
Production URL/webhook/...
워크플로가 Active 상태일 때만 작동, 24시간 항상 받음. 외부 SaaS (Stripe, GitHub 등) 에 등록할 URL 은 무조건 이것.
가장 자주 하는 실수 — 개발할 땐 Test URL 에 curl 쏘면서 잘 됐는데, 운영 배포 후 Production URL 에 호출이 안 옴. 원인 99%: 워크플로를 Active 토글 안 켰음. Save 만 누르고 끝낸 거예요. n8n 2.0 부터는 Save + Publish 모두 필요.

또 한 가지 — Test URL 은 localhost 만 받습니다. 외부에서 호출하려면 ngrok·Cloudflare Tunnel 같은 터널 도구로 뚫거나, Production URL + 도메인 + nginx 리버스 프록시 (Ch.22) 필요.

다음 Ch.8 에서는 외부에서 가장 자주 쓰는 통합 — Google Sheets. Webhook 으로 들어온 데이터를 시트에 자동 누적하거나, 시트에서 읽어와 다른 곳으로 보내는 패턴을 다룹니다.

n8n 한국어 교재 · Ch.7 완료

다음 편 → Ch.8 Google Sheets 연동 — 읽기·쓰기·OAuth 자격증명

전체 시리즈 보기

© 2026 주나이테크(주) @JUNAITECH