Webhook으로 나만의 연동 만들기

2026년 10월 13일 에 업데이트됨 읽는 데 4분

‘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을 설정하려면 다음 단계를 따르세요.

  1. 규칙 페이지로 이동합니다.
  2. 새 규칙을 만듭니다.
  3. 이름, 피드, 조건을 추가합니다.
  4. ‘무엇을 해야 하나요?’ 섹션에서 ‘Webhook으로 게시’를 선택합니다.
  5. 입력란에 Webhook URL을 입력합니다.
  6. 설정이 올바른지 확인하려면 ‘테스트 메시지 게시’ 버튼을 눌러 엔드포인트로 테스트 알림을 보낼 수 있습니다. 이는 테스트이므로 실패해도 재시도가 시작되지 않습니다. 또한 테스트 게시물을 보내려면 계정에 게시물이 추가된 피드가 하나 이상 있어야 합니다.

보안: Webhook 서명 확인

수신한 Webhook 요청이 실제로 Feeder에서 전송되었고 변조되지 않았는지 확인하려면 각 Webhook에 생성되는 비밀 키를 사용해 서명을 검증할 수 있습니다. 모든 Webhook 요청에는 요청 본문의 HMAC-SHA256 서명이 담긴 X-Feeder-Signature 헤더가 포함됩니다.

작동 방식

  1. 규칙 설정에서 고급 옵션을 켭니다. Webhook 비밀 키 입력란에 문자열이 표시됩니다.
  2. Feeder가 엔드포인트로 Webhook을 전송할 때 비밀 키를 키로 사용해 JSON 요청 본문의 HMAC-SHA256 해시를 계산합니다.
  3. 생성된 서명은 sha256= 접두사가 붙은 상태로 X-Feeder-Signature 헤더에 전송됩니다. 예를 들면 다음과 같습니다.
   X-Feeder-Signature: sha256=a1b2c3d4e5f6...
  1. 서버에서 원본 요청 본문과 보유한 비밀 키를 사용해 동일한 HMAC-SHA256 해시를 다시 계산한 다음, 헤더의 값과 비교합니다.

이 기능을 사용하는 이유

  • 진위 확인: 요청이 제삼자가 아닌 Feeder에서 전송되었는지 확인합니다.
  • 무결성: 전송 중 페이로드가 변경되지 않았음을 보장합니다.

서명 확인하기

서명을 확인하려면 다음 단계를 따르세요.

  1. 원본 요청 본문을 문자열로 읽습니다. 먼저 파싱하지 마세요.
  2. 비밀 키를 사용해 해당 문자열의 HMAC-SHA256을 계산합니다.
  3. 타이밍 공격을 방지하려면 타이밍 공격 방지 비교를 사용해 계산한 서명과 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로 이메일을 보내 주세요.

도움이 더 필요하신가요?

지원팀이 모든 메시지를 확인해요. 어떤 문제인지 알려주시면 도와드릴게요.

지원팀에 문의하기