Slovník pojmů

Session

Session spojuje jinak samostatné HTTP requesty do jedné relace. Dává serveru možnost stav okamžitě zneplatnit, ale vyžaduje promyšlené úložiště a bezpečné zacházení s identifikátorem.

Stručná definice

Relace je stav na serveru, session ID je jen klíč k němu.

HTTP je bezstavový protokol: samostatný request běžně neví, který request mu předcházel. Session tuto mezeru vyplní. Po přihlášení aplikace uloží serverový záznam, například identitu uživatele, čas vytvoření a dobu nečinnosti. Prohlížeči vrátí nepředvídatelné session ID, typicky v cookie, aby při dalším requestu našla správný záznam.

Session ID je credential: kdo jej platně předloží, může být považován za držitele relace. Proto musí být náhodné, chráněné přenosem přes HTTPS a nesmí se objevovat v URL. Relace není náhradou autorizace. I po rozpoznání uživatele server před provedením akce ověřuje aktuální roli, tenant, vlastnictví zdroje a business pravidla.

K čemu slouží

Přihlášený browser a krátkodobé návazné toky

Session dává největší smysl tam, kde aplikace ovládá server i browser klienta a potřebuje relaci průběžně rušit nebo měnit.

  • zákaznický účet, e-shopová administrace a interní aplikace s přihlášenými uživateli
  • dočasný stav vícekrokového formuláře, pokud se neukládá přímo do business databáze
  • uložení CSRF hodnoty nebo informace o právě probíhajícím ověřovacím kroku
  • centrální odhlášení a zneplatnění relace při změně hesla, rizikové akci nebo odvolání přístupu
  • serverově řízená relace při napojení externí identity přes OIDC nebo jiný login tok

Praktický příklad

Přihlášení do administrace e-shopu

Operátor úspěšně projde autentizací. Server založí relaci, uloží do ní identifikaci účtu a časové limity a prohlížeči pošle pouze její náhodný klíč. Při každé změně objednávky aplikace relaci ověří a samostatně rozhodne, zda operátor smí pracovat s objednávkou konkrétní organizace.

Identifikátor se po přihlášení rotuje, aby útočník nemohl podstrčit známé session ID před přihlášením. Při odhlášení se zneplatní na serveru a cookie se odstraní. Vzor níže používá prefix __Host-, který vyžaduje Secure, Path=/ a žádný atribut Domain.

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

Jak funguje

Bezpečná relace od přihlášení po odhlášení

Hodnota na straně klienta identifikuje relaci; rozhodnutí a životnost kontroluje server.

  1. Uživatel prokáže identitu Autentizace ověří heslo, passkey, vícefaktorový krok nebo externího poskytovatele identity. Neúspěch nezakládá relaci.
  2. Server vytvoří nebo obnoví relaci Vygeneruje kryptograficky náhodné session ID, uloží potřebný minimální stav a po loginu identifikátor rotuje.
  3. Prohlížeč nese ID v cookie Cookie má Secure, HttpOnly a vhodné SameSite. Session ID se neposílá v query parametru, formuláři ani do logu.
  4. Každý request relaci ověří Server hledá záznam, kontroluje expiraci, stav odhlášení a případně další rizikové podmínky. Neznámé ID nezakládá privilegium.
  5. Citlivá akce se autorizuje Relace určí subjekt, ale server ještě ověří oprávnění nad konkrétním objektem. Po odhlášení nebo kompromitaci se relace zneplatní.

Hlavní části relace

Bezpečnost relace není jen otázka délky cookie

Každá položka omezuje jinou třídu selhání: převzetí relace, fixaci, neomezenou životnost nebo nekonzistentní provoz ve více instancích.

Náhodné session ID

Musí být dostatečně entropické a neprůhledné. Sekvenční číslo, e-mail nebo odvozená hodnota není bezpečný identifikátor přihlášené relace.

Rotace identifikátoru

Po přihlášení, změně oprávnění nebo citlivém ověření se vydá nové ID. Snižuje riziko session fixation, kdy útočník zná relaci před přihlášením oběti.

Nečinný a absolutní timeout

Nečinný timeout omezuje zapomenutý otevřený browser; absolutní timeout brání nekonečnému prodlužování relace pravidelnými requesty.

Sdílené úložiště

V jedné instanci může relace žít v lokálním úložišti. Ve více instancích potřebuje sdílený store, například databázi nebo Redis, a plán pro jeho výpadek.

