🟣 PHP

เจาะลึก PHP 8: การจัดการ Session และ Cookie สำหรับมือใหม่หัดเขียนเว็บ

10 นาที 15 views บันทึกเป็น PDF
เจาะลึก PHP 8: การจัดการ Session และ Cookie สำหรับมือใหม่หัดเขียนเว็บ

เรียนรู้วิธีจัดการสถานะผู้ใช้ด้วย PHP 8 ผ่าน Session และ Cookie เข้าใจความแตกต่าง ความปลอดภัย และวิธีใช้งานจริงเพื่อสร้างระบบล็อกอินและจัดการข้อมูลผู้ใช้

ทำไมเว็บต้องจำเราได้? ความเข้าใจเรื่อง Session และ Cookie

ในการท่องโลกอินเทอร์เน็ต โปรโตคอล HTTP (ช่องทางที่เบราว์เซอร์ใช้สื่อสารกับเซิร์ฟเวอร์) มีธรรมชาติที่เรียกว่า Stateless หมายความว่าทุกครั้งที่เราคลิกหน้าใหม่ เซิร์ฟเวอร์จะมองว่าเราเป็นคนแปลกหน้าทันที เพื่อแก้ปัญหานี้เราจึงต้องใช้ Session และ Cookie เพื่อช่วยให้เว็บไซต์จำสถานะผู้ใช้ได้ เช่น การล็อกอินค้างไว้หรือการจำสินค้าในตะกร้า

ลองนึกภาพว่าคุณไปร้านอาหารแล้วพนักงานเสิร์ฟความจำสั้นมาก ทุกครั้งที่คุณสั่งน้ำเพิ่ม พนักงานจะลืมว่าคุณคือโต๊ะไหนและสั่งอะไรไปก่อนหน้า Session เปรียบเสมือนสมุดบันทึกที่พนักงานถือไว้เพื่อจดว่าโต๊ะนี้คือใคร ส่วน Cookie เปรียบเสมือนบัตรคิวที่แปะไว้บนโต๊ะเพื่อให้พนักงานอ้างอิงกลับมาที่สมุดบันทึกเล่มนั้นได้ถูกต้อง

สำหรับมือใหม่ที่กำลังหัดเขียนโปรแกรม การทำความเข้าใจเรื่องนี้สำคัญมาก เพราะนี่คือด่านแรกของการสร้างระบบ Authentication (ระบบยืนยันตัวตน) หากคุณไม่เข้าใจจุดนี้ คุณจะไม่สามารถเขียนเว็บที่มีระบบสมาชิกหรือระบบจัดการความปลอดภัยเบื้องต้นได้เลย ซึ่งเป็นทักษะพื้นฐานที่บริษัทซอฟต์แวร์ทุกแห่งต้องการจากโปรแกรมเมอร์

รู้จักกับ Cookie: ป้ายชื่อที่ติดตัวผู้ใช้ไปทุกที่

Cookie คือไฟล์ข้อความขนาดเล็กที่เซิร์ฟเวอร์ส่งไปเก็บไว้ในเครื่องของผู้ใช้งาน (เบราว์เซอร์) เพื่อให้เซิร์ฟเวอร์สามารถจดจำข้อมูลบางอย่างได้ในอนาคต ข้อมูลเหล่านี้มักถูกใช้เพื่อการตั้งค่าภาษา, ธีมสีของเว็บ, หรือแม้แต่การทำระบบ Tracking (การติดตามพฤติกรรม) เพื่อโฆษณาในภายหลัง

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

ข้อควรระวังสำคัญคือ Cookie ถูกเก็บไว้ที่ฝั่งผู้ใช้งาน ดังนั้นห้ามเก็บข้อมูลที่มีความละเอียดอ่อนสูง เช่น รหัสผ่านหรือข้อมูลบัตรเครดิตลงไปเด็ดขาด เพราะผู้ใช้สามารถเปิดดูหรือแก้ไขข้อมูลเหล่านี้ได้ง่ายผ่านเครื่องมือ Developer Tools ของเบราว์เซอร์ ให้เก็บเพียงค่า Token หรือ ID ที่ใช้ระบุตัวตนเท่านั้น

