1.8 עוגיות הרצאה
מדוע אנחנו צריכים Cookies ו-Sessions?¶
כאשר אנו בונים אתרים דינמיים, אנו צריכים דרך לשמור מידע בין דפים שונים או בין ביקורים שונים של אותו משתמש. HTTP הוא פרוטוקול stateless - כלומר, כל בקשת HTTP עומדת בפני עצמה, והשרת לא זוכר מידע מבקשות קודמות. כאן נכנסים לתמונה Cookies ו-Sessions:
- עוגיות Cookies - נשמרים בצד הלקוח (בדפדפן) וניתן לשמור בהם מידע לזמן מוגבל או ארוך טווח
- סשנים Sessions - נשמרים בצד השרת ומאפשרים שמירת מידע זמני רק בזמן הגלישה הנוכחית
חלק 1: Cookies - עוגיות בצד הלקוח¶
מה זה Cookie?¶
קוקי הוא פיסת מידע קטנה (עד 4KB) שהשרת שולח לדפדפן, והדפדפן שומר אותו ומחזיר אותו בכל בקשת עתידית לשרת.
שימושים נפוצים ל-Cookies:¶
- זיהוי משתמשים (לאימות)
- שמירת העדפות משתמש (עיצוב, שפה)
- מעקב אחר התנהגות משתמש (אנליטיקה)
- עגלות קניות באתרי מסחר
יצירת Cookie ב-PHP¶
setcookie(
name: "user", // שם הקוקי
value: "john_doe", // הערך
expires_or_options: time() + 3600, // תוקף - שעה מה עכשיו
path: "/", // נתיב באתר שבו הקוקי תקף
domain: "example.com", // דומיין שבו הקוקי תקף
secure: true, // נשלח רק מעל HTTPS
httponly: true // לא נגיש דרך JavaScript
);
// דרך פשוטה יותר:
setcookie("theme", "dark", time() + (86400 * 30), "/"); // תקף ל-30 יום
לאחר שהמשתמש פנה לphp כזה, בבקשת הhttp השרת יוסיף לheader שלו את הheader שנקרא "set-cookie" שבו הוא מבקש מהדפדפן לשמור משתנה מסוים (העוגיה)
ומאז, כל בקשת http שהדפדפן יוציא לאותו אתר, הדפדפן יוציא את הבקשה עם הheader הבא: "Cookie:" כאשר הוא מכיל את העוגיה שהשרת ביקש ממנו לשמור.
קריאת Cookie ב-PHP¶
שנקבל בקשות http עם עוגיות, נוכל לגשת אליהם כך:
מחיקת Cookie¶
דוגמה מעשית: שמירת העדפת עיצוב¶
// בדף העדפות
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$theme = $_POST['theme']; // 'light' או 'dark'
setcookie("site_theme", $theme, time() + (86400 * 365), "/");
header("Location: ".$_SERVER['HTTP_REFERER']);
exit;
}
// בדפים אחרים
$theme = $_COOKIE['site_theme'] ?? 'light'; // ברירת מחדל - light
echo "<body class='$theme'>";
חלק 2: Sessions - ניהול מצב בצד השרת¶
מה זה Session?¶
סשן הוא מנגנון לשמירת מידע בצד השרת עבור משתמש ספציפי, תוך שימוש במזהה ייחודי (Session ID) שנשמר כ-Cookie אצל הלקוח.
יתרונות Sessions על פני Cookies:¶
- אבטחה - הנתונים נשמרים בשרת, לא אצל הלקוח
- גודל - יכולים להכיל יותר מ-4KB נתונים
- רגישות - מתאימים לנתונים רגישים כמו פרטי התחברות
התחלת Session ב-PHP¶
session_start(); // חייב להיות לפני כל פלט לדפדפן!
// הגדרת משתני סשן
$_SESSION['username'] = 'john_doe';
$_SESSION['last_login'] = date('Y-m-d H:i:s');
שימוש בנתוני Session¶
session_start();
if (isset($_SESSION['username'])) {
echo "ברוך הבא, " . $_SESSION['username'];
echo "התחברת לאחרונה ב: " . $_SESSION['last_login'];
} else {
echo "אנא התחבר למערכת";
}
סיום Session¶
session_start();
// איפוס כל משתני הסשן
$_SESSION = [];
// מחיקת קוקי הסשן
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']
);
}
// הרס הסשן
session_destroy();
header("Location: login.php");
exit;
דוגמה מעשית: מערכת התחברות¶
// login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
// בדיקה מול מסד הנתונים (דוגמה פשטנית)
if ($username === 'admin' && $password === '123456') {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['login_time'] = time();
header("Location: dashboard.php");
exit;
} else {
$error = "פרטי התחברות לא נכונים";
}
}
// dashboard.php
session_start();
if (!isset($_SESSION['loggedin']) {
header("Location: login.php");
exit;
}
echo "ברוך הבא, " . $_SESSION['username'];
echo "<a href='logout.php'>התנתק</a>";
חלק 3: השוואה בין Cookies ל-Sessions¶
| מאפיין | Cookies | Sessions |
|---|---|---|
| מיקום אחסון | דפדפן המשתמש | שרת |
| גודל מקסימלי | ~4KB | מוגבל רק ע"י הזיכרון בשרת |
| אבטחה | פחות מאובטח - נגיש ל-JS | מאובטח יותר - נשמר בשרת |
| משך חיים | ניתן להגדיר תאריך תפוגה | נמחק כשהדפדפן נסגר (ברירת מחדל) |
| שימוש אופייני | העדפות משתמש, מעקב | התחברות משתמש, עגלת קניות |
| גישה ב-PHP | $_COOKIE |
$_SESSION |
דגומאות לקוד:
גרסה עם Cookies (פשוטה)¶
// הוספת מוצר
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), "/");
}
// הצגת עגלה
$cart = json_decode($_COOKIE['cart'] ?? '[]', true);
echo "מספר מוצרים בעגלה: " . count($cart);
גרסה עם Sessions (מאובטחת יותר)¶
session_start();
// אתחול עגלה אם לא קיימת
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
// הוספת מוצר
if (isset($_GET['add_to_cart'])) {
$product_id = (int)$_GET['add_to_cart'];
$_SESSION['cart'][] = $product_id;
header("Location: cart.php");
exit;
}
// הצגת עגלה
echo "מספר מוצרים בעגלה: " . count($_SESSION['cart']);