Slovník pojmů

Cookie

Cookie uchovává malý údaj na straně prohlížeče. Nejčastěji nese neprůhledný identifikátor relace, nikoli samotná oprávnění nebo citlivý obsah.

Stručná definice

Server hodnotu nastaví, prohlížeč ji vrací jen v určeném kontextu.

Server posílá cookie hlavičkou Set-Cookie. Prohlížeč ji uloží spolu s pravidly, například pro jaký host, cestu, dobu a zabezpečené spojení platí. Při následujícím požadavku na odpovídající místo webu přidá hlavičku Cookie. HTTP request pak může navázat na předchozí návštěvu bez předávání stavu v URL.

Cookie není databáze ani bezpečný trezor. Uživatel ji může v prohlížeči smazat a obsah dostupné cookie může být viditelný klientovi. U přihlášení proto cookie obvykle nese pouze náhodný identifikátor, zatímco relace, účet a oprávnění zůstávají na serveru. Tím se odděluje transport identifikátoru od autentizace a autorizace.

K čemu slouží

Stav webu, který má prohlížeč při dalším requestu připojit

Konkrétní účel určuje serverová aplikace; stejný mechanismus může nést preferenci i identifikátor přihlášené relace.

  • identifikátor serverové relace po přihlášení do administrace nebo zákaznického účtu
  • nastavení jazyka, vzhledu nebo vybraného e-shopu, pokud je rozumné držet je v prohlížeči
  • uložení informace o volbě cookies, aby se opakovaně nezobrazovalo stejné rozhodnutí
  • krátkodobé navázání formulářového toku nebo bezpečnostní hodnoty podle návrhu aplikace
  • omezené měření a personalizace, pokud pro ně existuje právní základ a srozumitelné nastavení soukromí

Praktický příklad

Přihlášený uživatel nese jen identifikátor relace

Po úspěšném přihlášení aplikace vytvoří na serveru relaci a do prohlížeče pošle náhodný identifikátor. Při další návštěvě server podle identifikátoru načte aktuální stav relace a teprve potom ověří, zda uživatel smí zobrazit konkrétní objednávku. Identifikátor relace nepatří do URL, historie prohlížeče ani refererů.

Nastavení níže je výchozí vzor pro browser relaci přes HTTPS. V produkci je nutné přizpůsobit SameSite skutečnému přihlašovacímu toku a nepovažovat jej za náhradu CSRF ochrany u mutujících požadavků.

Set-Cookie: session_id={náhodný-neprůhledný-identifikátor}; Path=/; Secure; HttpOnly; SameSite=Lax

Jak funguje

Od odpovědi serveru k dalšímu požadavku

Prohlížeč neodesílá všechny uložené cookies všude. Řídí se atributy, doménou, cestou, protokolem a kontextem požadavku.

  1. Aplikace vytvoří hodnotu Server určí účel cookie a u relace vygeneruje dostatečně nepředvídatelný identifikátor. Citlivý stav zůstává na serveru.
  2. Odpověď obsahuje Set-Cookie Spolu s hodnotou nastaví omezení pro host, cestu, expiraci a bezpečnostní atributy.
  3. Prohlížeč cookie uloží Může jít o session cookie, která zanikne po ukončení relace prohlížeče, nebo o persistentní cookie s dobou platnosti.
  4. Další request splní pravidla rozsahu Jen tehdy prohlížeč přiloží odpovídající hodnotu do hlavičky Cookie. JavaScript ji při HttpOnly nemůže běžně číst.
  5. Server hodnotu nedůvěřivě vyhodnotí Aplikace kontroluje existenci, platnost a případné zneplatnění relace. Každou citlivou akci navíc autorizuje na serveru.

Důležité atributy

Bezpečnost cookie vzniká kombinací více omezení

Atributy zmenšují prostor, kde může prohlížeč cookie odeslat nebo kde k ní může přistupovat skript. Neopravují chybu v autorizaci aplikace.

Secure

Prohlížeč má cookie posílat pouze přes HTTPS. Tento atribut nešifruje její obsah a sám neřeší aktivního útočníka nebo chyby na jiném endpointu.

HttpOnly

Omezuje přístup JavaScriptu k cookie. Pomáhá proti přímému vyčtení relace při některých XSS, ale skript může stále poslat request jménem uživatele.

SameSite

Řídí připojování cookie v cross-site kontextu. Lax, Strict a None mají různé dopady na navigaci a externí login; jde o obranu do hloubky proti CSRF.

Domain a Path

