[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 sent to your email.