Zneplatnění

Server musí umět relaci ukončit při odhlášení, resetu hesla či incidentu. Pouhé smazání cookie neodvolá kopii identifikátoru, kterou mohl někdo získat.

Session a jiné přístupy

Serverový stav a token nejsou automaticky soupeři

Volba závisí na typech klientů, potřebě okamžitého odvolání, počtu služeb a provozních hranicích systému.

Cookie
Je obvyklý transport session ID v prohlížeči. Secure, HttpOnly a SameSite chrání transport, ne samotný serverový záznam.
JWT
Podepsaný token může nést tvrzení bez serverového lookupu při každém requestu. Je však nutné ověřovat podpis, platnost, publikum a řešit odvolání či zastaralé údaje.
Redis
Může relace sdílet a nastavovat expiraci. Není automaticky zdrojem pravdy o oprávněních ani náhradou robustní politiky výpadku.
CSRF
Browser session založená na cookie typicky potřebuje ochranu mutujících požadavků proti podvrženému původu.

Výhody a omezení

Relace umožní okamžitou kontrolu, ale potřebuje provozní disciplínu

Přínosy

  • server drží citlivý stav mimo prohlížeč a může ho kdykoli zneplatnit
  • aktuální změna oprávnění se projeví při dalším serverovém vyhodnocení
  • browser klient může fungovat s běžnými formuláři i bez JavaScriptu
  • identifikátor může být malý a neprůhledný bez business informací

Rizika a časté chyby

  • předávat session ID v URL nebo ukládat do něj více dat, než aplikace potřebuje
  • nechat stejné ID před a po přihlášení nebo neřešit jeho odvolání
  • spoléhat jen na frontendovou skrytou navigaci místo serverové autorizace
  • nasadit více instancí bez sdíleného úložiště, konzistentní expirace a plánu výpadku

Kdy je vhodná

Browser administrace často ocení serverem řízenou relaci

Session se dobře hodí pro zákaznické a interní webové rozhraní, kde je důležité okamžité odhlášení, správa aktivních relací nebo průběžná kontrola změněných rolí. Nevylučuje rozdělený frontend a backend; je ale potřeba jasně vymezit doménu cookies, CORS, CSRF a tok přihlášení.

JWT může být praktičtější pro určité API nebo komunikaci mezi službami, ale není bezstavovou zkratkou pro celý bezpečnostní návrh. I tokenový systém potřebuje řídit expiraci, kompromitaci, obnovu a serverovou autorizaci. Relace i token mohou být vhodné v odlišných částech stejného systému.

Na co myslet

Navrhnout relaci jako odvolatelný credential

Největší přínos session vzniká, když aplikace umí bezpečně řídit její celý životní cyklus.

  • přenášet session ID výhradně bezpečnou cookie, nikdy v URL nebo v přístupných logách
  • po úspěšné autentizaci identifikátor rotovat a po odhlášení zneplatnit serverový záznam
  • nastavit Secure, HttpOnly, vhodné SameSite a rozumný nečinný i absolutní timeout
  • u více instancí ověřit sdílené úložiště, jeho expiraci, dostupnost a postup při výpadku
  • testovat odhlášení, reset hesla, změnu role, prošlou relaci i pokus o přístup k cizímu tenantovi

Časté otázky

Práce se serverovou relací

Je session totéž co cookie?

Ne. Session je stav na serveru. Cookie obvykle nese jen identifikátor, kterým prohlížeč serveru sdělí, kterou relaci hledat.

Proč se session ID po loginu mění?

Rotace omezuje session fixation. Útočník nemá těžit z ID, které získal nebo oběti vnutil před jejím přihlášením.

Může být session uložena v Redisu?

Ano, Redis se často používá jako sdílené úložiště relací. Je ale potřeba řešit dostupnost, expiraci a bezpečné zneplatnění stejně jako u jiného store.

Je JWT vždy lepší než session?

Ne. JWT a session řeší jiné provozní kompromisy. Serverová relace usnadňuje okamžité zneplatnění, token může pomoci na jiném typu API. V obou případech zůstává nutná autorizace.

Jak řeším backend v praxi

Relaci propojuji s bezpečným tokem aplikace, ne jen s přihlašovacím formulářem.

Při vývoji PHP backendů řeším browserové relace, API hranice, změny přístupů i e-commerce administraci s důrazem na serverovou kontrolu 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.