1. 개요
  2. 웹훅

웹훅

Webhook은 현재 플랜에서 아직 제공되지 않습니다. 제공되면 FixWeb은 스캔 완료, 최종 실패 및 심각도가 높은 발견 항목에 대해 서명된 발신 Webhook을 보냅니다. 전송은 최소 한 번 수행되며 약 24시간 동안 재시도합니다.

설정

계정 → 웹훅을 열고 HTTPS 엔드포인트를 만든 후 일회성 whsec_ 시크릿을 수신기에 저장하세요. 웹훅은 유료 플랜에서 사용할 수 있습니다.

  1. 계정 → 웹훅에서 엔드포인트를 만드세요.
  2. FixWeb이 해당 엔드포인트로 보낼 이벤트를 선택하세요.
  3. 시크릿을 즉시 복사하세요. 한 번만 표시되며 나중에는 교체만 할 수 있습니다.

이벤트

시작 이벤트 표면은 팀이 일반적으로 CI, 알림 또는 티켓 관리에 연결하는 순간을 다룹니다:

  • scan.completed — 스캔이 completed로 전환될 때 발생합니다. 페이로드: 스캔 ID, 대상, 모드, 심각도 버킷별 수, 보고서 링크.
  • scan.failed — 최종 실패 알림입니다. 페이로드: 스캔 ID, 실패한 단계, 오류 및 보고서 링크.
  • finding.created — 치명적 또는 높은 심각도의 발견 사항마다 생성됩니다. 이벤트 폭주를 피하기 위해 낮은 심각도는 기본적으로 scan.completed에 합쳐집니다.
  • monitor.alert.fired: 실시간 웹사이트 모니터링이 변경을 감지하면 발생합니다. 현재 플랜에서는 실시간 모니터링을 사용할 수 없습니다.
  • schedule.run.queued — 스케줄러가 재스캔을 대기열에 넣을 때 발생합니다. CI 오케스트레이션에 유용합니다.

페이로드 형식

모든 전송은 동일한 봉투를 사용합니다: <code>id</code>, <code>type</code>, <code>created_at</code> 및 이벤트별 <code>data</code>.

json
{
  "id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
  "type": "scan.completed",
  "created_at": "2026-05-15T10:20:30.000Z",
  "data": {
    "scan": {
      "id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
      "target_hostname": "staging.example.com",
      "mode": "passive",
      "status": "completed",
      "findings_count": { "critical": 0, "high": 1, "medium": 2, "low": 3, "info": 4 },
      "report_url": "https://fixweb.app/dashboard/scans/8f1c4e2a-..."
    }
  }
}

서명

FixWeb은 HMAC-SHA-256으로 정확한 원시 JSON 본문에 서명합니다. 이벤트 데이터를 파싱하거나 신뢰하기 전에 서명을 확인하세요. 헤더:

  • fixweb-signature: t=<timestamp>,v1=<hex hmac>
  • fixweb-event: scan.completed
  • fixweb-delivery: <uuid> (멱등 키)
typescript
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(rawBody: string, header: string, secret: string) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const signed = `${parts.t}.${rawBody}`;
  const expected = createHmac("sha256", secret).update(signed).digest("hex");
  const received = Buffer.from(parts.v1 ?? "", "hex");
  const calculated = Buffer.from(expected, "hex");
  return received.length === calculated.length && timingSafeEqual(received, calculated);
}

재시도

2xx가 아닌 응답, 시간 초과, DNS 오류 또는 SSRF 안전 차단은 약 24시간 동안 지수 백오프로 재시도됩니다. 계정 → 웹훅의 전송 행에는 응답 상태, 짧은 응답 발췌, 시도 횟수 및 데드 레터 상태가 표시됩니다.