W budowie
Materiał edukacyjny · Informatyka Utrzymywanie stanu użytkownika między żądaniami HTTP

CZĘŚĆ 10

Sesje i ciasteczka

PPrezentacja dla nauczyciela

Protokół HTTP jest bezstanowy — serwer nie wie, że dwa kolejne żądania pochodzą od tego samego użytkownika. Sesje (po stronie serwera) i ciasteczka (po stronie przeglądarki) pozwalają zapamiętać stan: logowanie, zawartość koszyka czy wybrany motyw. Na egzaminie INF.03 to kluczowy element bezpieczeństwa i logiki aplikacji.

Sesja: pamięć między stronami

Sesja przechowuje dane po stronie serwera i wiąże je z przeglądarką przez identyfikator w ciasteczku. Dlatego koszyk albo login „pamiętają się” między podstronami, choć HTTP sam z siebie jest bezstanowy.

Sesję zaczynamy funkcją session_start() — musi być wywołana przed jakimkolwiek wyjściem HTML. Dane zapisujemy w tablicy $_SESSION, np. $_SESSION['user'] = 'Ola';.

Sesja wygasa po zamknięciu przeglądarki (domyślnie) albo po czasie bezczynności ustawionym na serwerze. Do usunięcia danych służy unset(), a do całkowitego zakończenia session_destroy().

session_start();

$_SESSION['uczen'] = 'Ola';
$_SESSION['odwiedziny'] = ($_SESSION['odwiedziny'] ?? 0) + 1;

echo 'Uczen: ' . $_SESSION['uczen'];
echo '<p>Odwiedziny: ' . $_SESSION['odwiedziny'] . '</p>';
1. Gdzie trzymane są dane sesji?
2. Kiedy wywołujemy session_start()?
3. Jak usunąć dane sesji?

Logowanie i wylogowanie w sesji

Po poprawnym sprawdzeniu hasła zapisujemy w sesji identyfikator użytkownika, a nie samo imię — imię może się zmienić, a identyfikator jest stały. Na każdej chronionej stronie sprawdzamy, czy klucz istnieje.

Wylogowanie czyści dane sesji i niszczy ją, a następnie przekierowuje na stronę logowania. Samo unset($_SESSION['user']) bywa niewystarczające, gdy w sesji są też inne dane.

Do przekierowania służy header('Location: ...'), wywołane przed jakimkolwiek wyjściem. Po nim zawsze dajemy exit.

session_start();

// logowanie
if (($_POST['login'] ?? '') === 'ola' && ($_POST['haslo'] ?? '') === 'tajne') {
    $_SESSION['user_id'] = 7;
    header('Location: panel.php');
    exit;
}

// wylogowanie
if (isset($_GET['wyjdz'])) {
    $_SESSION = [];
    session_destroy();
    header('Location: login.php');
    exit;
}
4. Co zapisujemy w sesji po logowaniu?
5. Co robi session_destroy()?
6. Co musi być przed header()?

Ciasteczka i czas życia

Ciasteczko zapisuje mały tekst w przeglądarce i odsyła go przy każdym żądaniu. Tworzymy je funkcją setcookie() z nazwą, wartością i czasem życia w sekundach.

Ciasteczko z czasem życia 0 znika po zamknięciu przeglądarki. Datę w przeszłości używamy do usunięcia ciasteczka — nie ma osobnej funkcji „usuń”.

Ciasteczka są widoczne dla użytkownika, więc nie wolno w nich trzymać haseł. Do przechowywania stanu lepsza jest sesja, a ciasteczko bywa używane na przykład do zapamiętania motywu strony.

setcookie('motyw', 'ciemny', time() + 60 * 60 * 24 * 30);
setcookie('ostatnia', date('Y-m-d'), time() + 3600);

echo 'Zapisane. Motyw: ' . ($_COOKIE['motyw'] ?? 'domyslny');

// usuniecie
setcookie('motyw', '', time() - 3600);
7. Gdzie zapisywane jest ciasteczko?
8. Jak usunąć ciasteczko?
9. Czego nie wolno trzymać w ciasteczku?

Ćwiczenia