// สร้าง Cookie ชื่อ 'user_theme' มีค่าเป็น 'dark' 
// หมดอายุในอีก 30 วันข้างหน้า (time() + 86400 * 30)
setcookie('user_theme', 'dark', time() + (86400 * 30), "/");

// ตรวจสอบว่ามี Cookie หรือไม่
if(isset($_COOKIE['user_theme'])) {
    echo "ธีมปัจจุบันคือ: " . $_COOKIE['user_theme'];
}

โค้ดด้านบนใช้ฟังก์ชัน setcookie() เพื่อสร้างข้อมูลในเครื่องผู้ใช้ โดยกำหนด "/" เพื่อให้ใช้งานได้ทุกหน้าของเว็บไซต์ และใช้ $_COOKIE เพื่อดึงค่าที่เก็บไว้มาใช้งานภายหลัง หากรันโค้ดนี้คุณจะเห็นข้อความแสดงธีมที่ตั้งค่าไว้ปรากฏขึ้นมาบนหน้าจอ

Session: สมุดบันทึกความลับที่เก็บไว้ในเซิร์ฟเวอร์

Session คือวิธีเก็บข้อมูลผู้ใช้ที่ปลอดภัยกว่า Cookie เพราะข้อมูลทั้งหมดจะถูกเก็บไว้ที่ฝั่งเซิร์ฟเวอร์ (Server-side) โดยที่เบราว์เซอร์จะถือเพียงแค่ Session ID (หมายเลขกำกับ) เพื่อใช้ยืนยันตัวตนกับเซิร์ฟเวอร์เท่านั้น วิธีนี้จึงเหมาะมากสำหรับการเก็บข้อมูลการล็อกอินหรือสถานะสำคัญของบัญชีผู้ใช้

ก่อนจะเริ่มใช้งาน Session ใน PHP คุณต้องเรียกใช้คำสั่ง session_start() เสมอที่บรรทัดแรกสุดของไฟล์ PHP คำสั่งนี้จะบอกให้เซิร์ฟเวอร์เตรียมพื้นที่หน่วยความจำเพื่อเก็บข้อมูลของผู้ใช้นั้น ๆ หากมี Session ID อยู่แล้ว ระบบจะทำการดึงข้อมูลเดิมกลับมาให้เราใช้งานผ่านตัวแปรพิเศษที่ชื่อว่า $_SESSION

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

// เริ่มต้น Session ก่อนเสมอ
session_start();

// เก็บข้อมูลใน Session
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'dev_junior';

// ดึงข้อมูลมาใช้งาน
echo "ยินดีต้อนรับคุณ: " . $_SESSION['username'];

โค้ดตัวอย่างนี้แสดงการเปิดใช้งาน Session เพื่อจัดเก็บข้อมูลผู้ใช้ หลังจาก session_start() ถูกเรียกใช้ เราสามารถกำหนดค่าให้ $_SESSION ได้เหมือน Array ปกติ ข้อมูลเหล่านี้จะคงอยู่ตราบเท่าที่ผู้ใช้ยังไม่ปิดเบราว์เซอร์หรือเราทำการสั่งลบข้อมูล

การตั้งค่าความปลอดภัยเพื่อป้องกันช่องโหว่

ในฐานะนักพัฒนา คุณต้องตระหนักว่า Session และ Cookie เป็นเป้าหมายหลักของแฮกเกอร์ การโจมตีที่พบบ่อยที่สุดคือ Session Hijacking (การขโมย Session ID ของผู้อื่น) เพื่อสวมรอยเป็นผู้ใช้คนนั้น การป้องกันเบื้องต้นทำได้โดยการตั้งค่า Cookie Flags ให้รัดกุมที่สุดเท่าที่จะทำได้

