Tvorba internetových aplikací

Jakub Klinkovský

:: České vysoké učení technické v Praze
:: Fakulta jaderná a fyzikálně inženýrská
:: Katedra softwarového inženýrství

Akademický rok 2022-2023

Session (relace, sezení, seance)

Session je v informatice abstraktní pojem představující časově ohraničenou komunikaci mezi aplikací (serverem) a uživatelem (klientem). Session typicky zahrnuje více než jednu zprávu poslanou v každém směru.

Příklady:

  • uživatelská session v operačním systému (přihlášení a odhlášení)
  • session v prohlížeči: uložení otevřených stránek a nastavení při vypnutí prohlížeče
  • na webu:
    • vědomě vytvořená uživatelem (např. přihlášení a odhlášení)
    • sledovaná aplikací bez vědomí uživatele (např. aplikace sledující stránky navštívené daným uživatelem)

Implementace session v síťovém modelu

V kontextu OSI modelu lze session implementovat na různých úrovních:

  • transportní vrstva (transport layer):
    • např. TCP session nebo TCP socket
  • relační vrstva (session layer):
  • aplikační vrstva (application layer):
    • ukládání dat pro reprezentaci stavu a jejich předávání při komunikaci
    • umožňuje programátorovi kontrolu nad rozsahem session, a to i nezávisle na použitých protokolech

Jak přidat stav do webové aplikace?

Protokol HTTP/1.0 byl navržen jako bezstavový, tj. všechny požadavky jsou navzájem nezávislé a nenesou žádná data asociovaná s předchozí komunikací.

Způsoby reprezentace stavu nezávisle na protokolu HTTP:

  • předávání proměnných v URL (komunikace metodou GET), např.
    <a href="/kam/?prom1=h1&prom2=h2...">
    
  • předávání skrytých proměnných ve formulářích (komunikace metodou POST):
    <input type="hidden" name="prom1" value="h1">
    
    použití: např. {% csrf_token %} ve frameworku Django

Třetí způsob využívá přímo protokol HTTP/1.1 – tzv. cookies.

HTTP cookies

Cookie představuje malá data, která ukládá prohlížeč na disku klienta dle instrukcí serveru a odesílá je v dalších požadavcích při komunikaci se stejným serverem.

Cookies slouží k uchování stavových informací v jinak bezstavovém protokolu HTTP.

Využití:

  1. správa session v aplikaci (přihlášení, nákupní košík, ...)
  2. personalizace (uživatelské nastavení, nastavení vzhledu (theme), ...)
  3. sledování uživatele (pro zaznamenání a analýzu chování uživatele na webu)

Jak fungují cookies

Přenos dat obsažených v cookies využívá hlavičky požadavků a odpovědí v HTTP.

  1. Po zpracování prvního požadavku server odešle odpověď s hlavičkou Set-Cookie

    Obecný tvar: Set-Cookie: <cookie-name>=<cookie-value>

    Např.:

    HTTP/2.0 200 OK
    Content-Type: text/html
    Set-Cookie: yummy_cookie=choco
    Set-Cookie: tasty_cookie=strawberry
    
    [page content]
    

Jak fungují cookies

  1. Klient data zpracuje a uloží na disku.

  2. V každém dalším požadavku klient odešle všechny dosud nastavené cookies pomocí hlavičky Cookie.

    Např.:

    GET /sample_page.html HTTP/2.0
    Host: www.example.org
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry
    

Parametry cookies

Hlavička Set-Cookie umožňuje serveru specifikovat řadu parametrů pro danou cookie:

Např. Set-Cookie: <name>=<value>; Domain=<domain-value>; Secure; HttpOnly

  • Název cookie může obsahovat libovolné znaky z ASCII, kromě kontrolních znaků (0-32 a 127, tj. včetně všech bílých znaků) a znaků ()<>@,;:\"/[]?={}
  • Hodnota může obsahovat libovolné znaky z ASCII, kromě kontrolních znaků (0-32 a 127) a znaků ",;\. Dále může být volitelně uzavřena mezi znaky " a ". Některé implementace navíc provádějí URL-kódování.

Cookie může být doprovázena volitelnými parametry, které ovlivňují zpracování dat v prohlížeči.

Omezení délky života cookies

Parametry Expires=<date> a Max-Age=<number>:

  • pokud ani jeden není nasteven, jedná se o session cookie (délka života závisí na nastavení prohlížeče – může skončit po zavření okna, nebo nikdy)
  • datum a čas expirace závisí na nastavení hodin klienta!
  • Max-Age má přednost před Expires

Omezení přístupu ke cookies

  • parametr Secure:
    • data v dané cookie lze přenášet jen pomocí protokolu HTTPS
      (aplikace navštívená pomocí HTTP nesmí nastavit Secure cookie a klient nesmí Secure cookie poslat na server pomocí HTTP)
    • omezuje útoky typu man-in-the-middle, ale nezajistí 100% bezpečnost dat
  • parametr HttpOnly:
    • cookie není přístupná z JavaScriptu (pomocí objektu Document.cookie)
    • ale cookie se odešle i v požadavcích, které vznikly v kódu JavaScriptu
    • omezuje útoky typu cross-site scripting

