Lewati ke konten utama
Didit Raih $7,5 Juta untuk Membangun Infrastruktur Identitas dan Fraud
Didit
Kembali ke blog
Blog · 15 Juni 2026

Membangun Arsitektur Webhook yang Andal untuk Verifikasi Identitas Real-Time

Arsitektur webhook yang efektif sangat penting untuk verifikasi identitas real-time, memungkinkan respons segera terhadap perubahan status dan memastikan konsistensi data. Panduan ini membahas praktik terbaik untuk membangun webho

Oleh DiditDiperbarui
didit-thumb-88932.png

Merancang arsitektur webhook yang andal untuk verifikasi identitas real-time sangat penting untuk aplikasi yang membutuhkan pembaruan segera mengenai status pemeriksaan identitas pengguna atau bisnis. Webhook menyediakan mekanisme bagi aplikasi Anda untuk menerima notifikasi instan ketika suatu peristiwa terjadi, seperti verifikasi berhasil atau gagal, daripada terus-menerus melakukan polling API.

Peran Webhook dalam Alur Kerja Verifikasi Identitas

Dalam konteks verifikasi identitas, webhook bertindak sebagai saluran komunikasi penting antara penyedia identitas Anda dan aplikasi Anda. Alih-alih berulang kali menanyakan titik akhir API untuk memeriksa apakah proses Know Your Customer (KYC) atau Know Your Business (KYB) telah selesai, webhook mendorong informasi ini kepada Anda saat informasi tersebut tersedia. Pendekatan berbasis peristiwa ini sangat mendasar untuk aplikasi real-time, memungkinkan orientasi pengguna segera, persetujuan transaksi, atau peringatan penipuan.

Pertimbangkan seorang pengguna yang mendaftar untuk suatu layanan. Mereka menyerahkan dokumen identitas mereka untuk verifikasi. Tanpa webhook, aplikasi Anda akan membutuhkan mekanisme polling, yang memperkenalkan latensi dan mengonsumsi sumber daya yang tidak perlu. Dengan webhook, segera setelah penyedia verifikasi identitas memproses dokumen dan menentukan status (misalnya, VERIFIED, REJECTED, PENDING_REVIEW), ia mengirimkan permintaan HTTP POST ke URL yang telah Anda konfigurasi. Aplikasi Anda kemudian memproses peristiwa ini, memperbarui status pengguna, memicu tindakan selanjutnya, atau memberi tahu mereka secara langsung.

Kemampuan real-time ini bukan hanya tentang kecepatan; ini juga tentang pengalaman pengguna dan efisiensi operasional. Misalnya, dalam skenario Wallet Screening (KYT (Know Your Transaction)), notifikasi segera tentang transaksi yang ditandai memungkinkan tindakan cepat, berpotensi mencegah penipuan. Demikian pula, untuk pemantauan berkelanjutan, perubahan status Politically Exposed Person (PEP) pelanggan atau kemunculan daftar sanksi dapat dikomunikasikan secara instan.

Prinsip Inti Arsitektur Webhook yang Andal

Membangun sistem webhook yang andal untuk verifikasi identitas membutuhkan pertimbangan cermat terhadap beberapa prinsip arsitektur.

1. Keamanan

