Back to notes
mastery-platform-security
Featured

Authentication Mastery: สงครามระหว่าง Session, JWT และ OAuth2

เลิกเดาสุ่มเรื่องระบบ Login! เจาะลึกความต่างระหว่าง Stateful vs Stateless และกลยุทธ์การตัดสินใจเลือกใช้ระบบ Authentication ให้ปลอดภัยระดับ Enterprise

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: "ระบบ Login ที่ถูกแฮกได้ง่ายๆ"

ลองนึกถึงระบบ Authentication ที่เขียนแบบง่ายๆ โดยที่ไม่ได้คำนึงถึงความปลอดภัย:

HLJS JAVASCRIPT
// ❌ Naive Approach: เก็บข้อมูลลับไว้ในที่ที่ไม่ปลอดภัย
localStorage.setItem("user_token", token); // 🌋 พัง! ถ้าเว็บคุณโดน XSS (Cross-Site Scripting)
// แฮกเกอร์สามารถเขียน JS เพียงบรรทัดเดียวเพื่อดูดเอา Token ทั้งหมดของลูกค้าคุณไปได้ทันที
// หรือการใช้ JWT แบบไม่มีวันหมดอายุ (No Expiration) ที่ถ้าหลุดไปแล้วคือจบเห่

ปัญหา: "การพิสูจน์ตัวตน" คือประตูบานแรกของระบบ ทุุกการตัดสินใจของคุณมีราคาที่ต้องจ่าย ไม่ว่าจะเป็นเรื่องของ User Experience (การไม่ต้อง Login บ่อยๆ) หรือเรื่องของ Security (การเตะ User ออกจากระบบทันที) การเลือกผิดท่าตั้งแต่ต้นอาจนำไปสู่การรั่วไหลของข้อมูลลูกค้านับล้านครับ


💡 2. Real-Life Analogy: บัตรผ่านประตูแบบต่างๆ

  • Session-Based (Stateful): เหมือน "การฝากกุญแจไว้ที่เคาน์เตอร์โรงแรม". ทุุกครั้งที่คุณจะเข้าห้อง คุณต้องเดินไปถามพนักงาน (Server) ว่า "ฉันเป็นเจ้าของห้องนี้จริงไหม?" พนักงานจะเปิดสมุดจด (Database) ดู ถ้าจดไว้จริงถึงจะยอมให้คุณเข้า
  • JWT (Stateless): เหมือน "สายรัดข้อมือสวนสนุก". ข้อมูลทุุกอย่าง (ชื่อ, สิทธิ์การเล่น) ถูกเขียนไว้บนสายรัดข้อมือและถูกปั๊มตราประทับที่ปลอมแปลงไม่ได้ (Signature) พนักงาน (Server) แค่มองดูตราประทับก็รู้ทันทีว่าคุณเข้าได้ โดยไม่ต้องเดินไปถามใคร
  • OAuth2: เหมือน "การใช้บัตรประชาชนเพื่อเข้าพักโรงแรม". คุณไม่ได้สร้างบัตรขึ้นมาเอง แต่คุณเชื่อใจในผู้ออกบัตร (Google/Facebook) ว่าเขายืนยันตัวตนคนนี้มาให้คุณแล้ว

🚀 3. Execution Journey: มหากาพย์การสร้างระบบรักษาความปลอดภัย

Senior จะมองหาความสมดุลระหว่างความสะดวกและความปลอดภัยเสมอ

🛠 Step-by-step:

  1. The Short-lived Access: ออก Access Token (JWT) ที่มีอายุสั้นมาก (เช่น 15 นาที) เพื่อลดความเสี่ยงหากหลุด
  2. The Long-lived Refresh: ออก Refresh Token ที่เก็บไว้ใน Database (Stateful) เพื่อให้เรามีสิทธิ์ "เตะ" (Revoke) User ออกได้ทุุกเมื่อ
  3. The Secure Storage: ห้ามเก็บ Token ใน localStorage เด็ดขาด! ให้ใช้ HttpOnly Cookie เพื่อป้องกัน XSS
  4. The Signature Guard: ตรวจเช็คลายเซ็น (Signature) ทุุกครั้งก่อนจะเชื่อข้อมูลใน JWT
HLJS JAVASCRIPT
// ✅ Best Practice: การใช้ JWT แบบคู่ (Access + Refresh)
const accessToken = signJWT(user, SECRET, "15m"); // 🛠 สั้น เพื่อความปลอดภัย
const refreshToken = signJWT(user, REFRESH_SECRET, "7d"); // 🛠 ยาว แต่เก็บไว้ในฐานข้อมูลของเรา

