1.8 - עוגיות - הרצאה
מדוע אנחנו צריכים Cookies ו-Sessions?¶
כאשר אנו בונים אתרים דינמיים, אנו צריכים דרך לשמור מידע בין דפים שונים או בין ביקורים שונים של אותו משתמש. HTTP הוא פרוטוקול stateless - כלומר, כל בקשת HTTP עומדת בפני עצמה, והשרת לא זוכר מידע מבקשות קודמות. כאן נכנסים לתמונה Cookies ו-Sessions:
- עוגיות Cookies - נשמרים בצד הלקוח (בדפדפן) וניתן לשמור בהם מידע לזמן מוגבל או ארוך טווח
- סשנים Sessions - נשמרים בצד השרת ומאפשרים שמירת מידע זמני רק בזמן הגלישה הנוכחית
חלק 1: Cookies - עוגיות בצד הלקוח¶
מה זה Cookie?¶
קוקי הוא פיסת מידע קטנה (עד 4KB) שהשרת שולח לדפדפן, והדפדפן שומר אותו ומחזיר אותו בכל בקשת עתידית לשרת.
שימושים נפוצים ל-Cookies:¶
- זיהוי משתמשים (לאימות)
- שמירת העדפות משתמש (עיצוב, שפה)
- מעקב אחר התנהגות משתמש (אנליטיקה)
- עגלות קניות באתרי מסחר
יצירת Cookie ב-PHP¶
setcookie(
name: "user", // cookie name
value: "john_doe", // the value
expires_or_options: time() + 3600, // expiration - one hour from now
path: "/", // path on the site where the cookie is valid
domain: "example.com", // domain where the cookie is valid
secure: true, // sent only over HTTPS
httponly: true // not accessible via JavaScript
);
// A simpler way:
setcookie("theme", "dark", time() + (86400 * 30), "/"); // valid for 30 days
לאחר שהמשתמש פנה לphp כזה, בבקשת הhttp השרת יוסיף לheader שלו את הheader שנקרא "set-cookie" שבו הוא מבקש מהדפדפן לשמור משתנה מסוים (העוגיה)
ומאז, כל בקשת http שהדפדפן יוציא לאותו אתר, הדפדפן יוציא את הבקשה עם הheader הבא: "Cookie:" כאשר הוא מכיל את העוגיה שהשרת ביקש ממנו לשמור.
קריאת Cookie ב-PHP¶
שנקבל בקשות http עם עוגיות, נוכל לגשת אליהם כך:
if (isset($_COOKIE['user'])) {
echo "Hello, " . $_COOKIE['user'];
} else {
echo "Unrecognized user";
}
מחיקת Cookie¶
דוגמה מעשית: שמירת העדפת עיצוב¶
// On the preferences page
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$theme = $_POST['theme']; // 'light' or 'dark'
setcookie("site_theme", $theme, time() + (86400 * 365), "/");
header("Location: ".$_SERVER['HTTP_REFERER']);
exit;
}
// On other pages
$theme = $_COOKIE['site_theme'] ?? 'light'; // default - light
echo "<body class='$theme'>";
חלק 2: Sessions - ניהול מצב בצד השרת¶
מה זה Session?¶
סשן הוא מנגנון לשמירת מידע בצד השרת עבור משתמש ספציפי, תוך שימוש במזהה ייחודי (Session ID) שנשמר כ-Cookie אצל הלקוח.
יתרונות Sessions על פני Cookies:¶
- אבטחה - הנתונים נשמרים בשרת, לא אצל הלקוח
- גודל - יכולים להכיל יותר מ-4KB נתונים
- רגישות - מתאימים לנתונים רגישים כמו פרטי התחברות
התחלת Session ב-PHP¶
session_start(); // must be before any output to the browser!
// Set session variables
$_SESSION['username'] = 'john_doe';
$_SESSION['last_login'] = date('Y-m-d H:i:s');
שימוש בנתוני Session¶
session_start();
if (isset($_SESSION['username'])) {
echo "Welcome, " . $_SESSION['username'];
echo "You last logged in at: " . $_SESSION['last_login'];
} else {
echo "Please log in to the system";
}
סיום Session¶
session_start();
// Reset all session variables
$_SESSION = [];
// Delete the session cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']
);
}
// Destroy the session
session_destroy();
header("Location: login.php");
exit;
דוגמה מעשית: מערכת התחברות¶
// login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
// Check against the database (simplified example)
if ($username === 'admin' && $password === '123456') {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['login_time'] = time();
header("Location: dashboard.php");
exit;
} else {
$error = "Incorrect login details";
}
}
// dashboard.php
session_start();
if (!isset($_SESSION['loggedin']) {
header("Location: login.php");
exit;
}
echo "Welcome, " . $_SESSION['username'];
echo "<a href='logout.php'>Log out</a>";
חלק 3: השוואה בין Cookies ל-Sessions¶
| מאפיין | Cookies | Sessions |
|---|---|---|
| מיקום אחסון | דפדפן המשתמש | שרת |
| גודל מקסימלי | ~4KB | מוגבל רק ע"י הזיכרון בשרת |
| אבטחה | פחות מאובטח - נגיש ל-JS | מאובטח יותר - נשמר בשרת |
| משך חיים | ניתן להגדיר תאריך תפוגה | נמחק כשהדפדפן נסגר (ברירת מחדל) |
| שימוש אופייני | העדפות משתמש, מעקב | התחברות משתמש, עגלת קניות |
| גישה ב-PHP | $_COOKIE |
$_SESSION |
דגומאות לקוד:
גרסה עם Cookies (פשוטה)¶
// Add product
if (isset($_GET['add_to_cart'])) {
$product_id = $_GET['add_to_cart'];
$cart = json_decode($_COOKIE['cart'] ?? '[]', true);
$cart[] = $product_id;
setcookie("cart", json_encode($cart), time() + (86400 * 30), "/");
}
// Display cart
$cart = json_decode($_COOKIE['cart'] ?? '[]', true);
echo "Number of products in cart: " . count($cart);
גרסה עם Sessions (מאובטחת יותר)¶
session_start();
// Initialize cart if it doesn't exist
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// Add product
if (isset($_GET['add_to_cart'])) {
$product_id = (int)$_GET['add_to_cart'];
$_SESSION['cart'][] = $product_id;
header("Location: cart.php");
exit;
}
// Display cart
echo "Number of products in cart: " . count($_SESSION['cart']);