คุณควรตั้งค่า HttpOnly เพื่อป้องกันไม่ให้ JavaScript เข้าถึง Cookie ได้โดยตรง ซึ่งช่วยลดความเสี่ยงจากการโจมตีแบบ XSS (Cross-Site Scripting) และควรใช้ Secure flag ร่วมด้วยเพื่อให้ Cookie ส่งผ่านเฉพาะการเชื่อมต่อแบบ HTTPS เท่านั้น เพื่อป้องกันการถูกดักฟังข้อมูลระหว่างทางผ่านเครือข่ายสาธารณะ

นอกจากนี้ การหมุนเวียน Session ID เป็นประจำด้วยฟังก์ชัน session_regenerate_id(true) ทุกครั้งที่มีการเปลี่ยนระดับสิทธิ์ (เช่น การล็อกอิน) จะเป็นวิธีที่ดีที่สุดในการป้องกันการโจมตีแบบ Session Fixation ซึ่งเป็นเทคนิคที่แฮกเกอร์พยายามกำหนด Session ID ให้เหยื่อเพื่อเข้าถึงบัญชีโดยไม่ได้รับอนุญาต

// ตั้งค่า Session Cookie ให้ปลอดภัยยิ่งขึ้น
session_start([
    'cookie_lifetime' => 86400,
    'cookie_secure' => true,    // ส่งผ่าน HTTPS เท่านั้น
    'cookie_httponly' => true,  // ป้องกันการเข้าถึงด้วย JavaScript
    'use_strict_mode' => true   // ป้องกันการยัดเยียด Session ID
]);

// สร้าง ID ใหม่ทุกครั้งที่ล็อกอินสำเร็จ
session_regenerate_id(true);

โค้ดนี้แสดงการตั้งค่า Session ที่เข้มงวดขึ้นผ่านการกำหนดค่าใน session_start() ซึ่งเป็นแนวปฏิบัติที่โปรแกรมเมอร์มืออาชีพต้องทำเพื่อให้แอปพลิเคชันมีความปลอดภัยสูง การใช้ session_regenerate_id(true) จะช่วยล้าง ID เก่าทิ้งและสร้าง ID ใหม่ที่สะอาดหมดจด

ข้อผิดพลาดที่มือใหม่มักเจอและวิธีแก้ไข

ปัญหาคลาสสิกที่ทุกคนต้องเจอคือ "Headers already sent" ซึ่งเกิดจากการเรียกคำสั่ง session_start() หรือ setcookie() หลังจากที่มีการแสดงผล HTML ออกไปแล้ว โปรดจำไว้ว่าคำสั่งเหล่านี้ต้องทำงานก่อนการส่งข้อมูลใด ๆ ออกทาง Browser เสมอ หากมีข้อความแสดงผลแม้แต่บรรทัดเดียว ระบบจะแจ้งเตือน Error ทันที

อีกจุดหนึ่งคือการลืมตรวจสอบว่ามีข้อมูลอยู่ใน Session หรือไม่ก่อนนำไปใช้งาน การพยายามเข้าถึง $_SESSION['user_id'] โดยที่ยังไม่ได้ session_start() หรือยังไม่มีข้อมูลอยู่ จะทำให้เกิด Notice Error ใน PHP ซึ่งดูไม่เป็นมืออาชีพและอาจทำให้โปรแกรมทำงานผิดพลาดในส่วนถัดไปได้

คำแนะนำสำหรับคนที่กำลังฝึกคือ ให้สร้างไฟล์ config.php หรือ session.php แยกออกมาเพื่อทำหน้าที่จัดการเรื่อง Session โดยเฉพาะ แล้วใช้คำสั่ง require_once ไปเรียกใช้ในทุกหน้าของเว็บ วิธีนี้จะช่วยให้คุณจัดการระบบสมาชิกได้เป็นระเบียบและลดโอกาสการเกิดบั๊กจากการลืมเปิดใช้งาน Session ได้อย่างเด็ดขาด

  1. สร้างไฟล์ init.php และใส่โค้ด session_start(); ไว้ด้านบนสุด
  2. ใช้ require_once 'init.php'; ไว้ที่บรรทัดแรกของทุกหน้าเว็บที่คุณต้องการจัดการสมาชิก
  3. ทดสอบด้วยการเปิด Browser ตรวจสอบในส่วน Application/Storage เพื่อดูว่า Cookie ถูกสร้างขึ้นจริงหรือไม่