Nastavení rozsahu platnosti cookies dle domény

  • parametr Domain:
    • pokud není nastaven, data se vztahují na přesně stejnou doménu (ne na subdomény)
    • pokud je nastaven, data se vždy vztahují i na všechny subdomény
    • nelze nastavit pro specifickou subdoménu, ale lze nastavit pro doménu vyšší úrovně (např. aplikace na sub.example.org může nastavit cookies pro example.org)
    • nelze nastavit více hodnot

Nastavení rozsahu platnosti cookies dle cesty

  • parametr Path:

    • specifikuje cestu, která se musí vyskytovat v URL, aby se cookie odeslala
    • např. cookie s parametrem Path=/docs:
      • vztahuje se na cesty /docs, /docs/, /docs/Web/, /docs/Web/HTTP
      • nevztahuje se na cesty /, /docsets, /fr/docs
  • parametr SameSite:

    • hodnoty Strict, Lax, None
    • např. cookies s SameSite=Strict jsou odesílány jen s požadavky, které pochází ze stránky na stejné doméně, na kterou se cookie vztahuje

Cookies a bezpečnost

Podle principu fungování cookies nemá server možnost ověřit, jestli data pocházejí z bezpečného zdroje, ani to, odkud data pocházejí.

Např. nějaká zranitelná aplikace na subdoméně může nastavit cookie s parametrem Domain, čímž se data zpřístupní na všech ostatních subdoménách. Navíc ostatní subdomény mohou ovlivnit danou aplikaci pomocí cookies.

Pro zlepšení bezpečnosti standard umožňuje nastavit cookies s prefixy:

  • __Host-* cookies jsou akceptovány prohlížečem, pouze pokud obsahují parametr Secure, přišly v odpovědi přes HTTPS, neobsahují parametr Domain a parametr Path je nastaven na /.
  • __Secure-* cookies jsou akceptovány prohlížečem, pouze pokud obsahují parametr Secure a přišly v odpovědi přes HTTPS.

Cookies a soukromí

Cookies se vztahují na danou doménu (subdomény) a schéma (HTTP nebo HTTPS). Pro danou stránku ale může dojít k přenosu mnoha různých cookies:

  • first-party cookies: pochází ze stejné domény a schématu, jako je URL dokumentu
  • third-party cookies: pochází z jiných zdrojů (např. multimediální data zobrazená na dané stránce), mohou sloužit ke sledování (např. Google Analytics)

Prohlížeče umožňují nastavit blokování všech third-party cookies (viz Firefox, Chrome). Podrobnější filtrování povolených cookies je možné např. pomocí rozšíření (nebo přímo v prohlížeči).

Další funkcí většiny (všech?) prohlížečů je anonymní okno, které je izolované od normálního okna a jehož data se po zavření automaticky smažou.

Firefox navíc umožňuje izolovat různé stránky pomocí přiřazení záložek do kontejnerů.

Cookies vs předpisy EU (a Kalifornie)

Na používání cookies se vztahuje několik globálních legislativních nařízení:

  • General Data Privacy Regulation (GDPR) – EU
  • ePrivacy Directive – EU
  • California Consumer Privacy Act

Vztahují se na všechny websites, které jsou dostupné pro uživatele z daných oblastí. Mezi požadavky patří:

  • informovat uživatele o použití cookies na dané stránce
  • umožnit uživatelům zakázat použití všech nebo některých cookies na dané stránce

V určitých regionech mohou existovat dodatečná, lokální nařízení.

Řešení: zobrazovat zásady používání cookies a tzv. cookie banner.

Zobrazení cookies v prohlížeči

Firefox: Web Developer Tools (Ctrl+Shift+I), záložka Storage.
Chrome: Developer tools (Ctrl+Shift+I), záložka Application.

Moderní technologie pro ukládání dat na straně klienta

Cookies byly navrženy jako obecné datové úložiště na straně klienta. Takové použití ale má řadu nedostatků, hlavně pokud jde o bezpečnost a efektivitu. Cookies se posílají s každým požadavkem, takže jejich použití může výrazně zpomalit celou aplikaci (zejména pro pomalé připojení).

Moderní API pro ukládání dat na straně klienta jsou:

Obě technologie využívají JavaScript.

Cookies ve frameworku Django

Základní použití cookies:

  1. objekt HttpResponse má metodu set_cookie()
  2. objekt HttpRequest má atribut COOKIES (slovník obsahující všechny cookies)

Pokročilejší použití s ověřením pravosti:

  1. objekt HttpResponse má metodu set_signed_cookie()
  2. objekt HttpRequest má metodu get_signed_cookie()

Dále má objekt HttpResponse metodu delete_cookie(), která umožňuje smazat cookie z úložiště klienta.

Cookies a dekorátory

Pro práci s cookies se často hodí použít dekorátory jazyka Python.

...viz interaktivní demo...

Další použití cookies ve frameworku Django

Django využívá cookies v dalších částech frameworku:

Viz další přednášky 😄

- umožnit uživatelům využití našich služeb bez použití cookies

## TODO: [session ID](https://en.wikipedia.org/wiki/Session_ID) - A session ID is typically granted to a visitor on their first visit to a site. It is different from a user ID in that sessions are typically short-lived (they expire after a preset time of inactivity which may be minutes or hours) and may become invalid after a certain goal has been met (for example, once the buyer has finalized their order, they cannot use the same session ID to add more items). [session (web analytics)](https://en.wikipedia.org/wiki/Session_(web_analytics))