วันที่เราแก้ไข Signup Pipeline ของเรา
ตัวเลขการสมัครสมาชิกของเราเพิ่มขึ้นทุกสัปดาห์ ทีมงานรู้สึกตื่นเต้น แต่ข้อมูลกลับดูผิดปกติ ผู้ใช้ไม่เคยกลับมาอีกเลย อีเมลดูแปลกๆ อัตราการเปิดใช้งาน (activation rate) ของเราลดลง
ผมดูข้อมูล ผมไม่พบการเติบโต แต่ผมพบสัญญาณรบกวน (noise)
ปัญหา
ผมรัน query เพื่อจัดกลุ่มการสมัครสมาชิกตาม IP address พบว่า IP address หนึ่งมีการลงทะเบียนบัญชีหลายร้อยบัญชีภายใน 24 ชั่วโมง โดยใช้ browser fingerprint เดียวกัน มีสคริปต์กำลังยิงมาที่ register endpoint ของเรา โดยใช้อีเมลแบบใช้แล้วทิ้ง (throwaway email domains) มันคือบอท ไม่ใช่คน
ระบบ Signup Pipeline ของเราเปิดกว้างเกินไป
วิธีแก้ไข
เราสร้างระบบป้องกัน 3 ชั้นภายในหนึ่ง sprint
ชั้นที่ 1: Throttling
เราใช้การจำกัดความเร็ว (rate limiting) สองรูปแบบ:
- Per-IP throttling: เราจำกัดจำนวนครั้งในการพยายามสมัครสมาชิกจาก IP หนึ่งในช่วงเวลาสั้นๆ
- Per-domain throttling: เราจำกัดการสมัครสมาชิกจากโดเมนอีเมลเดียวกันในช่วงเวลาที่ยาวขึ้น วิธีนี้จะหยุดบอทที่ใช้ IP ต่างกันแต่ใช้โดเมนเดียวกัน
ชั้นที่ 2: Blocklists
- Blocked email domains: เราปฏิเสธการลงทะเบียนใดๆ ที่ใช้อีเมลแบบใช้แล้วทิ้ง (disposable email domains)
- Blocked user agents: เราปฏิเสธคำขอจากเครื่องมือที่ไม่ใช่เบราว์เซอร์ โดยเราจะไม่ให้รายละเอียดใดๆ แก่ผู้โจมตี
ชั้นที่ 3: IP Blocklist
IP บางตัวมีความพยายามสูง พวกเขาละเมิดระบบของเราในหลายส่วน เราจึงใช้ hard blocklist โดย IP เหล่านี้จะถูกปฏิเสธในทุกคำขอ Middleware จะหยุดพวกเขาในทันที
ผลลัพธ์
ก่อนการแก้ไข:
- IP หนึ่งสร้างบัญชีหลายร้อยบัญชีในหนึ่งวัน
- โดเมนแบบใช้แล้วทิ้งคิดเป็นส่วนใหญ่ของการสมัครสมาชิก
- บัญชีปลอมทำให้อัตราการเปิดใช้งาน (activation rate) ของเราต่ำลง
- ข้อมูลของเราผิดพลาด
หลังการแก้ไข:
- การปั๊มบัญชี (Registration farming) ลดลงเหลือศูนย์
- การสมัครสมาชิกด้วยโดเมนแบบใช้แล้วทิ้งหยุดลง
- ตัวเลขการสมัครสมาชิกแสดงถึงความตั้งใจของมนุษย์จริงๆ
- อัตราการเปิดใช้งานของเรากลับมาเป็นปกติ
บทเรียนที่ได้รับ
- สัญญาณ (Signal) สำคัญกว่าปริมาณ (Volume) บอททำให้ตัวชี้วัดอย่าง retention และ revenue เชื่อถือไม่ได้
- การแก้ไขโค้ดเล็กๆ สามารถแก้ปัญหาใหญ่ได้ เราใช้กลไกง่ายๆ เพียงสามอย่าง
- การมีหลายชั้นเป็นสิ่งจำเป็น การจำกัดเพียงชั้นเดียวไม่เพียงพอ การผสมผสานหลายวิธีจะครอบคลุมได้มากกว่า
- ควบคุมการตอบสนองของคุณ ให้ข้อมูลตอบกลับ (feedback) แก่ผู้ใช้ที่ถูกต้อง แต่ให้ความเงียบแก่ผู้ไม่หวังดี
การเติบโตไม่ใช่แค่การได้ผู้ใช้มา แต่คือการได้ผู้ใช้จริงๆ การตัดสินใจเกี่ยวกับผลิตภัณฑ์ของคุณขึ้นอยู่กับข้อมูลที่ดี และข้อมูลนั้นเริ่มต้นที่ register endpoint ของคุณ
Source: https://dev.to/ogeobubu/the-day-we-fixed-our-signup-pipeline-3664