การจัดการเซสชัน (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