คุกกี้และเซสชันคืออะไรและเกี่ยวข้องกันอย่างไร


86

ฉันพยายามทำความเข้าใจคุกกี้และเซสชันอย่างมืออาชีพ ฉันรู้ว่าเมื่อเบราว์เซอร์เชื่อมต่อกับเซิร์ฟเวอร์เซิร์ฟเวอร์ "ขอให้" เบราว์เซอร์ "วาง" คุกกี้ที่มี "phpsessid" ในโฟลเดอร์คุกกี้ของเบราว์เซอร์ไคลเอนต์

ตอนนี้เรามี "phpsessid" แล้วหากไคลเอนต์เข้าสู่เซิร์ฟเวอร์เบราว์เซอร์จะส่ง "phpsessid" ไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์จะดูที่โฟลเดอร์ tmp และหากเรามีข้อมูลที่ตรงกันก็จะโหลดข้อมูลทั้งหมดที่ผู้ใช้มี ลูกค้ารายนี้ แต่ฉันค่อนข้างสับสนกับกระบวนการนี้

ฉันจะขอบคุณถ้ามีใครช่วยให้ฉันเข้าใจกระบวนการสร้างเซสชันและคุกกี้เหล่านั้นได้ - สิ่งที่เกิดขึ้นเบื้องหลัง


ดูเหมือนว่าคุณจะรู้แล้วว่าเกิดอะไรขึ้น คุณต้องการรู้แจ้งในส่วนใดเป็นพิเศษ ส่วน HTTP / คุกกี้หรือ PHP โหลดที่เก็บเซสชันอย่างไร
มาริโอ

คุกกี้ที่เบราว์เซอร์บันทึกด้วย phpsessid นี่คือ phpsessid เพื่อระบุไคลเอ็นต์สำหรับการสร้างเซสชันและคุกกี้หรือไม่
Blanktext

คุกกี้ที่เบราว์เซอร์มี id เซสชัน php ซึ่งบอกเซิร์ฟเวอร์ว่า "เฮ้ฉันรู้บทนี้" จากนั้นเซิร์ฟเวอร์จะดึงข้อมูลเซสชัน (จาก / tmp / เป็นต้น) และกู้คืนผู้ใช้ $ _SESSION
somedev

ใช่ฉันรู้ แต่ฉันกำลังถามว่า "phpsessid" นี้ใช้เพื่อระบุไคลเอ็นต์ก่อนสร้างเซสชันและคุกกี้หรือไม่ phpsessid นี้รวมอยู่ในข้อมูลคุกกี้และคอมพิวเตอร์ไคลเอนต์และอยู่ในไฟล์เซสชันที่โฟลเดอร์ tmp ของเซิร์ฟเวอร์ เหรอ?
Blanktext

คำตอบ:


173

มาดูสิ่งนี้กัน:

คุกกี้และเซสชันเป็นทั้งสองวิธีในการรักษาสถานะของแอปพลิเคชันระหว่างคำขอต่างๆที่เบราว์เซอร์สร้างขึ้น ต้องขอบคุณพวกเขาที่ยกตัวอย่างเช่นคุณไม่จำเป็นต้องเข้าสู่ระบบทุกครั้งที่คุณขอเพจบน StackOverflow StackOverflow

คุ้กกี้

คุกกี้เป็นข้อมูลขนาดเล็ก (ความยาวสูงสุด 4KB) ซึ่งเก็บข้อมูลไว้ในคู่คีย์ = ค่า:

name=value; name2=value2

สิ่งเหล่านี้ถูกกำหนดโดยJavaScriptหรือผ่านเซิร์ฟเวอร์โดยใช้ส่วนหัว HTTPส่วนหัว

คุกกี้มีชุดวันที่และเวลาหมดอายุตัวอย่างเช่นการใช้ส่วนหัว HTTP:

Set-Cookie: name2=value2; Expires=Wed, 19 Jun 2021 10:18:14 GMT

ซึ่งจะทำให้เบราว์เซอร์ตั้งชื่อคุกกี้name2ด้วยค่าvalue2ซึ่งจะหมดอายุในอีกประมาณ 9 ปี

