Lobsite-Webhooks는 Lobsite가 보내는 웹훅의 사용자 에이전트입니다. 폼이 있는 Lobsite 사이트는 소유자가 lobsite.toml에 설정한 웹훅 주소로 각 제출 내용을 보낼 수 있으며, 이 요청들이 그 전달입니다. 로그에서 이를 본다면 누군가 폼의 웹훅을 내 서버로 지정한 것입니다. 보통은 자신의 Lobsite 사이트에서 설정한 것입니다.
요청의 형태
수락된 스팸이 아닌 폼 제출마다 JSON 본문이 있는 POST가 한 번 전송됩니다.
POST /hooks/contact HTTP/1.1
Content-Type: application/json
User-Agent: Lobsite-Webhooks/1
X-Lobsite-Event: form.submission
X-Lobsite-Delivery: dlv_3m9q…
X-Lobsite-Signature: t=1760372438,v1=5257a869…
{
"type": "form.submission",
"id": "sub_8x2k…",
"site": "quiet-fox-4821",
"form": "contact",
"data": { "email": "ana@example.com", "message": "Hi!" },
"created_at": "2026-10-13T16:20:38Z"
}
웹훅은 사설 또는 내부 네트워크로 확인되지 않는 https:// 주소로만 전송됩니다.
요청이 정말 Lobsite에서 왔는지 확인하기
사용자 에이전트는 위조할 수 있지만 서명은 위조할 수 없습니다. X-Lobsite-Signature에는 타임스탬프 t와 v1이 있습니다. 후자는 Lobsite 대시보드에 한 번 표시되는 폼의 웹훅 시크릿으로 계산한 "<t>.<raw body>"의 16진수 HMAC-SHA256입니다. 원시 본문에서 같은 값을 계산하고, 상수 시간으로 비교하고, 5분보다 오래된 t는 거부하세요.
import { createHmac, timingSafeEqual } from "node:crypto";
function verified(secret, header, rawBody) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return v1?.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}
재시도
10초 이내의 2xx 응답은 전달된 것으로 처리됩니다. 그 외에는 1분, 5분, 30분, 2시간, 12시간 후 5번 다시 시도합니다. X-Lobsite-Delivery는 재시도 동안 같으므로 이미 처리한 전달을 건너뛸 수 있습니다.
자주 묻는 질문
이 요청을 어떻게 중단하나요?
내 사이트라면 lobsite.toml의 폼에서 webhook을 제거하고 배포하세요. 그렇지 않다면 오류로 응답하세요. 각 제출은 총 6번 시도된 후 삭제됩니다. 계속 들어오면 X-Lobsite-Delivery 값과 함께 악용 신고 페이지에서 신고해 주세요. 조사하겠습니다.
어떤 플랜에서 웹훅을 보내나요?
웹훅은 Standard 플랜에 포함됩니다. Free 플랜의 사이트는 대신 이메일 알림을 받습니다. 폼 문서를 참고하세요.
같은 제출을 두 번 받는 이유는 무엇인가요?
처음에 서버가 너무 느리게 응답했거나 오류로 응답해 재시도된 것입니다. 이미 본 X-Lobsite-Delivery의 전달은 건너뛰세요.