JWT (JSON Web Token)

   อัปเดตล่าสุด Nov. 6, 2024

JWT คืออะไร? 

JWT (JSON Web Token) คือ token รูปแบบหนึ่งที่เป็นที่นิยมสำหรับซอฟต์แวร์สมัยใหม่ในการทำ authentication โดยข้อมูลจะถูกเข้ารหัส (encoded) ในรูปแบบ JSON (JavaScript Object Notation) และอยู่ในรูปแบบ Stateless (คือไม่มีการจดจำสถานะเมื่อมีการส่ง HTTP Request)
JWT คือมาตรฐานในการ authentication รูปแบบหนึ่ง (มาตรฐาน RFC 7519) โดย JWTs คือ token ส่วนทุก ๆ tokens ไม่ใช่ JWT เสมอไป


การทำงานของ JWT (Image source: Alex Loxikov, medium.com)

Note: JWT ออกเสียงว่า "jot" (จ๊อต) 

โครงสร้างของ JWT

JWT ประกอบด้วย 3 ส่วน ดังต่อไปนี้
  • Header (ส่วนหัว): บอกข้อมูลเกี่ยวกับวิธีการเข้ารหัสและประเภทของข้อมูลที่อยู่ในนั้น
  • Payload (เนื้อหา): ข้อมูลเกี่ยวกับผู้ใช้ เช่น ชื่อผู้ใช้ สิทธิ์การเข้าถึง (Claims) 
  • Signature (ลายเซ็น): ใช้ยืนยันความถูกต้องและป้องกันการปลอมแปลงข้อมูล โดยใช้คีย์ลับ (Secret Key)

ตัวอย่าง Header

{
"alg": "HS256",
"typ": "JWT"
}



ตัวอย่าง Payload

{
"iss": "https://example.com/",
"sub": "1234567890",
"name": "Pita Jaidee",
"iat": 1516239022,
"exp": 1516242622
}
 

จากโค้ด JSON ด้านบน

  • iss:  ผู้ส่ง JWT ตัวอย่างนี้ใช้  https://example.com/  
  • sub:  Subject ของ JWT ตัวอย่างนี้ใช้  1234567890 
  • name: ชื่อผู้ใช้ ตัวอย่างนี้ใช้  Pita Jaidee 
  • iat: Issued At เวลาที่สร้าง JWT ตัวอย่างนี้ใช้  1516239022  (timestamp)
  • exp: Expiration Time เวลาที่ JWT หมดอายุ ตัวอย่างนี้ใช้  1516242622 (timestamp)


ตัวอย่าง Signature

HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
  • HMACSHA256: อัลกอริทึมที่ใช้ในการสร้างลายเซ็น
  • base64UrlEncode(header): ส่วนหัวที่เข้ารหัสด้วย base64Url
  • base64UrlEncode(payload): เนื้อหาที่เข้ารหัสด้วย base64Url
  • secret: คีย์ลับที่ใช้ในการสร้างลายเซ็น

ข้อดีของ JWT

  • Stateless: ไม่จำเป็นต้องเก็บสถานะการเชื่อมต่อ (Session) ของผู้ใช้บนเซิร์ฟเวอร์ ทำให้ระบบมีความยืดหยุ่นและรองรับผู้ใช้งานจำนวนมากได้
  • Safety (ปลอดภัย): โดยข้อมูลภายใน JWT ถูกเข้ารหัส ทำให้ยากต่อการปลอมแปลง
  • Lightweight (มีขนาดเล็ก): เหมาะสำหรับการส่งข้อมูลผ่านเครือข่าย
  • Portable & Scalable (ใช้ได้หลายแพลตฟอร์ม): โดยเราสามารถใช้ JWT เพื่อใช้งานกับแพลตฟอร์มอื่น ๆ ไม่ว่าจะเป็น Web, Mobile App, etc โดยไม่ได้ขึ้นอยู่กับแพลตฟอร์มใด แพลตฟอร์มหนึ่งเหมือนกันกับ Session Authen ดังนั้นจึงสามารถขยายและสเกลไปได้หลายแพลตฟอร์ม

การทำงานของ JWT

  1. Client (เช่น เว็บเบราว์เซอร์) ขอเข้าสู่ระบบโดยส่งข้อมูลประจำตัว (เช่น ชื่อผู้ใช้ รหัสผ่าน) ไปยัง Server
  2. Server ตรวจสอบข้อมูลประจำตัว หากถูกต้องจะสร้าง JWT ประกอบด้วยข้อมูลผู้ใช้และเซ็นด้วย Secret Key
  3. Server ทำการส่ง JWT กลับไปยัง Client
  4. Client บันทึก JWT ไว้ (เช่น ใน Local Storage)
  5. Client จะเข้าถึงข้อมูลจาก Server จะแนบ JWT ไปกับทุก request
  6. Server ตรวจสอบความถูกต้องของ JWT ด้วย Secret Key
  7. หาก JWT ถูกต้อง Server อนุญาตให้เข้าถึงข้อมูลได้

ข้อจำกัดของ JWT

  • ไม่เหมาะสำหรับการเก็บข้อมูลขนาดใหญ่ 
  • ไม่เหมาะที่จะเก็บ sensitive data (ห้ามเลยก็ว่าได้)
  • ไม่สามารถ revoke JWT ได้โดยตรง


อ้างอิงเพิ่มเติม




คอร์สเรียนแนะนำ

Full Stack Developer 2024

คอร์สเรียน Full Stack Developer 2024 ด้วยเฟรมเวิร์คยอดนิยมในการพัฒนา A…