ทำไมคุณไม่ควรสร้างระบบยืนยันตัวตนของตัวเอง: บทเรียนจากสิบๆ การสัมภาษณ์ลูกค้า
คุณสามารถสร้างระบบยืนยันตัวตนเองได้ภายในหนึ่งวัน และมันก็ทำงานไปหลายปี แต่ต้นทุนจริงจะปรากฎขึ้นเมื่อธุรกิจคุณเปลี่ยนแปลง บทเรียนจากการสัมภาษณ์ธุรกิจ B2B หลายสิบครั้ง
ระบบยืนยันตัวตนดูเหมือนจะเป็นสิ่งที่คุณสร้างเองได้ง่าย ๆ อีเมล รหัสผ่าน แฮชมัน แล้วเทียบตอนล็อกอิน มันจะยากอะไรแค่ไหนกับการสร้างระบบยืนยันตัวตนเอง?
คุณทำได้ นั่นคือกับดัก
เราได้พูดคุยกับหลายทีมที่สร้างระบบยืนยันตัวตนของตัวเอง ส่วนใหญ่มาหาเราเพราะเหตุผลเดียวกัน: ระบบนี้กลับกลายเป็นตัวถ่วงธุรกิจ
แต่ละอุตสาหกรรม, เทคโนโลยี, และขนาดท ีมต่างกัน แต่มักจบแบบเดียวกัน ระบบยืนยันตัวตนที่สร้างขึ้นกลายเป็นหนี้สินที่ทีมต้องแบกไว้
ส่วนที่แปลกคือมันไม่เคยแสดงอาการเป็นระบบล่ม ระบบก็ให้คนล็อกอินและทำงานได้ดี จนกระทั่งวันหนึ่งที่ธุรกิจเปลี่ยน เช่น การรีวิวความปลอดภัย, ได้ลูกค้าองค์กรรายแรก, การเข้าซื้อกิจการ, หรือฟีเจอร์ใหม่ ๆ ที่อยู่ข้ามสองโปรดักต์
สัปดาห์ก่อนมันยัง "โอเค" จากนั้นสิ่งถัดไปใน roadmap ก็ติดอยู่กับมัน
ความผิดพลาดใหญ่ที่สุดของ auth แบบทำเอง คือ คิดว่ามันเป็นแค่ฟีเจอร์ คุณเขียนมันได้ตั้งแต่วันแรก แต่หลังมีผู้ใช้งานจริง ข้อมูลผู้ใช้ องค์กร และสิทธิ์เข้าถึงจะพันกันไปหมด
การยืนยันตัวตนไม่ใช่ฟีเจอร์ แต่มันคือโครงสร้างพื้นฐานด้านตัวตน
เบื้องหลังหน้าล็อกอินคือโมเดลตัวตนทั้งระบบ
ทุกระบบยืนยันตัวตนที่สร้างเองล้วนเริ่มต้นเหมือนกัน รับอีเมลและรหัสผ่าน แฮชแล้วเก็บ เทียบตอนล็อกอิน โค้ดสี่สิบบรรทัด สะอาดเรียบร้อย
ปัญหาเริ่มหลังจากปล่อยใช้งานจริง บอทถล่ม endpoint สมัครสมาชิก คุณก็ต้องใส่ rate limit, CAPTCHA, การแยกแยะอุปกรณ์ อีกเช้าระบบ SMS ส่งโค้ดไม่ออก คุณก็ไปเพิ่มระบบ retry และจำกัดจำนวนครั้ง/วัน จากนั้นงานที่ยากขึ้นก็ตามมา: ระบบรีเซ็ตรหัสผ่านอย่างปลอดภัย, MFA และ Flow กู้บัญชี, เซสชันกับรีเฟรชโทเคน, และโมเดล permisssion ที่ซับซ้อนกว่าแค่ is_admin boolean
แต่ละเรื่องไม่ยากเอง ทำจบในหนึ่ง sprint ได้ แต่ทุกครั้งที่คุณเพิ่มอะไรเข้าไป คุณก็กำลังต้องตอบคำถามใหญ่ขึ้นในนามของโปรดักต์
พอคำตอบแต่ละข้อถูกวางต่อยอดทับกันไป มันก็ คือโมเดลตัวตนที่โปรดักต์ของคุณเชื่อว่าใช่: ใครคือผู้ใช้, คนหนึ่งมีได้หลายองค์กรไหม, ลูกค้าองค์กรจะต่อกับระบบยืนยันตัวตนของตัวเองอย่างไร, เวลาคนลาออกจะดึงสิทธิ์คืนอย่างไร
แต่ละฟีเจอร์ที่เขียนต่อจากนั้นก็อาศัยคำตอบเหล่านั้นไป, และยิ่งระบบรันมานาน แก้ไขก็ยิ่งยากขึ้น
เราเห็นเรื่องนี้เกิดจริงที่บริษัทหนึ่ง: SaaS B2B แนวตั้ง, อยู่มา 20 ปี, ให้บริการธุรกิจหน้าร้าน พวกเขาสร้าง auth เองมากว่าทศวรรษ มีระบบล็อกอินแยกต่อรายลูกค้า permission ฝังกระจายอยู่ใน business module ตอนนั้นมันดูสมเหตุสมผล
ยี่สิบปีต่อมา สิ่งที่ต้องการคือ "หน้าล็อกอินรวม" ใช้อีเมลเป็นชื่อผู้ใช้ ฟังดูเล็กน้อยแต่ไม่ใช่แค่การเปลี่ยนหน้าเว็บ เพราะ logic เฉพาะกระจายอยู่ในร้อย ๆ module การรวมล็อกอินจึงกลายเป็นต้องไปแตะทั้ง user model, org model, migration credential และขอบเขต permission ทั้งหมด สุดท้ายไม่มีใครอยากเซ็นรับ ก็เลยยืดเวลาออกไปเป็นปี
เมื่อเขียน login page ครั้งแรกมันเหมือนแค่ฟีเจอร์ แต่สิ่งที่ทิ้งไว้ข้างหลังคือโมเดลตัวตนทั้งชุด
เมื่อธุรกิจขยาย, auth ที่ทำเองก็เริ่มไม่เพียงพอ
พูดตามตรง, auth ที่ทำเองมักจะรันได้ยาวนาน มันล็อกอินผู้ใช้, refresh session, และขับเคลื่อนธุรกิจปีต่อปี ความซับซ้อนเพิ่มขึ้นช้า ๆ ทีละนิด คุณก็แก้ทีละจุดด้วยความมั่นใจว่าคุมได้
แต่การบอกว่า "เพียงพอ" ส่วนมากแปลว่าธุรกิจยังไม่ชนกำแพงเท่านั้น พอวันนั้นมาถึง ปัญหามักไม่ได้เกิดที่ auth โดยตรง แต่มันคือธุรกิจรอบข้างเปลี่ยนไป และ "เพียงพอ" ก็กลายเป็น "ขวางทาง" ทันที
สถานการณ์ตัวอย่างเหล่ านี้เกิดขึ้นแทบทุกโปรดักต์เมื่อขยายตัว ทั้งหมดดูต่างกัน แต่แก่นแท้คือนี่: ธุรกิจเดินไปข้างหน้า แต่ identity model เดิมไปไม่ไหว
ลูกค้าองค์กรขอ SSO
โจทย์: ลูกค้าต้องการล็อกอินด้วย IdP ของตัวเอง แต่ระบบ auth คุณไม่รู้จัก "identity provider ของคนอื่น" เลย
ดีลลูกค้าองค์กรรายแรกมาถึง ฝ่ายจัดซื้อส่งเอกสาร requirement มา เริ่มที่ SSO ผ่าน Microsoft Entra หรือ Google Workspace ถัดมาคือทั้ง SAML และ OIDC เพราะลูกค้ารายต่อไปใช้แบบอื่น เพิ่ม SCIM ให้ provision/deprovision พนักงานอัตโนมัติ
แต่ละบริษัทเซ็ตอัพต่าง workflow, โปรโตคอล, mapping ฟิลด์, ตารางอายุใบรับรอง, mapping โครงสร้างองค์กร
และแทบไม่มีงานไหน reuse ได้ ลูกค้ารายใหม่มาก็ IdP ใหม่ เซ็ตใหม่เกือบหมด SSO ไม่ใช่ฟีเจอร์ที่สร้างแล้วจบ ทุกครั้งที่คุณ signed ลูกค้า องค์กร, คุณ build อีกรอบ และต้นทุนก็เพิ่มขึ้นตามจำนวนนั้น
Auth ไม่ได้แค่ "ให้ผู้ใช้ล็อกอินแอปคุณ" อีกต่อไป แต่คือ "ให้แอปคุณเชื่อมกับ identity system ของลูกค้า" กลายเป็นงานสองแบบที่ต่างกันสุดขั้ว
เจอเคสบริษัทหนึ่ง ที่ SSO ทั้งหมดเซ็ตมือหมด และมีวิศวกรคนเดียวเท่านั้นที่เข้าใจแบบ end-to-end ถ้าเขาอยู่ ลูกค้าขึ้นระบบได้ ถ้าไม่อยู่ ฝ่ายขายกับ onboarding ก็ติดคิว ถ้าเขาออก ความรู้ก็จากไปด้วย
ไม่มีเรื่องนี้ในวันแรกที่ตัดสินใจสร้าง auth เองเลย
โปรดักต์ต้องการรวม identity ที่กระจายกันหลายระบบ
โจทย์: ข้อมูลตัวตนแตก fragmentation ตามองค์กรและแต่ละโปรดักต์ และเมื่อธุรกิจขยายก็ต้องการ identity รวมเดียว
บริษัท 20 ปีข้างต้นเจอประเด็นนี้ตอนรวมล็อกอิน และเคสแบบนี้พบได้ทุกที่ เราเคยร่วมงานกับแพลตฟอร์มที่มี 9 โปรดักต์มาจากการควบรวม ก็ต่างแยก auth และ store ผู้ใช้ของตัวเอง
การควบรวมกิจการไม่ได้รวม auth ให้คุณ ทุกโปรดักต์คืออีก auth stack และการดูแล auth 9 ก้อนขนานกัน ต้องใช้คนจำนวนจริงจัง
คำถามเริ่มกองโต: คนเดียวกันนับเป็น user เดียวหรือสองคนข้ามโปรดักต์? จะ map องค์กรลูกค้าเดียวกันข้าม 2 ระบบอย่างไร? สิทธิ์ข้ามโปรดักต์ตรวจสอบยังไง? ถ้าพนักงานลาออก ถอนสิทธิ์ออกจาก 9 โปรดักต์พร้อมกันยังไง? จะ audit อะไรได้บ้าง?
แต่ละ auth ไม่ได้พัง ร่วมกันแล้วมันคือ wall
"รวม identity" ดูเหมือนแค่ฟีเจอร์ แต่ในโค้ดคือการนิยามใหม่ของพื้นฐานสุด: อะไรคือนิยาม "user" และ "org" ทุกฟีเจอร์บน ๆ พิงตรงนี้หมดย้ายแล้วต้องถอดหมด
ยุค AI: agent และ CLI เข้าถึงระบบในนามผู้ใช้
โจทย์: ไม่ใช่แค่คนล็อกอินจาก browser อีกต่อไป แต่ agent, CLI, script ต่างก็อ้างว่าทำแทนผู้ใช้ ขณะที่ auth ของคุณรู้จักแค่การล็อกอินผ่านหน้าเว็บ
agent ต้องเรียก internal tools ในนาม user, MCP server ต้องเปิด resource แบบป้องกัน, CLI ต้อง retrieve ข้อมูล account โดยไม่มี browser
สามอย่างนี้ต้องการคำตอบเดียวกัน: request นี้แทนใคร, แตะ resource อะไรได้, token ออกให้ใคร, มีขอบเขตอะไร, ถอน revoke ยังไง, log ว่าเป็น user หรือ agent
ระบบเก่าไม่ได้สร้างกลไกเพื่อรองรับเหล่านี้ MCP พึ่ง OAuth issue authorization CLI ต้อง login ผ่าน OAuth หรือใช้ personal access token แทนคน เพื่อให้สามารถ revoke ได้ตลอดเวลา ซึ่งไม่มีอะไรทำมาเพื่อหน้า login page เลย
หาก auth คุณออกแบบรอบ user คนเดียว login หน้าเว็บ ตอนนี้คือต้อง handle client ที่มาแทน user

