วันนี้เราจะมาพูดถึง การ login โดยใช้ jwt ในการ authenticate สำหรับเว็บที่ต้องการเก็บข้อมูลผู้ใช้งาน และนี่ คือ 3หัวข้อหลักๆ. ที่จะพูดวันนี้ตั้งแต่……. คืออะไร ทำไม ใช้อะไร
(ไม่มีโค๊ด)
1.authentication คืออะไร…?
authentication คือ การเช็คความถูกต้องและยืนยันตัวตน เปรียบเสมือนสัญลักษณ์พิเศษมอบให้กับผู้ใช้งานที่Loginเข้ามา เพื่อได้รับสิทธ์แก้ไขข้อมูล หรือ นำข้อมูลไปใช้บางอย่าง ยกตัวอย่าง….. คุณไปซื้อลูกอมที่ร้านขายลูกกวาด และเป็นผู้โชคดีได้ลูกอมฟรี1ชิ้นในวันถัดไป เพื่อป้องกันการแอบอ้าง เจ้าของร้านจึงมอบโค๊ดลับกับคุณ
คุณเท่านั้นที่รู้โคดลับ นำมาแลกลูกอมได้ และคนอื่นก็ไม่สามารถแอบอ้างมารับลูกอมได้เช่นกัน เพราะเขาไม่ได้รับโคด และนี่คือการauthentication
2.ทำไมต้องยึดหลัก Authentication
จริงๆ authenticate จะไม่จำเป็นเลย ถ้าตัวเว็บไซต์ของเรา ไม่มีการเก็บข้อมูล เป็นเพียง เว็บ ที่ ให้ข้อมูลกับผู้ใช้งานเพียงอย่างเดียว แต่ถ้า….เมื่อเราต้องการให้ เว็บไซต์ของเรา สามารถเก็บข้อมูลจำเพาะของผู้ใช้แต่ระรายที่เข้ามาใช้บริการเว็บไซต์ของเราแล้วนั้น หลัก authentication จะเข้ามามีบทบาททันที
เหตุผล…..
เมื่อ เกิดการเก็บข้อมูลเกิดขึ้น ปัญหาที่ต้องคำนึงเลยก็คือ
1) ต้องระบุตัวตนได้ว่าใครเป็นใคร
2) ข้อมูลที่เก็บ เจ้าของไอดีเท่านั้นถึงจะเข้าถึงได้
3)บุคคลอื่นไม่สามารถแอบอ้างว่าเป็นเจ้าของไอดีนี้ได้
ถ้าเราไม่ยึดหลัก authentication เว็บไซต์ของเราจะเกิดปัญหา 3 อย่างข้างต้นนี้ได้ง่าย ยิ่งถ้าเป็นเว็บไซต์ที่ต้องปกป้อง ข้อมูลหรือการแอบอ้างตัวตน ที่การแอบอ้างการเป็นตัวเรานั้นก่อให้เกิดความเสียหายได้ เช่น ถ้าเรามีแอพธนาคารก็ไม่อยากให้ใครคนอื่นสามารถแอบอ้างว่าเป็นตัวเราและโอนเงินของเราออกไป คงไม่ดีแน่ๆ
3.ใช้อะไรในการทำ Authentication
การทำ authentication สามารถใช้เครื่องมือได้หลายอย่าง แต่สำหรับ บทความนี้ ขอยกตัวอย่าง เป็น jwt เพราะ ถือวันทันสมัย ใช้งานได้ดี
…..องค์ประกอบของ Json web Token(JwT)
. 1) header ส่วนนี้ประกอบด้วย -ประเภทของโทเคน – algorithm ที่ใช้เข้ารหัส
. 2) payload ส่วนนี้ประกอบด้วย – ข้อมูลของuser ที่ต้องการส่งมาให้ใช้ – วันกำเนิด และหมด อายุของ token
. 3) signature *ส่วนสำคัญของ jwt เป็นตัวบ่งชี้ว่า token ที่ส่งมา นั้น เป็นของจริงหรือไม่
เพราะถ้า token สามารถปลอมแปลงได้ถือว่าป่าวประโยชน์
……..เหตุการณ์จำลอง
นาย A login เข้ามา เซิฟเวอร์ตรวจสอบไอดี แล้วส่ง token มาให้นาย A ไปใช้ ส่วนที่นาย A ใช้ก็คือ payload ที่เก็บข้อมูล อาจจะมีข้อมูลคืออายุ ถ้าtokenไม่มีส่วนที่เอาไว้ตรวจสอบว่าของจริงหรือของปลอม นายA จะสามารถแก้ไขอายุ เป็น 18ปีได้ทั้งทีจริงแล้วเนี่ยอายุแค่ 17ปี เพื่อที่จะเข้าส่วนที่ต้องห้ามได้
. ……..ตัว signature จะเข้ามาทำหน้าที่ตรวจสอบความถูกต้อง
. โดยวิธีการทำงานของมันคือ นำส่วน header กับ payload ที่ผ่านการ encryptions มาต่อกันแล้วทำการ hash (ใช้ รหัสลับที่ทางฝั่งเซิฟเวอร์เท่านั้นที่รู้ นำ2ส่วนมาเข้ารหัส)(ถ้าไม่เข้าใจควรศึกษาเรื่อง encrypt กับ การ hash ก่อน )
สิ่งที่ผ่านการ hash มาแล้ว เราจะนำมาใช้เป็น signature
หมายความว่า ถ้าข้อมูลใน payload เปลี่ยนไป signature จะต้องเปลียนด้วย
เพื่อให้เห็นภาพจะ สมมุติ จำลอง token ขึ้นมา นาย A login เข้าระบบ มา เซิฟเวอร์จึงทำการสร้าง token ให้นายA ไปใช้ โดยtoken ที่ได้ มีองประกอบดังนี้
header = { alg: “hs256” type: “jwt”}
Payload = { id: 5 ,name:”A” , age : 17 exp: “10/7/2563”}
Signature = fgt256
เวลา นายA ต้องการจะเข้าไปในส่วน ที่เป็นข้อมูลส่วนตัว หรือส่วนที่ต้องได้รับอณุญาต เซิฟเวอร์ จะทำการเช็ค token ของ นาย A ว่าถูกต้องมั้ย โดยอันดับแรก จะนำส่วน headerกับpayloadของtoken นายA มา hash ด้วย รหัสลับ(secret or key) แล้วนำมาเช๊ค signature ของ tokenนาย A ว่าตรงกันมั้ย
ถ้าไม่ตรงกัน แสดงว่ามีการปลอมแปลง หรือ แก้ไขtoken บางอย่าง
นี่เป็นการเปยคอนเสปคร่าวๆ ถ้าเราเข้าใจคอนเสป เวลาเขียนโค๊ดจะเข้าใจ โฟลของการทำงาน ของมันมากขึ้น