에서 웹훅 URL을 설정할 때 아웃 스크레이퍼 통합 설정에 따라, 당사 시스템에서 자동으로 POST 작업/요청이 완료될 때마다 스크랩된 결과를 해당 URL로 전송해 주세요.

보안상의 이유로, 모든 웹훅 페이로드는 다음을 사용하여 서명됩니다. 귀하의 Outscraper API 키. 이를 통해 웹훅이 실제로 Outscraper에서 전송된 것이며 변조되지 않았음을 확인할 수 있습니다.

1단계. 서명 헤더

모든 웹훅 요청에는 다음과 같은 추가 헤더가 포함됩니다:

				
					X-Hub-Signature-256: sha256=<signature>
				
			
  • <signature> 는 원시 JSON 페이로드의 HMAC-SHA256 다이제스트입니다.

  • 다음과 같은 방식으로 생성됩니다. 귀하의 Outscraper API 키.

  • 진위 여부를 확인하려면 로컬에서 동일한 다이제스트를 계산한 후 이를 헤더와 비교해야 합니다.

2단계. 웹훅 요청 예시

다음은 실제 웹훅 요청의 예시입니다:

				
					POST /webhooks HTTP/1.1
Host: your-domain.com
Content-Type: application/json
X-Hub-Signature-256: sha256=7b6b9d07b1c0d7ff3b4b3fcecbf9c08a5f6c2a248ef12c7a37a7269d3a5b1b93

{
  "id": "your-request-id",
  "user_id": "your-user-id",
  "status": "SUCCESS",
  "api_task": true,
  "results_location": "https://api.outscraper.cloud/requests/your-request-id",
  "quota_usage": [
    {
      "product_name": "Google Maps Data",
      "quantity": 1
    }
  ]
}

				
			

3단계. 확인

웹훅 요청을 확인하려면 다음을 수행해야 합니다:

  1. 다음 내용을 읽어보세요. 원시 JSON 페이로드 (구문 분석된 객체가 아닙니다).

  2. 사용자의 [...], 이 페이로드에 대한 HMAC-SHA256 다이제스트를 계산하십시오. API 키.

  3. 앞에 다음을 추가하세요 "sha256=" 그리고 다음의 값과 비교하여 X-Hub-Signature-256 헤더.

  4. 서명이 일치하지 않으면 요청을 거부하십시오.

파이썬 예제

				
					import hmac
import hashlib
import json
from flask import Flask, request, abort

app = Flask(__name__)

API_KEY = "your_api_key_here"  # your Outscraper API key

def generate_hmac_sha256(secret: str, data: str) -> str:
    return hmac.new(secret.encode("utf-8"), data.encode("utf-8"), hashlib.sha256).hexdigest()

@app.route("/webhooks", methods=["POST"])
def webhook():
    # Raw JSON payload as text
    payload = request.get_data(as_text=True)
    # Signature header from Outscraper
    signature_header = request.headers.get("X-Hub-Signature-256", "")

    # Compute expected signature
    expected_signature = "sha256=" + generate_hmac_sha256(API_KEY, payload)

    # Secure comparison
    if not hmac.compare_digest(signature_header, expected_signature):
        abort(401, "Invalid signature")

    data = json.loads(payload)
    print("Verified payload:", data)

    return "ok", 200

				
			

Node.js 예제

				
					const crypto = require("crypto");
const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf.toString() } }));

const API_KEY = "your_api_key_here"; // your Outscraper API key

function generateHmacSha256(secret, data) {
  return crypto.createHmac("sha256", secret).update(data, "utf8").digest("hex");
}

app.post("/webhooks", (req, res) => {
  const signature = req.headers["x-hub-signature-256"];
  const expected = "sha256=" + generateHmacSha256(API_KEY, req.rawBody);

  if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).send("Invalid signature");
  }

  console.log("Verified payload:", req.body);
  res.send("ok");
});

app.listen(3000, () => console.log("Webhook listener running on port 3000"));

				
			

PHP 예제

				
					<?php
$API_KEY = "your_api_key_here"; // your Outscraper API key

// Get raw POST body
$payload = file_get_contents("php://input");

// Get signature from headers
$signatureHeader = $_SERVER["HTTP_X_HUB_SIGNATURE_256"] ?? "";

// Compute expected signature
$expectedSignature = "sha256=" . hash_hmac("sha256", $payload, $API_KEY);

// Compare securely
if (!hash_equals($expectedSignature, $signatureHeader)) {
    http_response_code(401);
    die("Invalid signature");
}

// Decode and process verified payload
$data = json_decode($payload, true);
error_log("Verified payload: " . print_r($data, true));

http_response_code(200);
echo "ok";

				
			

4단계. 인증에 실패했을 때의 대처 방법

계산된 서명이 헤더와 일치하지 않는 경우:

  • 요청을 거부합니다 (401 Unauthorized).

  • 디버깅/감사 목적으로 해당 시도를 기록하십시오.

  • 페이로드를 처리하지 마십시오.

5단계. 테스트

Outscraper에서 웹훅을 트리거하여 인증 로직을 테스트할 수 있습니다.
다음과 같이 사용한다면 서명은 항상 정상적으로 검증됩니다. API 키.

요약

  • 모든 Outscraper 웹훅은 다음을 사용하여 서명됩니다. 귀하의 API 키.

  • 다음 계산을 통해 요청을 검증합니다:

    sha256(HMAC(api_key, raw_payload))
  • 계산된 다이제스트를 다음의 것과 비교하십시오. X-Hub-Signature-256 헤더.

  • 시스템 보안을 유지하려면 검증된 요청만 처리하십시오.

참고 문헌

Outscraper가 사용하는 방법은 주요 플랫폼들이 웹훅의 진위 여부를 확인하는 데 신뢰해 온 것과 동일한 접근 방식입니다:

이 예시들은 HMAC-SHA256을 사용하여 웹훅 서명을 검증하는 것이 진위 여부를 확인하고 변조를 방지하는 표준적인 방법임을 보여줍니다.