มารู้จัก JWT (Json Web Token) กัน

Boon Worayut Aksornukul
SCB Engineer
Published in
3 min readDec 8, 2023
Photo by Michael Dziedzic on Unsplash

วันนี้จะมาทำความรู้จัก JWT หรือ Json Web Token กัน

เมื่อพูดถึงการ authentication และ authorization ใน web browser (client) หลายคนอาจคุ้นเคยกับการเก็บ session เพื่อที่ user จะไม่ต้องทำการ login หลายครั้ง ซึ่งโดยส่วนใหญ่ก็จะเก็บในรูปแบบของ cookie บน browser นั้นๆ

JWT ก็สามารถทำสิ่งที่เหมือนกันโดยมีจุดประสงค์ให้ user ไม่ต้องทำการ Login บ่อย ๆ และสามารถใช้งาน service เราได้อย่างสะดวกสบาย แต่การทำงานของ cookie กับ JWT นั้นมีแตกต่างกัน

Token ใน JWT จะมีหน้าตาคล้ายๆ กันรูปด้านล่างนี้

JWT จะมี 3 ส่วนหลัก ๆ ดังนี้

  1. Header — จะบอกถึงประเภทของ token ในที่นี้คือ JWT และ algorithm ที่ใช้ในการ encryption

2. Payload — จะเป็นส่งของ data ที่เราต้องการส่งออกไป รวมไปถึงเวลาที่ issue token หรือสามารถส่งเวลาหมดอายุของ token ได้ด้วย

3. Signature — ในส่วนนี้จะใช้สำหรับการ verify ว่า token ที่ส่งมาถูกต้องไหม โดยจะทำการ encode ข้อมูลในส่วน header, payload, และ secret key ด้วย algorithm ที่ระบุใน header โดยที่ secret key เป็นส่วนที่สำคัญมาก เพราะถ้าใครสามารถเข้าถึง secret key ได้จะสามารถทำการ verify ในส่วนนี้ได้ทั้งหมด

สามารถลอง encode และ decode ได้ที่ https://jwt.io

JWT VS Session Storage

ก่อนหน้าเรามีการพูดถึง JWT และการเก็บ session ในรูปแบบ cookie เรามาดูกันว่าข้อแตกต่างของสองวิธีนี้มีอะไรบ้าง

Regular Session Storage

โดยทั่วไปวิธีการทำงานของการเก็บ session เมื่อ user ทำการ login มีดังนี้

  1. เมื่อผู้ใช้เข้าสู่ระบบ server จะสร้าง session ID และจัดเก็บไว้บน server พร้อมกับข้อมูลที่เกี่ยวข้องกับผู้ใช้ session ID มักจะถูกจัดเก็บเป็น cookie บน browser ของผู้ใช้
  2. ในแต่ละ request เซิร์ฟเวอร์จะค้นหา session ID จาก cookie และ ดึงข้อมูล session และใช้ข้อมูลดังกล่าวเพื่อกำหนดข้อมูลประจำตัวและการอนุญาตของผู้ใช้
  3. เมื่อผู้ใช้ออกจากระบบหรือ session หมดอายุ server จะลบข้อมูล session ที่เกี่ยวข้องกับ session ID นั้น ๆ

โดยสรุป รูปแบบการเก็บ session จะมีการเก็บทั้งบน server และ กับ client (broswer) ของผู้ใช้นั้น ๆ

เมื่อเปรียบเทียบกับ JWT จะมี 3 ปัจจัยหลัก ๆ ที่ทำให้ JWT โดดเด่นขึ้นมา

  1. Statelessness — โดยธรรมชาติของ JWT ข้อมูลทุกอย่างจะถูกเก็บอยู่ในรูปแบบ token โดยที่ไม่ต้องเก็บข้อมูลใด ๆ ไว้บน server นั่นหมายความว่า token นี้สามารถใช้กับ server ใดก็ได้ ตราบใดที่ server นั้น ๆ สามารถเข้าถึง secret key ได้
  2. Scalability — เนื่องจากความ statelessness ของ JWT จึงทำให้ JWT มีความสามารถในการ scale ที่ดีกว่าการเก็บ session ปกติ โดยที่การ verify Token สามารถทำได้โดยอิสระ โดยที่ไม่ได้ share ข้อมูล session ให้ทุก ๆ server
  3. Security — ตราบใดที่ secret token นั้นถูกเก็บเป็นความลับ การใช้งาน JWT ก็จะปลอดภัย เรายังสามารถเพิ่มความปลอดภัยได้อีกโดยการใช้ access token และ refresh token โดยที่ตั้งเวลาให้ access token มีวันหมดอายุ หากมีคนสามารถเข้าถึง access token ได้ ก็จะเข้าถึงได้ในเวลาที่จำกัดเท่านั้น

ด้วยประโยชน์ของ JWT สามารถใช้งานได้ในหลาย ๆ รูปแบบ ตัวอย่างเช่น เราสามารถแยก server สำหรับการ authentication และ API สำหรับ CRUD ได้ และทำการ scale แยกส่วนกันได้ง่ายขึ้นด้วย JWT หรือหากเรามีหลาย ๆ service หรือ application แล้วเราต้องการให้ user ใช้งานโดยที่ไม่ได้ทำการ login หลาย ๆ รอบ ก็สามารถใช้ concept ของ JWT ได้เช่นกัน

อีกหนึ่ง use case คือหาก service เรามีผู้ใช้งานจำนวนมาก เราอาจจะมีหลาย server และทำ load balancer โดยที่แต่ละ server มี secret key เดียวกันก็สามารถทำให้ user สามารถใช้งานได้อย่างมีประสิทธิภาพและลื่นไหลมากขึ้น

--

--