Mengingat sifat sensitif data identitas, keamanan adalah yang terpenting. Payload webhook sering kali berisi informasi identitas pribadi (PII) atau tautan langsung ke sana. Menerapkan langkah-langkah keamanan yang kuat tidak dapat dinegosiasikan.

  • HTTPS Saja: Selalu pastikan titik akhir webhook Anda dilayani melalui HTTPS untuk mengenkripsi data dalam perjalanan.
  • Verifikasi Tanda Tangan: Tindakan keamanan paling kritis. Penyedia verifikasi identitas Anda harus menandatangani setiap payload webhook menggunakan rahasia bersama. Setelah menerima webhook, aplikasi Anda harus memverifikasi tanda tangan ini. Ini mengonfirmasi bahwa permintaan berasal dari pengirim yang sah dan bahwa payload belum dirusak. Misalnya, pendekatan umum melibatkan header X-Didit-Signature yang berisi hash payload dan stempel waktu.
  • IP Whitelisting: Jika penyedia Anda mendukungnya, batasi permintaan webhook yang masuk ke kumpulan alamat IP yang diketahui. Ini menambahkan lapisan pertahanan ekstra terhadap permintaan yang dipalsukan.
  • Pencegahan Serangan Replay: Sertakan stempel waktu dalam payload yang ditandatangani dan tolak permintaan yang secara signifikan lebih lama dari waktu saat ini. Ini membantu mengurangi serangan replay di mana penyerang mengirim ulang webhook lama yang sah.
  • Validasi Input: Selalu validasi struktur dan konten payload webhook yang masuk sebelum memprosesnya.

2. Keandalan dan Idempotensi

Webhook, seperti komunikasi jaringan lainnya, dapat gagal. Arsitektur Anda harus memperhitungkan hal ini.

  • Mekanisme Coba Lagi: Penyedia verifikasi identitas Anda harus menerapkan strategi coba lagi (misalnya, exponential backoff) jika titik akhir Anda tidak tersedia atau mengembalikan kesalahan (misalnya, kode status 5xx). Sebaliknya, titik akhir Anda harus merespons dengan cepat (dalam beberapa detik) untuk menghindari batas waktu, bahkan jika pemrosesan rumit. Jika pemrosesan membutuhkan waktu lebih lama, segera akui webhook dan tunda pekerjaan ke antrean asinkron.
  • Idempotensi: Webhook dapat dikirimkan beberapa kali, baik karena percobaan ulang atau masalah jaringan. Sistem Anda harus dirancang untuk menangani peristiwa duplikat tanpa efek samping. Ini sering kali melibatkan penyimpanan ID peristiwa unik (disediakan dalam payload webhook) dan memeriksa apakah peristiwa tersebut telah diproses sebelum mengambil tindakan. Misalnya, jika status VERIFIED untuk ID pengguna tertentu datang dua kali, memprosesnya lagi tidak boleh mengulang orientasi pengguna atau membuat catatan duplikat.
  • Pemrosesan Asinkron: Setelah menerima webhook, segera kembalikan kode status 200 OK ke pengirim. Dorong pemrosesan aktual peristiwa (misalnya, pembaruan database, memicu layanan lain) ke dalam antrean pesan (seperti RabbitMQ, Kafka, SQS) untuk penanganan asinkron. Ini mencegah titik akhir webhook Anda kehabisan waktu dan memungkinkan pemrosesan yang lebih tangguh.

3. Skalabilitas

Seiring bertambahnya basis pengguna Anda, volume peristiwa verifikasi identitas juga akan bertambah. Arsitektur webhook Anda harus diskalakan sesuai.

  • Titik Akhir Tanpa Status: Rancang penerima webhook Anda sebagai layanan tanpa status. Ini membuatnya mudah untuk diskalakan secara horizontal dengan menambahkan lebih banyak instans di belakang penyeimbang beban.
  • Antrean Pesan: Seperti disebutkan di atas, antrean pesan sangat penting untuk memisahkan penerimaan webhook dari pemrosesannya. Mereka menyerap lonjakan lalu lintas, menyediakan buffering, dan memungkinkan pemrosesan peristiwa secara paralel.
  • Optimasi Database: Pastikan database Anda dapat menangani beban tulis yang dihasilkan oleh peristiwa webhook. Indeks bidang yang relevan dan optimalkan kueri.

4. Observabilitas dan Pemantauan

