# PHP sessions Princip SESSIONS spočívá v použití _cookies_ na straně uživatele (prohlížeče) a speciáního souboru na straně serveru. Při opakované návštěvě stránek prohlížeč odešle společně s požadavkem na stránku i _cookie_ vázané ke stejné doméně. Server se pak podívá mezi soubory, zdali tam není takový, který by nesl stejný identifikátor, jako je uložený v _cookie_. To znamená, že prohlížeč si pamatuje, že jste na stránce byli, a pokud tu informaci pošle serveru, tak si vzpomene i server a dojde k navázání sezení, které proběhlo v minulosti. Proč _cookies_ vůbec vznikly? Ukázalo se praktické pro server/vývojáře vědět, zdali ten, kdo se z prohlížeče dívá na stránku `http://localhost:8080/auto.php` je táž osoba, která zrovna klikla na `http://localhost:8080/motorka.php`. - Jak je vidět, je to stejný server/doména `localhost`. - Ovšem jiná URL (stránka) (`auto.php` nebo `motorka.php`) - Díky session můžeme poznat, že jde o stejného uživatele A proč to vývojář tak potřebuje vědět? Předtím, než cookies znásilnily reklamní systémy a jiné marketingové nástroje to mělo, a tedy stále má (to jsou ty tzv. _funkční_ cookies, které nejde "vypnout") funkci např. pamatovat si zdali je uživatel přihlášený a podle toho mu nabídnout obsah, který s tím souvisí. ## Implementace Chceme-li použít sessions, je třeba v každém skriptu, který se volá přes URL (např. [index.php](./index.php) nebo [login.php](./login.php)) zavolat funkci `session_start()`. Všimněte si, že např. v souboru [content.php](./content.php) zmíněná funkce není. To proto, že se tento souboru vkládá pomocí `include` v souboru `index.php` (nepřistupuje se k němu přímo z URL). Jakmile zavoláme funkci `session_start()`, máme dostupnou super globální proměnnou `$_SESSION`. A můžeme např. zjistit, zdali je uživatel přihlášený. ```php if (isset($_SESSION['login'])) { $user_is_logged = true; } ``` Pozor ovšem, `$_SESSION['login']` je námi vytvořená hodnota, ovšem v tomto textu je popsaná o pár odstavců dál. Jak si můžete všimnout ve skriptu `index.php`, využíváme pak novou proměnnou `$user_is_logged` pro rozhodování, jaký obsah uživateli zobrazíme - zdali formulář nebo obsah dostupný pouze pro přihlášeného uživatele. ### Ukázka využití - přihlášení Není-li uživatel přihlášený, zobrazí se mu formulář. Po jeho odeslální dojde k ověření (autentizaci) ve skriptu [login.php](./login.php). Ignorujme pro teď fakt, že jsme se dopustili fatálního přešlapu tím, že jsme přihlašovací údaje vložili přímo do skriptu. Nicméně, bude-li autentizace úspěšná, uloží se přihlásovací jméno do session. ```php $_SESSION["login"] = $_POST["login"]; ``` Následně se provede přesměrování zpět na výchozí stránku. ```php header("Location: /index.php"); ``` ### Cookies Podíváte-li se do "Developer console" (F12), uvidíte mezi "Cookies" navštívenou stránku. ![Cookies](./docs/client-cookies.png) Cookie nese název `PHPSESSID` Poměrně zásadní fakt je, že cookie nese pouze hodnotu nějakého identifikátoru, zde `32965ff632572288af24f0f007393efa`. Nic víc. Na serveru se pak vytvořil soubor `sess_32965ff632572288af24f0f007393efa`, který má v názvu týž identifikátor. ![Session file](./docs/server-session.png) Důležité je, že identifikátor zná pouze klient (prohlížeč) a server. Ideálně nikdo další není zainteresován. A ano, pokud někdo zjistí např. tuto hodnotu `32965ff632572288af24f0f007393efa`, tak jeho šance na získání vašeho sezení se astronomicky zvýšily. Otázkou pak je, k čemu ten identifikátor byl ... e-shop? sociální síť? banka?