[JWT] Idea การออกแบบ Token สำหรับ Microservice

พอดีลองมาเยอะครับ เลยขอสรุป Pattern ที่ใช้ครับ Blog ก่อนอื่น

JSON Web Token (JWT)

JWT - string ที่ถูกกำหนดเป็น และมาแก้ปัญหาเดิมๆของ Session ที่มันจำ Server (สมัยนี้ใครจะรู้จัก Session ไหมนะ 555) โดยตัว string เกิดจาก secret sign ด้วย

  • symmetric algorithm อย่าง HMAC
  • หรือ asymmetric algorithm ใช้ private (for signing) / public (for verification) key pair (RSA / ECDSA)
- Why JWT?
  • Stateless Authentication - Information contained within the JWT
  • Scalability - no needing to share session data ข้อจำกัดเดิมของ Session เลย มันเลยกลายเป็นว่า ถ้าไป Server ใหม่ต้องยิง Authen ใหม่
  • Decentralized Issuance - Tokens can be issued and verified by multiple parties or services
  • Fine-grained Authorization
  • Short-lived & Expiry
  • Standardized
- JWT Structure xxxxx.yyyyy.zzzzz
  • Header (xxxxx) - ใช้ Algorithm อะไร
  • Payload (yyyyy) - ของข้างใน อาจจะเรียกว่า Claim โดยมีข้อมูลว่าข้อมูลนี้ของ user อะไร มีสิทธิอะไรบ้าง แล้วหมดอายุตอนไหน และ onformation อื่นๆ
  • Signature (zzzzz) - บอกว่าข้อมูลของ jwt นั้นถูกต้อง ไม่โดนแก้ ถุึงเรียกว่าเป็น digitally signed

โดย flow การทำงานจะตามรูป ฝั่ง server จะมาตรวจ client ก็มีนะ แต่ไม่นิยม

- JWT - Consideration & Practices
  • Transmission: encrypted channels เช่น https
  • Storage: stored securely โดยเฉพาะ Client Side เพราะ ถ้าเอาไปเก็บใน Web Storage จะเจอ XSS attacks)
  • Secret: เก็บของให้ดี
    - symmetric signing algorithms เช่น HMAC SHA256 ระวัง secret key
    - Asymmetric algorithms (e.g., RSA/ ECDSA) เก็บพวก key อย่าให้หลุด
  • Expiration: Short-lived ถ้า JWT หลุดไป จะมีช่วงให้โดนโจมตีได้น้อย
    แต่อาจจะประสบปัญหาว่า Login บ่อย เลยมี Concept Access Token (สั้น บอกสิทธิว่าเราทำอะไรได้) / Refresh Token (ยาวหน่อย ขอ Access Token)

ผมแยก Token ออกเป็น 2 กลุ่ม ได้แก่ Access Token กับ Refresh Token โดยแต่ละอันมีรายละเอียด ดังนี้

My Token Pattern

- Access Token
  • ระยะเวลาสั้น เก็บ Anything เช่น พวกสิทธิในระบบ
  • Size ยิ่งใหญ่ทำให้ Request นานๆ ข้อมูลบางอย่าง เช่น พวกสิทธิ อาจจะต้องแปลงให้เล็กที่สุด โดยอาจจะทำเป็นเลขฐาน 2 แทน
  • ถ้า Expired Return Code 4xx แต่ไม่ได้อยู่ในมาตรฐานนะ แล้วแต่องค์กรจะตกลงกัน
- Refresh Token
  • ระยะเวลายาว - เก็บว่า User ยังอยู่ในระบบนะ
  • เอาไปขอ Access Token
  • ถ้า Logout ไป Server ต้องเก็บ Token Id ว่ามัน Expired ไปแล้ว มันไม่สามารถมาขอ Token อื่นๆได้
  • Pattern ของ Return Code 401 403

สำหรับการตรวจสอบ JWT ว่ามีอะไรดูจาก https://jwt.io/


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.