‘Webhook으로 게시’ 규칙을 사용하면 새 RSS 피드 게시물이 올라오는 즉시 지정한 Webhook 엔드포인트로 전송하는 과정을 자동화할 수 있습니다. 키워드를 설정해 전송할 게시물을 필터링할 수도 있습니다. 조건에 맞는 새 게시물이 있으면 JSON 형식의 POST 요청으로 Webhook 엔드포인트에 전송됩니다.
JSON 페이로드 형식
Webhook으로 전송되는 각 POST 요청에는 post와 feed라는 두 가지 주요 요소가 포함됩니다.
Webhook 메시지를 식별하는 메타데이터도 포함됩니다. version 필드에는 전송되는 Feeder Webhook API의 버전이 표시됩니다. 버전은 2023-06-26으로 고정되어 있으며, 호환성이 깨지는 변경 사항이 생기면 업데이트됩니다.
{
"version": "2023-06-26",
"message_id": "a unique UUID for this message, will be constant during retries",
"feed": { ... },
"post": { ... }
}
post 요소에는 개별 게시물에 관한 정보가 포함됩니다.
{
"id": "The unique identifier of the post",
"title": "The title of the post",
"url": "The URL where the post can be accessed",
"published": "The date and time when the post was published",
"content": "The content of the post",
"audio_url": "link to mp3 attached to post (if present)",
"image_url": "link to image attached to post (if present)
}
참고: RSS 피드에 유효한 게시 날짜가 지정되어 있지 않으면 published 값은 null입니다.
feed 요소에는 게시물이 올라온 피드에 관한 정보가 포함됩니다.
{
"id": "The unique identifier of the feed",
"source_url": "The URL of the source, for example RSS/Atom feed URL",
"public_url": "The source's self identified public URL",
"title": "The title of the feed",
"favicon": "The URL of the feed's favicon"
}
앞으로 이러한 객체에 항목을 추가할 수 있습니다. 필요한 정보가 없다면 알려 주세요.
재시도 방식
요청이 실패하면 Feeder가 자동으로 재시도합니다. POST 요청이 200~399 사이의 HTTP 응답 코드를 받지 못하면 아래 일정에 따라 다시 전송합니다. 시간 단위는 초입니다.
- 1차 재시도: 5초 후
- 2차 재시도: 30초 후
- 3차 재시도: 60초 후
- 4차 재시도: 5분 후
- 5차 재시도: 10분 후
- 6차 재시도: 30분 후
- 7차 재시도: 30분 후
- 8차 재시도: 30분 후
이 재시도 방식은 실제 게시물 이벤트가 발생했을 때만 작동하며, 테스트 알림에는 적용되지 않습니다. 재시도 일정은 변경될 수 있습니다.
문제 해결
오류가 발생하면 작업 실행 로그에서 확인할 수 있습니다. 작동하지 않는 규칙을 열고 오류 로그 열기를 선택하세요.

여기에서 실패한 Webhook에 관한 자세한 정보를 확인할 수 있습니다.

Webhook 설정하기

Webhook을 설정하려면 다음 단계를 따르세요.
- 규칙 페이지로 이동합니다.
- 새 규칙을 만듭니다.
- 이름, 피드, 조건을 추가합니다.
- ‘무엇을 해야 하나요?’ 섹션에서 ‘Webhook으로 게시’를 선택합니다.
- 입력란에 Webhook URL을 입력합니다.
- 설정이 올바른지 확인하려면 ‘테스트 메시지 게시’ 버튼을 눌러 엔드포인트로 테스트 알림을 보낼 수 있습니다. 이는 테스트이므로 실패해도 재시도가 시작되지 않습니다. 또한 테스트 게시물을 보내려면 계정에 게시물이 추가된 피드가 하나 이상 있어야 합니다.
보안: Webhook 서명 확인
수신한 Webhook 요청이 실제로 Feeder에서 전송되었고 변조되지 않았는지 확인하려면 각 Webhook에 생성되는 비밀 키를 사용해 서명을 검증할 수 있습니다. 모든 Webhook 요청에는 요청 본문의 HMAC-SHA256 서명이 담긴 X-Feeder-Signature 헤더가 포함됩니다.
작동 방식

- 규칙 설정에서 고급 옵션을 켭니다. Webhook 비밀 키 입력란에 문자열이 표시됩니다.
- Feeder가 엔드포인트로 Webhook을 전송할 때 비밀 키를 키로 사용해 JSON 요청 본문의 HMAC-SHA256 해시를 계산합니다.
- 생성된 서명은
sha256=접두사가 붙은 상태로X-Feeder-Signature헤더에 전송됩니다. 예를 들면 다음과 같습니다.
X-Feeder-Signature: sha256=a1b2c3d4e5f6...
- 서버에서 원본 요청 본문과 보유한 비밀 키를 사용해 동일한 HMAC-SHA256 해시를 다시 계산한 다음, 헤더의 값과 비교합니다.
이 기능을 사용하는 이유
- 진위 확인: 요청이 제삼자가 아닌 Feeder에서 전송되었는지 확인합니다.
- 무결성: 전송 중 페이로드가 변경되지 않았음을 보장합니다.
서명 확인하기
서명을 확인하려면 다음 단계를 따르세요.
- 원본 요청 본문을 문자열로 읽습니다. 먼저 파싱하지 마세요.
- 비밀 키를 사용해 해당 문자열의 HMAC-SHA256을 계산합니다.
- 타이밍 공격을 방지하려면 타이밍 공격 방지 비교를 사용해 계산한 서명과
X-Feeder-Signature헤더 값을 비교합니다.
예시: Node.js (Express)
const crypto = require("crypto");
const WEBHOOK_SECRET = process.env.FEEDER_WEBHOOK_SECRET;
function verifyFeederSignature(req, res, next) {
const signature = req.headers["x-feeder-signature"];
if (!signature) {
return res.status(401).send("Missing signature");
}
const expectedSignature =
"sha256=" +
crypto.createHmac("sha256", WEBHOOK_SECRET).update(req.body).digest("hex");
const isValid = crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
if (!isValid) {
return res.status(401).send("Invalid signature");
}
next();
}
// Important: use express.raw() so req.body is the raw string, not parsed JSON
app.post(
"/webhook",
express.raw({ type: "application/json" }),
verifyFeederSignature,
(req, res) => {
const payload = JSON.parse(req.body);
// Handle the webhook payload
console.log("Received verified webhook:", payload);
res.sendStatus(200);
}
);
중요: 서명을 검증하려면 원본 요청 본문에 접근해야 합니다. HMAC을 계산하기 전에 프레임워크가 JSON 본문을 파싱하면, 다시 직렬화한 문자열이 원본과 달라져 서명이 일치하지 않을 수 있습니다. 위 예시처럼 Express에서는 Webhook 경로에 express.raw({ type: "application/json" })를 사용하세요.
더 궁금한 점이 있나요?
궁금한 점이 있으면 support@feeder.co로 이메일을 보내 주세요.