Mengetahui kapan ada yang salah sangat penting untuk menjaga sistem yang sehat.

  • Pencatatan: Terapkan pencatatan komprehensif untuk semua webhook yang masuk, termasuk payload, header, dan hasil pemrosesan. Catat kesalahan dan percobaan ulang.
  • Peringatan: Siapkan peringatan untuk tingkat kesalahan tinggi pada titik akhir webhook Anda, kegagalan pemrosesan dalam antrean asinkron Anda, atau penundaan yang berkepanjangan dalam pemrosesan peristiwa.
  • Pelacakan: Gunakan pelacakan terdistribusi untuk mengikuti siklus hidup peristiwa webhook dari penerimaan hingga pemrosesannya, terutama ketika beberapa layanan terlibat.

Mengimplementasikan Penerima Webhook

Mari kita pertimbangkan contoh sederhana tentang seperti apa penerima webhook untuk pembaruan status verifikasi identitas. Dengan asumsi Didit mengirimkan notifikasi webhook ketika pemeriksaan KYC selesai:

import json
import hmac
import hashlib
import os
from flask import Flask, request, abort
from celery import Celery # For asynchronous processing

app = Flask(__name__)

# Configure Celery (example with Redis as broker)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

# Your shared secret for webhook signature verification
WEBHOOK_SECRET = os.environ.get('DIDIT_WEBHOOK_SECRET')

@celery.task
def process_kyc_event(event_data):
    # This function runs asynchronously
    event_id = event_data.get('id')
    user_id = event_data.get('user_id')
    status = event_data.get('status')
    # In a real application, you'd check if event_id has already been processed
    # and then update your database, trigger emails, etc.
    print(f"Processing KYC Event ID: {event_id} for User: {user_id} with Status: {status}")
    # Example: Update user status in database
    # db.update_user_status(user_id, status)

@app.route('/webhooks/didit', methods=['POST'])
def didit_webhook():
    if not WEBHOOK_SECRET:
        app.logger.error("DIDIT_WEBHOOK_SECRET is not set.")
        abort(500)

    signature_header = request.headers.get('X-Didit-Signature')
    if not signature_header:
        app.logger.warning("Missing X-Didit-Signature header.")
        abort(400, description="Missing signature header")

    # Extract timestamp and signature from the header
    # Format: t=<timestamp>,v1=<signature>
    signature_parts = dict(part.split('=', 1) for part in signature_header.split(','))
    timestamp = signature_parts.get('t')
    expected_signature = signature_parts.get('v1')

    if not timestamp or not expected_signature:
        app.logger.warning("Invalid X-Didit-Signature format.")
        abort(400, description="Invalid signature header format")

    # Replay attack prevention: check timestamp (e.g., within 5 minutes)
    # current_time = int(time.time())
    # if abs(current_time - int(timestamp)) > 300:
    #     app.logger.warning("Webhook timestamp too old or in the future.")
    #     abort(400, description="Invalid timestamp")

    payload = request.get_data(as_text=True)
    signed_payload = f"{timestamp}.{payload}"

    # Calculate the expected signature
    hashed = hmac.new(WEBHOOK_SECRET.encode('utf-8'), signed_payload.encode('utf-8'), hashlib.sha256)
    calculated_signature = hashed.hexdigest()

    if not hmac.compare_digest(calculated_signature, expected_signature):
        app.logger.warning("Invalid webhook signature.")
        abort(403, description="Invalid signature")

    try:
        event_data = request.json
        # Immediately acknowledge and defer processing
        process_kyc_event.delay(event_data) # Send to Celery queue
        return {"status": "success", "message": "Webhook received and queued"}, 200
    except Exception as e:
        app.logger.error(f"Error parsing webhook payload: {e}")
        abort(400, description="Invalid JSON payload")

if __name__ == '__main__':
    app.run(debug=True, port=5000)

Contoh ini menunjukkan verifikasi tanda tangan dan pemrosesan asinkron menggunakan Celery. Untuk lingkungan produksi, Anda akan menggunakan server web yang andal seperti Gunicorn atau uWSGI, dan memastikan pekerja Celery Anda dikonfigurasi dan dipantau dengan benar.

