เชิงเทคนิค · คำตอบพร้อมแหล่งอ้างอิง
การตรวจสอบลายเซ็น webhook (Webhook Signature Verification)
การตรวจสอบลายเซ็น webhook เป็นกระบวนการด้านความปลอดภัยที่ผู้รับตรวจสอบลายเซ็นเข้ารหัสที่แนบมากับคำขอ HTTP ขาเข้า เพื่อให้แน่ใจว่า payload ถูกส่งโดยผู้ให้บริการที่เชื่อถือได้และไม่ถูกแก้ไขระหว่างทาง
ความหมาย
การตรวจสอบลายเซ็น webhook เป็นกลไกที่ใช้ยืนยันแหล่งที่มาของอีเวนต์ webhook เมื่อผู้ให้บริการอย่าง Resend หรือ SendGrid ส่งการแจ้งเตือนเกี่ยวกับอีเวนต์อีเมล จะรวมแฮชของ payload ที่ลงลายเซ็นด้วยคีย์ลับ เซิร์ฟเวอร์ผู้รับใช้คีย์ลับเดียวกันคำนวณแฮชใหม่และเปรียบเทียบกับลายเซ็นที่ให้มาในเฮดเดอร์ของคำขอ
กระบวนการทำงาน
ผู้ให้บริการสร้างแฮช HMAC โดยใช้ shared secret และ body ของคำขอ แฮชนี้ถูกส่งในเฮดเดอร์ ซึ่งมักชื่อ X-Signature หรือคล้ายกัน ผู้รับเก็บ body ดิบของคำขอและเฮดเดอร์ลายเซ็น จากนั้นผู้รับคำนวณแฮช HMAC ของตนเองด้วย shared secret หากแฮชที่คำนวณตรงกับค่าในเฮดเดอร์ คำขอเป็นของแท้ หากต่างกัน คำขอจะถูกปฏิเสธว่าไม่ได้รับอนุญาต
ความสำคัญต่อผู้ส่ง
หากไม่มีการตรวจสอบ ใครก็ตามที่รู้ URL ของ webhook ของคุณสามารถส่งข้อมูลปลอมมายังเซิร์ฟเวอร์ได้ ซึ่งอาจนำไปสู่การอัปเดตฐานข้อมูลผิดพลาด เช่น ทำเครื่องหมายอีเมลที่ส่งถึงแล้วว่าตีกลับ การติดตั้งการตรวจสอบช่วยป้องกันการโจมตีแบบปลอมแปลง และทำให้แน่ใจว่าแอปพลิเคชันตอบสนองเฉพาะอีเวนต์ที่ถูกต้องซึ่งเกิดจากโครงสร้างพื้นฐานอีเมลของคุณ
หมายเหตุการใช้งานจริง
ข้อผิดพลาดที่พบบ่อยคือแยกวิเคราะห์ body ของคำขอเป็นอ็อบเจกต์ JSON ก่อนตรวจสอบลายเซ็น เพราะตัวแยกวิเคราะห์ JSON เปลี่ยนช่องว่างหรือลำดับคีย์ได้ สตริงที่ได้จึงอาจไม่ตรงกับ payload ต้นฉบับที่ผู้ให้บริการใช้ ควรใช้ body ดิบของคำขอที่ยังไม่ได้แยกวิเคราะห์เสมอในการคำนวณ HMAC เพื่อหลีกเลี่ยงความล้มเหลวในการตรวจสอบ
ตัวอย่างการนำไปใช้
ในสภาพแวดล้อม Node.js นักพัฒนาจะใช้โมดูล crypto สร้างแฮช hmac sha256 ของ body ดิบด้วยคีย์ลับของผู้ให้บริการ จากนั้นเปรียบเทียบผลลัพธ์กับเฮดเดอร์ลายเซ็นโดยใช้ฟังก์ชันเปรียบเทียบแบบใช้เวลาคงที่ เพื่อป้องกันการโจมตีแบบ timing SendHQ มีเครื่องมือฟรีที่ https://sendhq.cc/tools เพื่อช่วยจัดการการตั้งค่าอีเมลหลายอย่างที่มักทำก่อนการตั้งค่า webhook
คำถามที่ทีมมักถาม
จะเกิดอะไรขึ้นหากคีย์ลับรั่วไหล
หากคีย์ลับถูกเจาะ ผู้โจมตีลงลายเซ็นคำขอปลอมที่เซิร์ฟเวอร์ของคุณยอมรับว่าถูกต้องได้ คุณต้องหมุนเวียนคีย์ลับทันทีในแดชบอร์ดของผู้ให้บริการ และอัปเดตตัวแปรสภาพแวดล้อมของเซิร์ฟเวอร์
HTTPS ทำให้ไม่ต้องตรวจสอบลายเซ็นหรือไม่
ไม่ HTTPS เข้ารหัสข้อมูลระหว่างส่งและยืนยันตัวตนเซิร์ฟเวอร์ แต่ไม่ยืนยันว่าไคลเอนต์ที่ส่งคำขอคือผู้ให้บริการอีเมลที่ได้รับอนุญาตของคุณ
ทำไมใช้ HMAC แทน API key ธรรมดา
ลายเซ็น HMAC พิสูจน์ว่าเนื้อหาข้อความไม่ถูกดัดแปลง ส่วน API key คงที่ในเฮดเดอร์พิสูจน์เพียงว่าผู้ส่งรู้คีย์ ไม่ได้พิสูจน์ว่า payload สมบูรณ์
แหล่งข้อมูลหลัก
- เอกสาร Resend — Resend
- เอกสารสำหรับนักพัฒนา Postmark — Postmark
- เอกสาร SendGrid — Twilio SendGrid