ฺสำหรับ Blog นี้ เป็นหัวข้อที่สนใจอยู่พอดีครับ เพราะ กำลังทำระบบใหม่เป็นตัวเลือกที่น่าสนใจครับ ผมเลยแตกมาเป็นอีก Blog ครับ จาก Blog หลัก "สรุปงาน CodeMania – Coding Defines Anything" ครับ เข้าเรื่องเลยดีกว่าครับ
หมายเหตุ : ผมมีสรุปข้อมูลเพิ่มไปบางส่วนด้วย เผื่อกลับมาอ่านเองย้อนหลังครับ
Old way
หากย้อนไประบบแบบเก่าจะเป็น Cookie based Authentication ดังรูป
แต่ปัญหาของ Cookie based Authentication ก็มีเหมือนกัน คือ
- Performance เก็บข้อมูลทั้งฝั่ง Server และ Client และ Request เยอะ เพราะ ตัว HTTP เป็น Stateless ไม่จำอะไรเลยย
- Authentication Request - ก่อน เพื่อให้ได้ Cookie กับ Session
- Subsequent Request - เมื่อมีสิทธิ์แล้ว ต้องไป Request อีกครั้งไปขอข้อมูล ถ้าไม่มีสิทธิก็โดนเตะออกไป - Hard to scale เพราะ Session Id มันเก็บไว้ที่ Server แล้วจะรู้ได้ยังไงว่าทุกเครื่องมี Session ที่เก็บไว้เหมือนกัน พร้อมใช่
- Cross-origin request sharing (CORS)
- Coupling with the web framework - มันผูกวิธีการ Auth แบบนี้มากับ Framwork
Token-based authentication
Token based คือ อะไร สิ่งทีใช้แทน Username และ Password ถ้าอยากได้ต้องเอา Username และ Password ไปแลกมาครับ ดูตามรูปที่ผมได้หามาเพิ่มได้เลยครับ
ตัวอย่าง ที่ใกล้ตัวเราที่สุด ลองนึกถึงการตรวจคนเข้าเมืองครับ ถ้าเราออกนอกประเทศ เราต้อง Passport เป็นบัตรผ่านครับ ถ้าไม่มีต้องเอาบัตรประชาชนเอกสารต่างๆ ไปยื่นกรมการกงสุล ครับ
ทำไมต้องใช้ Token based authentication
- Stateless - ของเดิม cookie เก็บทั้ง Server Client ใหม่ แต่ Token จะเก็บที่ Client ลดภาระฝั่ง Server ไปด้วย แถม Scale ได้ง่าย
- Self contain - จัดการตัวเองได้ กำหนดเวลาตายได้
- Decoupling - ลดการผูกติดกันของระบบ อย่าง Micro Service ถ้าใช้ Cookies Auth ถ้าระบบล่ม ทุกตัวไปหมด
- General Storage - เก็บข้อมูลบางส่วนตดไปด้วยได้ ลดการ Request ข้อมูลเข้ามาทาง Server เยอะๆ
- Standard Based - รองรับหลายภาษา
- แก้ปัญหา Cross-origin request sharing (CORS)
JSON Web Token (JWT) ?
- Token ที่เก็บในรูป JSON ครับ
- โครงสร้างมีอะไรบ้าง หละ ?
- Header - เอาไว้บอกมัน คือ JWT ใช้อัลกอริทึมอะไร มีระยะเวลาไหม
- Payload - เอาไว้ฝากข้อมูล ควรจะเป็นพวก User-Role หรือสิทธิ์ (ไม่เข้ารหัสนะ)
- Signature - เอาไว้ตรวจสอบข้อมูล
ข้อควรระวัง !!!
- Token ถูกขโมยได้ แต่สามารถแก้ได้ โดยการกำหนดเวลาดหมดอายุ หรือเปลี่ยน secret key ที่ฝั่ง Server เลย
- payload ถ้ายัดข้อมูลลงไปเยอะ requestจะนานขึ้น
Reference
- JWT กับความปลอดภัย 101
- JSON Web Token Tutorial: An Example in Laravel and AngularJS
- JSON Web Tokens - ตัวเว็บมีตัว Encoder กับ Decoder มาให้เล่นด้วย
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.