לדלג לתוכן

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

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

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

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

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

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

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

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

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

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

if (isset($_COOKIE['user'])) {
    echo "Hello, " . $_COOKIE['user'];
} else {
    echo "Unrecognized user";
}

// To delete a cookie - set a past date
setcookie("user", "", time() - 3600, "/");

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

// 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:

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

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

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