การจัดการเซสชัน (Session Management) ใน Java Web Applications

HTTP เป็นแบบ stateless (ไม่เก็บสถานะ) ซึ่งเป็นปัญหาสำหรับเว็บแอปพลิเคชันสมัยใหม่

เซิร์ฟเวอร์จะไม่จดจำคุณ ทุกการร้องขอ (request) คือการร้องขอใหม่ หากไม่มีวิธีติดตามผู้ใช้ ตะกร้าสินค้าจะหายไป และผู้ใช้จะต้องล็อกอินใหม่ทุกครั้งที่คลิก

การจัดการเซสชัน (Session management) จะเข้ามาแก้ปัญหานี้ โดยการสร้างความเชื่อมโยงระหว่างการร้องขอต่างๆ เพื่อให้เซิร์ฟเวอร์ทราบว่าคุณคือใคร

วิธีการทำงาน:

  • คุณล็อกอิน
  • เซิร์ฟเวอร์สร้างเซสชันขึ้นมา
  • เซิร์ฟเวอร์สร้าง Session ID ที่ไม่ซ้ำกันขึ้นมา
  • เซิร์ฟเวอร์ส่ง ID นี้ไปยังเบราว์เซอร์ของคุณ
  • เบราว์เซอร์ของคุณจะส่ง ID นี้กลับไปพร้อมกับการร้องขอใหม่ทุกครั้ง

นักพัฒนา Java ใช้ interface HttpSession ในการจัดการเรื่องนี้ คุณสามารถเก็บข้อมูลผู้ใช้ เช่น ID หรือบทบาท (roles) ไว้ในเซสชันได้โดยตรง

วิธีทั่วไปในการติดตามเซสชัน:

  • Cookies: วิธีที่นิยมที่สุด เบราว์เซอร์จะจัดการ ID ให้โดยอัตโนมัติ
  • URL Rewriting: มีประโยชน์หากผู้ใช้ปิดการใช้งาน cookies
  • Hidden Form Fields: เหมาะสำหรับฟอร์มที่มีหลายขั้นตอน

ความปลอดภัยคือสิ่งที่น่ากังวลที่สุด ผู้โจมตีพยายามขโมย Session ID เพื่อปลอมแปลงเป็นผู้ใช้

ปกป้องแอปพลิเคชันของคุณด้วยขั้นตอนเหล่านี้:

  • ใช้ HTTPS สำหรับการรับส่งข้อมูลทั้งหมด
  • ตั้งค่า cookies เป็น HttpOnly เพื่อไม่ให้ JavaScript ขโมยไปได้
  • ใช้ flag Secure เพื่อให้ cookies รับส่งผ่านการเชื่อมต่อที่เข้ารหัสเท่านั้น
  • ใช้ SameSite=Strict เพื่อป้องกันการโจมตีแบบ CSRF
  • เรียกใช้ session.invalidate() ทุกครั้งในขั้นตอนการ logout

สำหรับแอปพลิเคชันระดับองค์กรขนาดใหญ่ เซิร์ฟเวอร์เพียงเครื่องเดียวไม่เพียงพอ หากคุณมีเซิร์ฟเวอร์หลายเครื่อง เซิร์ฟเวอร์ B จะไม่ทราบเกี่ยวกับเซสชันที่ถูกสร้างขึ้นบนเซิร์ฟเวอร์ A

เพื่อแก้ปัญหานี้ ให้ใช้การจัดการเซสชันแบบกระจาย (distributed session management):

  • Sticky Sessions: Load balancer จะส่งคุณไปยังเซิร์ฟเวอร์เครื่องเดิมเสมอ
  • Database Storage: เซิร์ฟเวอร์ทุกเครื่องจะตรวจสอบจากฐานข้อมูลกลางแห่งเดียว
  • Redis: นี่คือมาตรฐานของอุตสาหกรรม มีความเร็วสูงและขยายระบบ (scale) ได้ง่าย

คุณควรทราบความแตกต่างระหว่าง Sessions และ JWTs ด้วย โดย Sessions จะเก็บข้อมูลไว้ที่เซิร์ฟเวอร์ ส่วน JWTs จะเก็บข้อมูลไว้ที่ฝั่งไคลเอนต์ (client) Sessions ควบคุมได้ง่ายกว่า ในขณะที่ JWTs เหมาะสำหรับ microservices มากกว่า

การเชี่ยวชาญแนวคิดเหล่านี้จะช่วยให้คุณสร้างซอฟต์แวร์ที่มีความปลอดภัยและรองรับการขยายตัวได้ดี

แหล่งที่มา: https://dev.to/naveenkumar1/session-management-in-java-web-applications-38od