לדלג לתוכן

1.8 עוגיות הרצאה

מדוע אנחנו צריכים Cookies ו-Sessions?

כאשר אנו בונים אתרים דינמיים, אנו צריכים דרך לשמור מידע בין דפים שונים או בין ביקורים שונים של אותו משתמש. HTTP הוא פרוטוקול stateless - כלומר, כל בקשת HTTP עומדת בפני עצמה, והשרת לא זוכר מידע מבקשות קודמות. כאן נכנסים לתמונה Cookies ו-Sessions:

  • עוגיות Cookies - נשמרים בצד הלקוח (בדפדפן) וניתן לשמור בהם מידע לזמן מוגבל או ארוך טווח
  • סשנים Sessions - נשמרים בצד השרת ומאפשרים שמירת מידע זמני רק בזמן הגלישה הנוכחית

חלק 1: Cookies - עוגיות בצד הלקוח

קוקי הוא פיסת מידע קטנה (עד 4KB) שהשרת שולח לדפדפן, והדפדפן שומר אותו ומחזיר אותו בכל בקשת עתידית לשרת.

שימושים נפוצים ל-Cookies:

  1. זיהוי משתמשים (לאימות)
  2. שמירת העדפות משתמש (עיצוב, שפה)
  3. מעקב אחר התנהגות משתמש (אנליטיקה)
  4. עגלות קניות באתרי מסחר

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:" כאשר הוא מכיל את העוגיה שהשרת ביקש ממנו לשמור.

שנקבל בקשות http עם עוגיות, נוכל לגשת אליהם כך:

if (isset($_COOKIE['user'])) {
    echo "שלום, " . $_COOKIE['user'];
} else {
    echo "משתמש לא מזוהה";
}

// למחוק קוקי - מגדירים תאריך עבר
setcookie("user", "", time() - 3600, "/");

דוגמה מעשית: שמירת העדפת עיצוב

// בדף העדפות
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:

  1. אבטחה - הנתונים נשמרים בשרת, לא אצל הלקוח
  2. גודל - יכולים להכיל יותר מ-4KB נתונים
  3. רגישות - מתאימים לנתונים רגישים כמו פרטי התחברות

התחלת 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>";
// logout.php
session_start();
session_destroy();
header("Location: login.php");
exit;

חלק 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']);