เจาะลึกระบบ SMS 2FA ใน Node/Express: ซื้อสำเร็จรูปหรือพัฒนาเองดี?
คู่มือการตัดสินใจสำหรับนักพัฒนาเดี่ยวและทีมเล็ก ในการจัดการสถานะการส่ง SMS 2FA และนโยบายสำรองข้อมูล

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- สำหรับ Node/Express เลือกระบบ SMS สำเร็จรูปเมื่อแอปสามารถตรวจสอบสถานะ จัดการการส่งซ้ำ และกำหนดนโยบายสำรองได้เอง
- สำหรับ SaaS รายคน ให้พิจารณารายได้ต่อชั่วโมงของวิศวกร และส่งมอบงานทุกสัปดาห์
- แยกการสร้าง OTP การส่งข้อความ และการยืนยันรหัสออกจากกันอย่างเด็ดขาด
- ใช้การตรวจสอบสถานะแบบกำหนดเวลาด้วย exponential backoff พร้อมกำหนดเส้นตายที่ชัดเจน
สำหรับแบ็กเอนด์ Node/Express ทั่วไป การใช้บริการ SMS 2FA แบบจัดการสำเร็จรูปจะเหมาะสมก็ต่อเมื่อแอปพลิเคชันของคุณมีความสามารถในการตรวจสอบสถานะการส่ง จัดการการส่งข้อความซ้ำ และกำหนดนโยบายสำรองข้อมูลได้ด้วยตนเอง แต่หากการตัดสินใจเหล่านี้จำเป็นต้องครอบคลุมหลายช่องทางในทันที การเลือกใช้ระบบประสานการสื่อสารแบบเรียลไทม์จะเป็นทางเลือกที่ตอบโจทย์กว่า
คำตอบสั้นๆ สำหรับการเข้าสู่ระบบด้วย Node/Express แบบง่ายคือ ให้คงสถานะการยืนยันตัวตนไว้ภายในแอปพลิเคชัน ตรวจสอบสถานะการส่ง SMS ก่อนที่จะเสนอให้ส่งรหัสซ้ำ และจัดเตรียมเส้นทางการกู้คืนบัญชีแยกต่างหากหลังจากพ้นกำหนดเวลาการตรวจสอบสถานะแล้ว สำหรับผู้ให้บริการ SaaS ที่ทำคนเดียว มุมมองที่มีประโยชน์ที่สุดคือรายได้ต่อชั่วโมงของวิศวกร จงส่งมอบงานทุกสัปดาห์ ส่งงานขนส่งข้อมูลที่ไม่ซับซ้อนให้ภายนอกจัดการ แต่ห้ามส่งมอบการตัดสินใจเรื่องการเข้าสู่ระบบให้ผู้อื่นเด็ดขาด
แนวทางปฏิบัติคือให้มองการสร้างรหัส OTP การส่งข้อความ และการตรวจสอบรหัส เป็นข้อเท็จจริงที่แยกออกจากกัน คำขอส่งข้อความสามารถได้รับการยอมรับในขณะที่สถานะการส่งยังไม่เป็นที่แน่ชัด และข้อความที่ส่งถึงแล้วก็ไม่ได้เป็นเครื่องพิสูจน์ว่าผู้ที่กำลังป้อนรหัสเป็นเจ้าของบัญชีนั้นจริงๆ ดังนั้นแอปพลิเคชันจึงจำเป็นต้องมีบันทึกความพยายามและสถานะการเปลี่ยนผ่านของตนเอง แทนที่จะพึ่งพาเพียงค่าบูลีนสถานะการส่งที่บอกว่าส่งแล้วเพียงอย่างเดียว

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
โมเดลสถานะแอปพลิเคชันที่กะทัดรัดอาจประกอบด้วยสถานะต่างๆ เช่น created, delivery_pending, retry_available, verified และ expired ซึ่งสถานะเหล่านี้เป็นสถานะภายในระบบ ไม่ใช่ฟิลด์การตอบกลับจากผู้ให้บริการภายนอก หลังจากร้องขอรหัส OTP ระบบจะต้องบันทึกตัวระบุข้อความที่ส่งกลับมาพร้อมกับความพยายามในการเข้าสู่ระบบครั้งนั้น และตรวจสอบสถานะตามตารางเวลา หากการส่งไม่สำเร็จ ให้เปิดให้มีการส่งซ้ำภายใต้ขอบเขตที่จำกัด หรือย้ายผู้ใช้งานไปยังวิธีการกู้คืนทางเลือกอื่น ส่วนการตรวจสอบรหัสยังคงเป็นการดำเนินการที่แยกต่างหาก ตามด้วยการสร้างเซสชันก็ต่อเมื่อการตรวจสอบของแอปเองผ่านแล้วเท่านั้น
การวิเคราะห์เชิงลึก: ความท้าทายหลักของการใช้งาน SMS 2FA คือเหตุการณ์ข้อมูลล่าช้า เนื่องจากเหตุการณ์การส่งข้อความในลักษณะนี้เป็นการดึงข้อมูล (pull-only) ไม่มีเว็บฮุกที่จะปลุกแบ็กเอนด์ทันทีที่สถานะจากผู้ให้บริการมือถือเปลี่ยนไป การออกแบบสถาปัตยกรรมจึงต้องพึ่งพางานเบื้องหลัง (background worker) ที่ตั้งเวลาไว้เพื่อดึงผลลัพธ์ แทนที่จะปล่อยให้เวลาของเครือข่ายมือถือกลายมาเป็นนโยบายความปลอดภัยของระบบ
กรณีที่ยุ่งยากอย่างข้อมูลที่ล่าช้าสมควรได้รับความสนใจมากกว่าเส้นทางที่ราบรื่น เนื่องจากเหตุการณ์การส่งมอบที่นี่เป็นแบบดึงข้อมูลเท่านั้น ไม่มีเว็บฮุกปลุกแบ็กเอนด์ในวินาทีที่ผลลัพธ์ของเครือข่ายมือถือเปลี่ยนไป ลองจินตนาการถึงความพยายามครั้งหนึ่งที่เคลื่อนผ่านระบบ: เซิร์ฟเวอร์ขอรหัส จัดเก็บตัวระบุข้อความ และทำเครื่องหมายบันทึกของตนเองว่าเป็น delivery_pending จากนั้นผู้ปฏิบัติงานที่ตั้งเวลาไว้จะอ่านผลการขนส่งและอัปเดตบันทึกนั้น ในขณะที่เบราว์เซอร์จะร้องขอเฉพาะสถานะของแอปพลิเคชันเท่านั้นและไม่สามารถกระตุ้นการส่งที่ไม่สามารถควบคุมได้ หากผลลัพธ์ยังคงรอดำเนินการ ผู้ปฏิบัติงานจะรอ หากการส่งไม่สำเร็จ แอปจะเป็นผู้ตัดสินว่าความพยายามนั้นมีสิทธิ์ที่จะส่งซ้ำอย่างชัดเจนหรือไม่ หรือต้องย้ายไปสู่ขั้นตอนการกู้คืน
อย่าส่งข้อความซ้ำในทุกๆ ผลลัพธ์ที่รอดำเนินการ เพราะข้อความสองฉบับที่มาถึงผิดลำดับจะสร้างความสับสน และวงจรอัตโนมัติอาจทำให้เกิดการละเมิดและต้นทุนที่บานปลาย ให้ใช้การตรวจสอบสถานะด้วยแบบจำลอง exponential backoff ที่มีขอบเขตจำกัด หยุดเมื่อถึงกำหนดเวลาที่ผลิตภัณฑ์เลือก แล้วจึงค่อยบังคับให้ผู้ใช้ดำเนินการอย่างชัดเจน แนวทางด้านความปลอดภัยของ OWASP เป็นพื้นฐานความปลอดภัยที่สำคัญ เช่น การส่งข้อความตอบกลับที่สอดคล้อง รักษาเวลาตอบสนองให้คงที่ ใช้ช่องทางสำรอง จำกัดอัตราคำขอ ทำให้รหัสใช้ได้ครั้งเดียว และจัดเก็บอย่างปลอดภัย
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น