สรุป: นำไปใช้ในโปรเจกต์จริง

การจัดการ Session และ Cookie ไม่ใช่เรื่องของการเขียนโค้ดให้ทำงานได้เท่านั้น แต่เป็นเรื่องของความปลอดภัยและการออกแบบระบบให้ผู้ใช้งานได้รับประสบการณ์ที่ดีที่สุด หากคุณต้องการสร้าง Portfolio ที่ดูเป็นมืออาชีพ ให้ลองทำระบบล็อกอินง่าย ๆ ที่มีการตรวจสอบ Session ในทุกหน้า ถ้าผู้ใช้ยังไม่ได้ล็อกอิน ให้ใช้คำสั่ง header('Location: login.php') เพื่อส่งผู้ใช้กลับไปหน้าเข้าสู่ระบบทันที

จำไว้เสมอว่า Session คือหัวใจของระบบสมาชิก ส่วน Cookie คือเครื่องมืออำนวยความสะดวกในการจดจำการตั้งค่า การเลือกใช้ให้ถูกสถานการณ์จะทำให้แอปพลิเคชันของคุณมีประสิทธิภาพและปลอดภัย โปรแกรมเมอร์ที่ดีไม่ใช่คนที่เขียนโค้ดได้ซับซ้อนที่สุด แต่คือคนที่เข้าใจพื้นฐานและคำนึงถึงความปลอดภัยของข้อมูลผู้ใช้อยู่เสมอ เริ่มต้นฝึกจากโปรเจกต์เล็ก ๆ แล้วขยายไปสู่การสร้างระบบที่ซับซ้อนขึ้นตาม Roadmap ของคุณ

สุดท้ายนี้ หากคุณพบปัญหาในการเขียนโค้ด อย่าลืมหัดใช้ Debugger หรือเช็ค Log ของเซิร์ฟเวอร์บ่อย ๆ การแก้ปัญหาด้วยตัวเองเป็นวิธีที่ดีที่สุดในการพัฒนาทักษะ สำหรับมือใหม่ที่กำลังเปลี่ยนสายงาน ขอให้โฟกัสที่การทำความเข้าใจ Logic มากกว่าการจำคำสั่ง เพราะเมื่อพื้นฐานเหล่านี้แน่นแล้ว คุณจะสามารถเรียนรู้ Framework ใหม่ ๆ ในอนาคตได้อย่างรวดเร็วแน่นอน

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย
PHP

สร้างระบบ Authentication ด้วย PHP 8: สอนทำระบบ Login และ Hash รหัสผ่านให้ปลอดภัย

เรียนรู้วิธีสร้างระบบ Authentication ด้วย PHP 8 ตั้งแต่การสมัครสมาชิก การ Hash รหัสผ่านด้วย password_hash ไปจนถึงการทำระบบ Login และ Protected Dashboard

1 month ago 7 นาที
21 views
สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters
PHP

สอน PHP 8 จัดการฐานข้อมูล CRUD: วิธี UPDATE และ DELETE ข้อมูลอย่างปลอดภัยด้วย Bind Parameters

เรียนรู้วิธีแก้ไขและลบข้อมูลในฐานข้อมูลด้วย PHP 8 และ PDO พร้อมเทคนิคการใช้ Bind Parameters เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 6 นาที
20 views
สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection
PHP

สอนเขียน PHP 8 เชื่อมต่อฐานข้อมูลด้วย PDO ทำ CRUD อย่างปลอดภัย ป้องกัน SQL Injection

เรียนรู้วิธีจัดการฐานข้อมูลด้วย PHP 8 ผ่าน PDO อย่างมืออาชีพ พร้อมเทคนิคการใช้ Prepared Statements เพื่อป้องกัน SQL Injection สำหรับมือใหม่หัดเขียนเว็บ

1 month ago 7 นาที
21 views