[CodeMania100] Token based authentication ทำไปทำไม

ฺสำหรับ Blog นี้ เป็นหัวข้อที่สนใจอยู่พอดีครับ เพราะ กำลังทำระบบใหม่เป็นตัวเลือกที่น่าสนใจครับ ผมเลยแตกมาเป็นอีก Blog ครับ จาก Blog หลัก "สรุปงาน CodeMania – Coding Defines Anything" ครับ เข้าเรื่องเลยดีกว่าครับ

หมายเหตุ : ผมมีสรุปข้อมูลเพิ่มไปบางส่วนด้วย เผื่อกลับมาอ่านเองย้อนหลังครับ

Old way

  • หากย้อนไประบบแบบเก่าจะเป็น Cookie based Authenticationดังรูป
    1478740144577
  • แต่ปัญหาของ  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 ไปแลกมาครับ ดูตามรูปที่ผมได้หามาเพิ่มได้เลยครับ
    1478740139992
  • ตัวอย่างที่ใกล้ตัวเราที่สุด ลองนึกถึงการตรวจคนเข้าเมืองครับ ถ้าเราออกนอกประเทศ เราต้อง 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

 


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.