Vymezují, kam cookie patří. Je vhodné volit co nejužší potřebný rozsah; Path není bezpečnostní hranice mezi částmi jedné aplikace.

Max-Age a Expires

Určují životnost persistentní cookie. U relací dává smysl také serverový nečinný a absolutní timeout, protože klientský čas není zdroj pravdy.

Vztah k ostatním nástrojům

Přenos hodnoty není rozhodnutí o přístupu

Cookie často vystupuje v bezpečnostním toku, ale každá další vrstva odpovídá na jinou otázku.

Session
Ukládá stav na serveru a cookie používá jako identifikátor. Odhlášení pak může relaci ihned zneplatnit.
CSRF
Doplňuje cookie relaci o ověření původu mutujícího požadavku. Samotný Secure ani HttpOnly jej nenahrazují.
JWT
Nese podepsaná tvrzení v tokenu. Pokud jej prohlížeč odesílá automaticky jako cookie, je třeba zohlednit i CSRF model.
CORS
Omezuje, kdy cizí JavaScript přečte odpověď. Neurčuje, zda prohlížeč cookie k requestu vůbec přiloží.

Výhody a omezení

Vhodná pro malý stav, nevhodná jako úložiště důvěryhodných dat

Přínosy

  • prohlížeč ji automaticky připojí v předem určeném rozsahu
  • server může držet citlivý stav mimo klienta a posílat jen neprůhledný identifikátor
  • atributy Secure, HttpOnly a SameSite dávají standardizované bezpečnostní omezení
  • funguje i bez JavaScriptu a pro běžné HTML formuláře

Rizika a časté chyby

  • ukládat do cookie heslo, oprávnění nebo neověřený business stav
  • posílat identifikátor relace v URL, odkud se dostává do historie, logů a refererů
  • spoléhat pouze na SameSite či CORS místo CSRF kontroly pro cookie-based mutace
  • nastavit příliš široký Domain rozsah nebo zapomenout Secure a HttpOnly u session cookie

Kdy ji použít

Pro browser tok ano, pro každou hodnotu ale ne

Cookie se hodí, když má prohlížeč automaticky vracet omezený identifikátor nebo uživatelskou preferenci. U přihlášení bývá přehledné mít relaci a její zneplatnění pod kontrolou serveru. U veřejného API pro cizí systémy se naopak často používá explicitní hlavička s access tokenem, protože klient není prohlížeč a automatické přikládání cookie nepomáhá.

Rozhodnutí není jen cookie versus token. Je nutné určit, kdo je klient, zda jde o cross-site tok, jak se provede odhlášení a co se stane při kompromitaci prohlížeče. V každé variantě server ověřuje vstupní hodnotu a kontroluje oprávnění nad konkrétním zdrojem.

Na co myslet

Session cookie má být nudná, úzká a předvídatelná

Bezpečné nastavení je součástí aplikace, reverzní proxy i testů přihlašovacího toku.

  • pro session používat náhodný neprůhledný identifikátor a neposílat jej nikdy v URL
  • na HTTPS nastavit Secure a pro session obvykle také HttpOnly a vhodný SameSite režim
  • omezit Domain a Path na skutečně potřebný rozsah a kontrolovat chování subdomén
  • rotovat identifikátor relace po přihlášení nebo změně oprávnění a umět relaci na serveru zneplatnit
  • testovat přihlášení, odhlášení, expiraci, CSRF ochranu a citlivé akce bez spoléhání na frontend

Časté otázky

Co cookie je a co není

Je cookie automaticky bezpečná?

Ne. Záleží na hodnotě, rozsahu a atributech. U relace jsou důležité nejméně Secure, HttpOnly, vhodné SameSite, serverová expirace a ochrana mutujících požadavků.

Je cookie totéž co session?

Ne. Cookie je prohlížečový mechanismus. Session je obvykle serverový stav, ke kterému cookie přenáší pouze identifikátor.

Může cookie obsahovat JWT?

Může, ale tím se JWT nestává cookie ani se nevyřeší jeho životnost a revokace. Automatické přikládání tokenu cookie navíc vyžaduje správný CSRF návrh.

Proč nedat session ID do URL?

URL se ukládá do historie, logů, analytiky, záložek a může se předat v Refereru. Identifikátor relace má cestovat bezpečnou cookie, ne adresou stránky.

Jak řeším backend v praxi

Přihlášení a data navrhuji jako jeden bezpečnostní tok.

V PHP aplikacích řeším relace, API hranice, ochranu formulářů i serverovou kontrolu přístupů podle typu klienta a dat.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.