// ส่งกลับผ่าน Cookie ที่เข้าถึงด้วย JS ไม่ได้
res.cookie("refreshToken", refreshToken, { httpOnly: true, secure: true });

🪤 4. The Junior Trap: โรค "Stateless Logout" (กด Logout แต่ยังใช้ได้ต่อ)

จูเนียร์มักจะคิดว่าการลบ Token ออกจากเครื่อง Client คือการ Logout:

HLJS JAVASCRIPT
// ❌ Junior Trap: ลบแค่ที่เครื่องตัวเอง
localStorage.removeItem("token");
// 🌋 พัง! ถ้าแฮกเกอร์แอบก๊อปปี้ Token นั้นไปก่อนหน้านี้ เขายังสามารถส่ง Request
// เข้าหลังบ้านของคุณได้เรื่อยๆ จนกว่า Token นั้นจะหมดอายุเอง เพราะ Server
// ของคุณ 'จำไม่ได้' ว่าใคร Logout ไปแล้วบ้าง

ระวัง: JWT ถ้าเป็นพื้นฐานเลยจะ "ทำลายตัวมันเองไม่ได้" จนกว่าจะถึงเวลา ✅ การแก้ไข: จงทำระบบ Token Blacklisting หรือใช้ Refresh Token Pattern เพื่อให้ Server มีอำนาจสั่งยกเลิกสิทธิ์ได้จริงครับ


⚖️ 5. The Why Matrix: Session vs JWT vs OAuth2

หัวข้อSession (Stateful)JWT (Stateless)OAuth2 (OIDC)
การ Logout⚡⚡⚡ ง่ายและทันที🐢 ยาก (ต้องลบใน DB)⚡⚡ ขึ้นอยู่กับระบบ
การ Scaling🐢 ยาก (ต้องใช้ Redis)🚀 ง่ายที่สุด (ไม่ต้องจำ)⚡⚡ ง่าย
ความปลอดภัย🚀 สูง (ข้อมูลไม่หลุดออกไป)ปานกลาง (ข้อมูลถูกเบิร์นใส่ token)🚀 สูง (ไม่ต้องเก็บรหัสผ่านเอง)
เหมาะกับWeb App มาตรฐานMicroservices / Mobileระบบที่เน้นความไว้วางใจสากล

🎓 6. Senior Mindset Summary

การเป็น Senior คือการมองว่า "ไม่มีระบบ Authentication ไหนที่สมบูรณ์แบบ มีเพียงระบบที่เหมาะสมกับภัยคุกคามที่เราเตรียมรับมือไว้เท่านั้น". ความปลอดภัยไม่ได้อยู่ที่ตัวภาษาหรือเฟรมเวิร์ก แต่อยู่ที่วินัยในการออกแบบที่รัดกุมทุุกขั้นตอนครับ!

Share this note

Related notes

View all notes
mastery-platform-security
Advanced

Web Security Essentials: ป้อมปราการความปลอดภัยสไตล์ Senior

อย่ารอให้โดนแฮกก่อนค่อยแก้! เจาะลึก 5 ภัยคุกคามยอดฮิต (XSS, CSRF, Injection) พร้อมกลวิธีอุดรูรั่วให้สนิทด้วยระบบคิดแบบวิศวกรซอฟต์แวร์มืออาชีพ

January 30, 20262 min read
mastery-frontend-react
Advanced

Advanced React Architecture: เขียนโค้ดให้เพื่อนร่วมทีมรัก

ยกระดับการเขียน React สู่ระดับมืออาชีพ เจาะลึกเทคนิคการจัดการ App Initialization, การรักษา Immutability ขั้นสูง และการแก้ปัญหา Stale Closure ด้วย Pattern ที่ Senior เลือกใช้

January 30, 20262 min read
mastery-frontend-react
Advanced

React Composition Patterns: พอกันทีกับ Boolean Props ที่รกสายตา

เจาะลึกศิลปะการประกอบร่างหน้าจอ (Composition) เลิกเขียน Component แบบ Monolith ที่รับ Props มหาศาล แล้วเปลี่ยนมาใช้ Compound Components ที่ยืดหยุ่นและดูแลรักษาง่ายขึ้น 10 เท่า

January 30, 20262 min read

© 2026 My Notes by Seereen