Poin-Poin Penting

  • Webhook sangat penting untuk verifikasi identitas real-time, memungkinkan respons segera terhadap peristiwa seperti perubahan status KYC/KYB.
  • Keamanan adalah yang terpenting: Selalu gunakan HTTPS, terapkan verifikasi tanda tangan, dan pertimbangkan IP whitelisting serta pencegahan serangan replay.
  • Keandalan menuntut idempotensi, mekanisme coba lagi dari pengirim, dan pengakuan segera dengan pemrosesan asinkron di sisi penerima.
  • Skalabilitas dicapai melalui titik akhir tanpa status dan penggunaan antrean pesan yang efektif.
  • Observabilitas komprehensif (pencatatan, pemantauan, peringatan) sangat penting untuk menjaga sistem webhook yang sehat.

Pertanyaan yang Sering Diajukan

Apa itu webhook dan bagaimana perbedaannya dengan panggilan API?

Webhook adalah pesan otomatis yang dikirim dari aplikasi ketika peristiwa tertentu terjadi, bertindak sebagai "API terbalik" di mana server mendorong data ke klien. Panggilan API, sebaliknya, adalah ketika klien secara eksplisit meminta data dari server.

Mengapa idempotensi penting untuk pemrosesan webhook?

Idempotensi memastikan bahwa memproses peristiwa webhook yang sama beberapa kali akan memiliki efek yang sama dengan memprosesnya sekali. Ini sangat penting karena webhook dapat dikirimkan lebih dari sekali karena masalah jaringan atau mekanisme coba lagi, mencegah tindakan duplikat atau inkonsistensi data.

Bagaimana cara mengamankan titik akhir webhook saya?

Amankan titik akhir webhook Anda dengan selalu menggunakan HTTPS, memverifikasi tanda tangan payload yang masuk, menerapkan IP whitelisting, dan menyertakan stempel waktu dalam tanda tangan untuk mencegah serangan replay.

Apa yang harus dikembalikan oleh titik akhir webhook saya?

Titik akhir webhook Anda harus mengembalikan kode status HTTP 200 OK secepat mungkin untuk mengakui penerimaan. Jika pemrosesan membutuhkan waktu, tunda pekerjaan aktual ke antrean asinkron.

Apa yang terjadi jika titik akhir webhook saya tidak berfungsi?

Jika titik akhir webhook Anda tidak berfungsi atau mengembalikan kesalahan, penyedia verifikasi identitas yang dirancang dengan baik biasanya akan mencoba lagi mengirim webhook dengan strategi exponential backoff, memastikan pengiriman akhirnya setelah titik akhir Anda tersedia kembali.

Didit menyediakan dukungan webhook yang andal sebagai bagian dari infrastrukturnya untuk identitas dan penipuan. Satu API kami terintegrasi dengan lebih dari 1.000 sumber data, memberikan status verifikasi real-time untuk Verifikasi Pengguna (KYC), Verifikasi Bisnis (KYB), Pemantauan Transaksi, dan Wallet Screening (KYT). Anda dapat berintegrasi dalam hitungan menit dan memanfaatkan notifikasi aman dan real-time kami untuk membangun alur kerja identitas yang dinamis dan responsif. Dengan harga pay-per-use publik dan 500 pemeriksaan gratis setiap bulan, Didit memberdayakan organisasi untuk merancang proses verifikasi identitas yang sangat efisien dan sesuai.

Mulai dengan Didit

Didit adalah infrastruktur untuk identitas dan penipuan — satu API, harga pay-per-use publik, dan 500 verifikasi gratis setiap bulan. Tambahkan Verifikasi Pengguna ke alur Anda dan berintegrasi dalam 5 menit.

Infrastruktur untuk identitas dan fraud.

Satu API untuk KYC, KYB, Transaction Monitoring, dan Wallet Screening. Integrasi dalam 5 menit.

Minta AI untuk merangkum halaman ini
Arsitektur Webhook untuk Verifikasi Identitas Real-Time