설정
웹훅
아웃바운드 웹훅 전달, 서명, 재시도.
웹훅
ObjectOS는 아웃바운드 웹훅을 위해 영구적인 outbox 모델을 사용합니다. 웹훅 플러그인이 활성화되면 비즈니스 변경 사항이 전달 행을 큐에 추가하고, 백그라운드 디스패처가 재시도와 함께 이를 전달합니다 — 따라서 느리거나 응답하지 않는 수신자가 원래의 트랜잭션을 절대 차단하지 않습니다.
웹훅 활성화
웹훅은 선택적 기능입니다. 배포된 ObjectOS 이미지에는
@objectstack/plugin-webhooks가 포함되어야 하며, 애플리케이션 아티팩트는
웹훅 구독을 등록해야 합니다(일반적으로 sys_webhook 객체의 레코드 형태).
활성화되면 Console에 두 개의 객체가 나타납니다:
| 객체 | 용도 |
|---|---|
sys_webhook | 웹훅 구독(대상 URL, 이벤트 필터, 시크릿, 상태) |
sys_webhook_delivery | 전달 로그(URL, 응답 코드, 시도 횟수, 재시도 타임스탬프) |
전달 시맨틱
- 최소 한 번(At-least-once). 일시적 실패 이후 전달이 재시도될 수 있으므로, 수신자는 멱등성을 보장해야 합니다.
- 영구성(Persistent). 전달 정보는 비즈니스 데이터베이스에 저장되므로 ObjectOS 재시작 후에도 유지됩니다.
- 파티셔닝(Partitioned). 각 디스패처 워커는 outbox의 파티션을 점유하므로, 배포 환경에서 중복 전달 없이 디스패치를 수평으로 확장할 수 있습니다.
- 제한된 재시도(Bounded retries). 실패한 전달은 구성 가능한 상한선까지
백오프와 함께 재시도되며, 소진된 행은 검사를 위해
sys_webhook_delivery에 남습니다.
서명
모든 전달에는 수신자가 라우팅, 중복 제거, 검증할 수 있도록 식별 헤더가 포함됩니다:
X-Objectstack-Event: <event type, e.g. data.record.created>
X-Objectstack-Delivery: <delivery id — use as your idempotency key>
X-Objectstack-Attempt: <attempt number, starting at 1>웹훅 구독에 secret이 있는 경우, ObjectOS는 모든 요청에 서명도 추가합니다:
X-Objectstack-Signature: sha256=<hex hmac>서명은 원시 요청 본문에 대해 계산된 HMAC-SHA256(secret, body)입니다.
페이로드를 신뢰하기 전에 수신자에서 이를 검증하십시오:
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(body, signatureHeader, secret) {
const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
return timingSafeEqual(Buffer.from(signatureHeader), Buffer.from(expected));
}시크릿을 교체하려면 새 시크릿으로 새 구독을 발급하고, 전환 기간 동안 두 구독을 함께 실행한 다음, 이전 구독을 비활성화하십시오.
수신자 기대 사항
- 몇 초 이내에
2xx로 응답하십시오.408,429, 또는5xx응답(또는 타임아웃/전송 오류)은 재시도 가능하며 백오프와 함께 재시도됩니다. 그 외의4xx는 영구적 실패로 처리되어 추가 재시도 없이dead상태로 이동됩니다. - 디스패처는
2xx를 확인하기 전까지 전달을 성공으로 표시하지 않으므로, 실패한 수신자의 행은 검사나 재전달을 위해sys_webhook_delivery에 유지됩니다. - 멱등성을 보장하십시오 —
X-Objectstack-Delivery헤더(전달 id) 또는 페이로드 내 자체 이벤트 id를 기준으로 중복을 제거하십시오.
실패 처리
문제가 발생하면:
- 해당 행에 대해
sys_webhook_delivery를 확인하십시오 —status,response_code,response_body,attempts가 기록됩니다. - ObjectOS에서 수신자로의 아웃바운드 네트워크 액세스를 확인하십시오.
- 수신자가 영구적으로 변경된 경우, 구독 URL을 업데이트하고 Console에서 해당 행을 재전달하십시오.
- 사고 검토 시, 감사 로그(
sys_audit_log)는 구독 편집 사항을 기록하지만 페이로드는 기록하지 않습니다 — 페이로드는 outbox에 남습니다.
운영 팁
- 웹훅 URL에 시크릿을 넣지 마십시오(쿼리 문자열은 로그에 기록됩니다).
- 전용 수신자 호스트네임을 사용하면 메인 앱에 영향을 주지 않고 엣지에서 차단하여 부하를 분산할 수 있습니다.
- 디스패처 지연을 모니터링하십시오 — outbox가 계속 증가하는 것은 보통 수신자가 성능 저하 상태임을 의미합니다.