คุกกี้ถือว่าไม่ปลอดภัยอย่างมากเนื่องจากผู้ใช้สามารถจัดการกับเนื้อหาของตนได้อย่างง่ายดาย นั่นเป็นเหตุผลที่คุณควรตรวจสอบข้อมูลคุกกี้อยู่เสมอข้อมูลคุกกี้ตรวจสอบเสมออย่าถือว่าสิ่งที่คุณได้รับจากคุกกี้จำเป็นต้องเป็นสิ่งที่คุณคาดหวัง

โดยปกติคุกกี้จะใช้เพื่อรักษาสถานะการเข้าสู่ระบบโดยที่ชื่อผู้ใช้และแฮชพิเศษถูกส่งจากเบราว์เซอร์และเซิร์ฟเวอร์จะตรวจสอบกับฐานข้อมูลเพื่ออนุมัติการเข้าถึง

คุกกี้มักใช้ในการสร้างเซสชัน

เซสชัน

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

โดยปกติเซสชันจะมีอายุสั้นซึ่งทำให้เหมาะอย่างยิ่งในการบันทึกสถานะชั่วคราวระหว่างแอปพลิเคชัน นอกจากนี้เซสชันจะหมดอายุเมื่อผู้ใช้ปิดเบราว์เซอร์

การประชุมมีการพิจารณาความปลอดภัยมากกว่าคุกกี้เพราะตัวแปรที่ตัวเองจะถูกเก็บไว้บนเซิร์ฟเวอร์ นี่คือวิธีการทำงาน:

  1. เซิร์ฟเวอร์เปิดเซสชัน (ตั้งค่าคุกกี้ผ่านส่วนหัว HTTP)
  2. เซิร์ฟเวอร์ตั้งค่าตัวแปรเซสชัน
  3. หน้าการเปลี่ยนแปลงของลูกค้า
  4. ลูกค้าส่งคุกกี้ทั้งหมดพร้อมกับรหัสเซสชันจากขั้นตอนที่ 1
  5. เซิร์ฟเวอร์อ่านรหัสเซสชันจากคุกกี้
  6. เซิร์ฟเวอร์จับคู่รหัสเซสชันจากรายการในฐานข้อมูล (หรือหน่วยความจำ ฯลฯ )
  7. เซิร์ฟเวอร์ค้นหาคู่ที่ตรงกันอ่านตัวแปรที่มีอยู่ใน$_SESSIONsuperglobal

หาก PHP ไม่พบรายการที่ตรงกันก็จะเริ่มเซสชันใหม่และทำซ้ำขั้นตอนที่ 1-7

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


นั่นคือส่วนสำคัญของมัน คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับคู่มือ PHP ในทั้งสองวิชา


1
นั่นหมายความว่าต้องเปิดคุกกี้เพื่อให้เซสชันทำงานได้หรือไม่?
bigpotato

1
@ Edmund: ในกรณีส่วนใหญ่ใช่ อย่างไรก็ตามคุณสามารถตั้งค่าเพื่อให้รหัสเซสชันถูกส่งผ่านตัวแปร GET (ซึ่งหมายความว่า session_id จะต้องต่อท้ายทุกหน้า ( hello.php?sid=cbe709ac7bed98f7ecb89713)
Ghost ของ Madara

ปิดเบราว์เซอร์บนอุปกรณ์ Android หรือ iPhone หมายความว่าอย่างไร หยุดแอป? ปิดอุปกรณ์? ปิดแท็บทั้งหมดและออก? ฯลฯ
Vandervals

2
@SurajJain ถ้าไม่ใช่คุกกี้ "จำฉันได้" มันคงอยู่นานกว่านี้
Madara's Ghost

4
คำถามอื่น ๆ : เมื่อผู้ใช้ปิดเบราว์เซอร์เซิร์ฟเวอร์จะได้รับการแจ้งเตือนจากเหตุการณ์นี้อย่างไรเพื่อให้เซิร์ฟเวอร์ลบรหัสเซสชันนี้ หรือมันจะหมดอายุโดยอัตโนมัติในบางครั้ง?
user2774480
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.