Integrasi antarsistem melalui webhook dan notifikasi HTTP memungkinkan aplikasi bertukar data secara otomatis begitu suatu peristiwa terjadi. Namun, endpoint yang terbuka untuk menerima data rentan terhadap ancaman manipulasi muatan (payload tampering) dan pemalsuan identitas pengirim (spoofing). Untuk memastikan bahwa data yang diterima benar-benar sah dan tidak dimodifikasi di tengah transmisi, sistem penerima perlu melakukan verifikasi tanda tangan kriptografi terhadap setiap permintaan yang masuk.
Penerapan validasi tanda tangan bergantung pada arsitektur penyedia layanan, baik menggunakan skema kunci simetris berbasis HMAC maupun kunci asimetris berbasis sertifikat publik. Selain itu, mengamankan endpoint publik juga dapat dikombinasikan dengan pembatasan akses jaringan, seperti penerapan konfigurasi rate limiting untuk mencegah serangan denial of service pada jalur komunikasi data.
Pentingnya Verifikasi Keaslian dan Integritas Notifikasi Pesan
Ketika server membuka rute HTTP untuk menerima pembaruan dari layanan eksternal, rute tersebut berpotensi menerima permintaan tiruan dari pihak yang tidak bertanggung jawab. Tanpa mekanisme otentikasi data, aplikasi berisiko memproses instruksi palsu yang dapat merusak data operasional atau memicu proses bisnis yang tidak valid.
Berdasarkan dokumentasi resmi Amazon Simple Notification Service (Amazon SNS), memverifikasi tanda tangan pesan saat menggunakan permintaan berbasis HTTP memastikan dua pilar utama keamanan informasi, yaitu keaslian (authenticity) dan integritas (integrity) pesan. Proses ini menegaskan bahwa pesan berasal dari pengirim resmi dan isinya belum diubah selama transit melewati jaringan publik.
Secara umum, validasi tanda tangan digital pada webhook dan notifikasi pesan memberikan perlindungan sistem melalui beberapa mekanisme:
- Mencegah Spoofing: Memastikan payload dibuat oleh pihak yang memegang kunci privat atau rahasia bersama (shared secret) yang sah.
- Menjaga Integritas Data: Setiap perubahan satu karakter pada isi payload akan menyebabkan nilai hash tanda tangan tidak cocok, sehingga pesan yang rusak dapat langsung ditolak.
- Mencegah Repudiation: Pengirim yang terotentikasi tidak dapat menyangkal asal-usul payload yang telah ditandatangani secara kriptografis.
Mekanisme Validasi Signature Payload Webhook Menggunakan SHA256
Pada model integrasi menggunakan shared secret, penyedia layanan menandatangani payload mentah menggunakan algoritma berbasis HMAC (Hash-based Message Authentication Code). Contoh standar industri dari implementasi ini dijelaskan dalam dokumentasi Webhooks Meta untuk Platform Messenger, di mana seluruh payload notifikasi peristiwa ditandatangani menggunakan SHA256.
Tanda tangan dikirimkan melalui header HTTP dengan nama X-Hub-Signature-256 yang diawali oleh format sha256=. Untuk memvalidasi keaslian payload yang diterima, server penerima perlu menjalankan langkah-langkah komputasi berikut:
- Mengekstrak nilai tanda tangan dari header
X-Hub-Signature-256dan memisahkan prefikssha256=untuk mendapatkan nilai hash murni. - Mengambil raw body (byte mentah) dari payload permintaan JSON yang diterima tanpa melakukan parsing terlebih dahulu.
- Membuat hash HMAC-SHA256 dari buffer payload tersebut menggunakan App Secret yang hanya diketahui oleh platform pengirim dan aplikasi penerima.
- Membandingkan hash yang dihitung secara mandiri dengan hash yang diterima pada header permintaan. Jika nilainya identik, payload dinyatakan asli.
Terdapat aspek teknis yang harus diperhatikan dalam validasi payload webhook ini. Meta membuat tanda tangan menggunakan versi karakter escaped unicode dengan digit heksadesimal huruf kecil (contohnya karakter äöå diubah menjadi \u00e4\u00f6\u00e5). Jika verifikasi dihitung langsung pada byte yang sudah didekodekan tanpa memperhatikan format representasi karakter tersebut, perhitungan hash akan menghasilkan nilai yang berbeda dan menyebabkan validasi gagal.
Selain verifikasi tanda tangan, pengelolaan pengiriman ulang (retry delivery) juga perlu ditangani. Layanan pengirim webhook biasanya akan mencoba mengirim ulang notifikasi bila endpoint sempat tidak merespons, sehingga server penerima harus menerapkan fungsi deduplikasi data dan membaca kolom timestamp pada payload untuk mempertahankan urutan kronologis pesan.
Prosedur Memverifikasi Tanda Tangan Pesan Notifikasi Berbasis HTTP
Berbeda dengan skema shared secret, layanan pengiriman pesan terdistribusi berskala besar seperti Amazon SNS menggunakan skema tanda tangan asimetris. Pengirim menandatangani data menggunakan kunci privat, sedangkan server penerima memverifikasi keasliannya menggunakan kunci publik yang diambil dari sertifikat digital X.509.
Berdasarkan panduan teknis Amazon SNS, proses verifikasi pesan berbasis kueri HTTP mencakup prosedur komprehensif berikut:
1. Ekstraksi Data JSON dan Validasi URL Sertifikat
Dokumen JSON yang diterima melalui metode HTTP POST diurai untuk mendapatkan bidang metadata. Temukan URL sertifikat pada kolom SigningCertURL. Demi alasan keamanan, pastikan URL tersebut berasal dari domain resmi terpercaya (seperti domain dengan format https://sns.[region].amazonaws.com/) dan tolak URL dari domain luar sebelum mengunduh sertifikat.
2. Pengambilan Kunci Publik
Unduh sertifikat X.509 dari URL yang telah divalidasi, lalu ekstrak kunci publik (public key) dari file sertifikat tersebut menggunakan utilitas kriptografi seperti OpenSSL.
3. Membangun String Penandatanganan (String-to-Sign)
Tanda tangan dibuat bukan dari dokumen JSON utuh, melainkan dari susunan pasangan kunci-nilai (key-value pairs) yang diatur dengan urutan abjad (byte-sort order) yang ketat. Nilai yang disertakan tergantung pada jenis pesan (kolom Type):
- Pesan Notification: Memuat bidang
Message,MessageId,Subject(hanya jika ada pada pesan asli),Timestamp,TopicArn, danType. - Pesan Konfirmasi (SubscriptionConfirmation / UnsubscribeConfirmation): Memuat bidang
Message,MessageId,SubscribeURL,Timestamp,Token,TopicArn, danType.
Format penyusunan dilakukan dengan pola baris bergantian (KeyName\nValue\n...) tanpa menambahkan karakter baris baru di akhir string penandatanganan. Jika terdapat karakter yang di-escape (seperti \n), karakter tersebut harus dikembalikan ke bentuk aslinya untuk memastikan kecocokan data.
4. Dekode dan Validasi Tanda Tangan
Nilai pada kolom Signature di dalam dokumen JSON dikodekan dalam format Base64. Dekode nilai tersebut menjadi bentuk biner mentah. Periksa bidang SignatureVersion untuk menentukan algoritma verifikasi; versi 1 menggunakan SHA1, sedangkan versi 2 menggunakan algoritma SHA256.
Lakukan verifikasi tanda tangan biner terhadap string-to-sign yang telah disusun menggunakan kunci publik. Jika keluaran verifikasi valid (Verified OK), sistem dapat melanjutkan pemrosesan payload ke logika bisnis internal. Sebaliknya, bila verifikasi gagal, permintaan harus segera ditolak untuk mencegah injeksi data yang tidak sah.
Dengan menerapkan validasi tanda tangan secara konsisten pada setiap integrasi webhook dan endpoint HTTP, sistem bisnis terlindungi dari risiko manipulasi data dan potensi serangan injeksi di tingkat arsitektur.
