Nette JWT User Storage – alternativa k PHP session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Klimeš
Nette Blogger | 156
+
+7
-

Nette JWT User Storage

GitHub repo

Implementace Nette\Security\IUserStorage, která místo staré a ošklivé PHP Session používá pro autentifikaci uživatele JWT access token, který uloží jako cookie.

Pokud nevíte co je JWT, prohlédněte si prosím draft nebo navštivte domovskou stránku.
TLDR: JWT je zakódovaný token, nesoucí libovolné informace ve formátu JSON. Je podepsán pomocí hashovací funkce a může mít libovolně dlouhou dobu expirace.

Výhody
  • JWT není potřeba nikam ukládat, obsahuje libovolné informace.
  • Není tedy potřeba řešit PHP sessions, zejména jejich škálování.
  • Po výpadku serveru zůstanou uživatelé přihlášení.
  • Integrační testy Vaší Nette aplikace budou jednodušší, protože můžete lehce podstrčit JWT přihlášeného uživatele.
Nevýhody
  • Cookie má omezení 4kb, nelze tedy uložit do Nette\Security\Identity libovolné množství dat.
  • Pokud do SessionStorage uložíte data, bude nastaveno PHPSESSID, což je nežádoucí. Lze ale využít libovolné key-value úložiště a jako klíč použít daný JWT nebo jeho unikátní id. (V budoucnu bych chtěl implementovat vlastní SessionStorage)

Uvítám jakýkoliv feedback nebo pomoc. Odměním se zmíněním v popisu projektu ;)

EDIT:

přidávám seznam literatury

Editoval Filip Klimeš (21. 8. 2015 12:44)

akadlec
Člen | 1326
+
0
-

Nechtěl bys to udělal raději jako Traitu či tak něco? Protože kdybych to chtěl implementovat tak to stejnak musím vytrhnout protože mám vlastní userstorage kvůli doctrině.

Filip Klimeš
Nette Blogger | 156
+
0
-

@akadlec: Než začnu vymýšlet jak to udělat, ujistím se, že mluvíme o tom samém. Proč máš kvůli Doctrine upravenou implementaci Nette\Security\IUserStorage? Popis mi sedí spíše na App\Model\UserManager ze sandboxu.

David Matějka
Moderator | 6445
+
+3
-

@FilipKlimeš kvuli tomu, aby byla vzdy „cerstva“. To je presne ten duvod, proc jsem chtel ten serializer, ktery to vyresi :)

Filip Klimeš
Nette Blogger | 156
+
0
-

@DavidMatějka @akadlec Jo takhle, rozumím :) serializer určitě plánuju doplnit.

Filip Klimeš
Nette Blogger | 156
+
+1
-

@akadlec @DavidMatějka Co něco takového?

David Matějka
Moderator | 6445
+
0
-

@FilipKlimeš idealni :)

souki
Bronze Partner | 22
+
+3
-

Je to nesmysl. Úplně stejný nesmysl mají v Rails a i tam už zařazují zpátečku.

Víte, proč PHP session fungují tak jak fungují? Cookie se totiž posílá s každým požadavkem. V tomhle případě by se tak „session“ data posílala i kvůli každé blbé ikonce.
Oproti tomu v php session se posílá maximálně X znaků a s tím se dá žít.

V HTTP 1.1 se navíc nekomprimují hlavičky (on se obecně upload nekomprimuje). Upload navíc bývá výrazně pomalejší než upload.

Pokud bude mít cookie s daty po převodu do JSON a šifrování 500 bajtů (velmi optimistický odhad) a na webu bude 50 obrázků/css/js, tak to znamená 25 kB uploadu.
Na EDGE se 25kB bude uploadovat zhruba 2 sekundy (100kbps). A to ještě naivně předpokládám, že to jde všechno v jednom požadavku.

Gratuluji! Ušetřili jsme zhruba 2ms na serveru nepoužitím databáze/redis/fs a přidali jsme 2s na klienta.

Editoval souki (21. 8. 2015 12:43)

Filip Klimeš
Nette Blogger | 156
+
0
-

souki napsal(a):

Je to nesmysl. Úplně stejný nesmysl mají v Rails a i tam už zařazují zpátečku.

Můžu poprosit o nějaký odkaz?

Pokud bude mít cookie s daty po převodu do JSON a šifrování 500 bajtů (velmi optimistický odhad) a na webu bude 50 obrázků/css/js, tak to znamená 25 kB uploadu.
Na EDGE se 25kB bude uploadovat zhruba 2 sekundy (100kbps). A to ještě naivně předpokládám, že to jde všechno v jednom požadavku.

Gratuluji! Ušetřili jsme zhruba 2ms na serveru nepoužitím databáze/redis/fs a přidali jsme 2s na klienta.

Za a) tohle je extrémní případ, za b) do JWT nedoporučuji ukládat mnoho dat (např. celou entitu uživatele) a za c) nepoužití FS/DB/Redisu je jen jedna z výhod. Lepší mi přijde např. to, že není potřeba řešit škálování PHP sessions.

Editoval Filip Klimeš (21. 8. 2015 12:50)

Jan Tvrdík
Nette guru | 2595
+
+1
-

Psal jsem to na Twitter – o JWT nemá cenu uvažovat, pokud tam člověk chce dávat větší množství dat nebo pokud není schopen dát statická data na doménu bez cookie.

Mnohem horší ale je, že JWT neumožňuje expirovat data jinak než časem nebo resetem všeho (změnou klíče). Spousta use-case je na JWT tím pádem nepřeveditelná. Naivní příklad, ukládáte do sessions počet návštěv uživatele (count++ pro každý požadavek). Jenomže count nemůžete dát do JWT, protože to není jak invalidovat, tj. nezabráníte uživateli, aby vám poslat starý JWT s neaktuálním countem.

finwe
Člen | 58
+
+1
-

Invalidace JWT se řeší blacklistem na serveru podle UID tokenu.

Filip Klimeš
Nette Blogger | 156
+
0
-

Jan Tvrdík napsal(a):

Psal jsem to na Twitter – o JWT nemá cenu uvažovat, pokud tam člověk chce dávat větší množství dat nebo pokud není schopen dát statická data na doménu bez cookie.

Přesně tak. Pokud vám stačí mít v session id uživatele, JWT bude plně dostačovat. Pokud je Váš use-case složitější a vyžaduje mnoho dat v session, zůstaňte u výchozí Nette implementace.

Mnohem horší ale je, že JWT neumožňuje expirovat data jinak než časem nebo resetem všeho (změnou klíče). Spousta use-case je na JWT tím pádem nepřeveditelná. Naivní příklad, ukládáte do sessions počet návštěv uživatele (count++ pro každý požadavek). Jenomže count nemůžete dát do JWT, protože to není jak invalidovat, tj. nezabráníte uživateli, aby vám poslat starý JWT s neaktuálním countem.

Jak psal @finwe, je možnost pro každý JWT generovat unikátní id a udělat blacklist. Plánuju obě funkcionality co nejdříve zařadit do mé knihovny.

Editoval Filip Klimeš (21. 8. 2015 13:10)

hrach
Člen | 1834
+
0
-

@souki me fascinuje, jak to a priori odsuzujes. Pritom usecase, ktery si uvedl, jen znaci, ze programator je debil. Domena se stacic obsahem ma byt bez cookie. Dale, vsichni dobre vime, ze na mobile neni problem tolik s objemem dat, ale s roundtripem a poctem spojeni. Neposledne, i phpseesid pridava datovou zatez.

A jeste jeden usecase, ikdyz ne mozna aktualne pomoci tohoto doplnku implementovatelny: (napr.) na signaly.cz mame na kazdy strance login form. No a protoze kazdy login form je obranen proti CSRF, tak s na kazde strance startuje session pro uzivatele. A to uz nejaky rozdil udela.

Jan Tvrdík
Nette guru | 2595
+
0
-

Invalidace JWT se řeší blacklistem na serveru podle UID tokenu.

Takže stejně musíš poslat dotaz do databáze (resp. redisu, memcache…). Navíc, pro ten jednoduchý příklad s počtem shlédnutí bys musel vkládat nový záznam při každém požadavku, takže budeš mít v databázi řádově víc záznamů než při normální session.

A to není to nejhorší, úplně se ti to rozpadne jakmile uživatel pošle dva požadavky zároveň.

Filip Klimeš
Nette Blogger | 156
+
+1
-

Jan Tvrdík napsal(a):

Invalidace JWT se řeší blacklistem na serveru podle UID tokenu.

Takže stejně musíš poslat dotaz do databáze (resp. redisu, memcache…). Navíc, pro ten jednoduchý příklad s počtem shlédnutí bys musel vkládat nový záznam při každém požadavku, takže budeš mít v databázi řádově víc záznamů než při normální session.

A to není to nejhorší, úplně se ti to rozpadne jakmile uživatel pošle dva požadavky zároveň.

Okay, pro případ počítání přístupů v session je JWT nevhodná (pokud nechám stranou otázku, zda je existencionálně nutné mít vždy správný počet návštěv v session). Měl bys nějaký netriviální případ, kdy by to mohl být vážný problém? Přijde mi, že do session ukládám data, která kromě autentifikace primárně mění pouze UX uživatele a tedy je jen uživatelovo věc, jestli mi podstrčí starou cookie s např. jiným počtem přístupů.

Jan Tvrdík
Nette guru | 2595
+
+4
-

Když nad tím tak přemýšlím, tak je tam asi ještě horší problém. Úplně každý zápis do session může selhat, pokud na server dorazí dva požadavky zároveň. Protože ty na serveru nic neukládáš, tak pokud session neměníš, tak pošleš zpátky stejnou cookie, jakou jsi dostal od klienta, přestože v té době může už existovat novější.

Filip Klimeš
Nette Blogger | 156
+
+1
-

Jan Tvrdík napsal(a):

Když nad tím tak přemýšlím, tak je tam asi ještě horší problém. Úplně každý zápis do session může selhat, pokud na server dorazí dva požadavky zároveň. Protože ty na serveru nic neukládáš, tak pokud session neměníš, tak pošleš zpátky stejnou cookie, jakou jsi dostal od klienta, přestože v té době může už existovat novější.

Ano, to máš pravdu.

Jen aby bylo jasno, implementoval jsem zatím pouze IUserStorage, tedy JWT používám pouze pro autentifikaci uživatele. Ukládání session dat do JWT jsem zatím neřešil, SessionStorage a vlastně celá Session zůstaly původní.

Možná jsem mohl zvolit trochu méně provokativní a tím pádem zavádějící titulek vlákna, ale to by zase nepřitáhlo tolik pozornosti ;)

Jan Tvrdík
Nette guru | 2595
+
+1
-

BTW: https://auth0.com/…n-libraries/ jsi četl, pochopil a ověřil, že na to nejsi náchylný?

souki
Bronze Partner | 22
+
+4
-

hrach napsal(a):

@souki me fascinuje, jak to a priori odsuzujes. Pritom usecase, ktery si uvedl, jen znaci, ze programator je debil. Domena se stacic obsahem ma byt bez cookie. Dale, vsichni dobre vime, ze na mobile neni problem tolik s objemem dat, ale s roundtripem a poctem spojeni. Neposledne, i phpseesid pridava datovou zatez.

Doména se static obsahem už je ale zase bottleneck s HTTP/2 (kde ale zase na druhou stranu bude komprese hlaviček).

Všichni píšete, že se tam nemá ukládat větší množství dat, ale třeba jenom id/hash uživatele. Jenže to přesně dělá už ta normální session :) V čem teda je přínos JWT? Stejně si pak musím na serveru k tomu ID někde najít dodatečné informace a přesně to dělám i se session.

Prostě mi přijde, že se vymyslelo řešení, zjistili se jeho limity, tak se vymyslelo omezení a tím se obloukem došlo k tomu původnímu řešení pomocí session.

Přijde mi daleko rozumnější používat už existující řešení a spíš případně řešit jeho implementaci. Například nepárovat sessionid s daty, dokud to není skutečně potřeba, neukládat v souborech, ale někde distribuovatelně a podobně.
Tohle řešení je vhodné jen pro krajní případy, ale vidím tam spoustu nových problémů a na druhé straně žádný, který by nebyl už 10× vyřešený lépe na straně serveru.

Editoval souki (21. 8. 2015 15:34)

Filip Klimeš
Nette Blogger | 156
+
+1
-

Rád bych uvedl věci na pravou míru, než se tohle vlákno ubere směrem, kterým jsem nechtěl. (Sypu si popel na hlavu, měl jsem vše uvést hned na začátku, příště se polepším).

  • Tato implementace je zatím pouze experiment, polofunkční prototyp. Pokud by se podařilo ho dostat do provozuschopného stavu, může být používán jako alternativa k původní implementaci, ne jako její náhrada.
  • Pokud stavíte aplikaci, která se snaží být Stateful přes HTTP, pravděpodobněte ukládáte velké množství dat do Session a tento způsob řešení sessions pro vás není vhodný.
  • Pokud stavíte primárně RESTful aplikaci, které stačí mít v session pouze user_id, případně seznam rolí uživatele, je pro vás JWT řešení vhodné.
  • Pokud chcete svou aplikaci škálovat (zejména mít více instancí na více strojích) a nechcete řešit škálování Sessions, je pro vás JWT řešení vhodné.
  • EDIT: Pokud si do Nette\Security\IIdentity ukládáte citlivá data uživatele, potom pro vás JWT není vhodné.

Jak to dělají jiné frameworky v jiných jazycích?

Editoval Filip Klimeš (21. 8. 2015 15:45)

hrach
Člen | 1834
+
+1
-

Všichni píšete, že se tam nemá ukládat větší množství dat, ale třeba jenom id/hash uživatele. Jenže to přesně dělá už ta normální session :)

  • normalni session ma ulozeny nahodny hash. Pomoci toho hashe php sahne na disk/redis/… a najde data uzivatele, kde je ulozeno jeho id. Posleze si teprve sahnu do db pro entitu uzivatele.
  • jwt ma ulozeny id uzivatele a „digitalni podpis“ dat. Z cookie prectu id uzivatele, overim jeho podpis a sahnu si do db pro entitu uzivatele.

Rozdil je snad zrejmy. Ad delka a objem dat:

  • normalni session: 26 znaku pro identifikator
  • jwt: napr. 133 znaku pro tyto data {"loggedInAs":"admin","iat":1422779638} (vzano z odtu)
Filip Klimeš
Nette Blogger | 156
+
0
-

Jan Tvrdík napsal(a):

BTW: https://auth0.com/…n-libraries/ jsi četl, pochopil a ověřil, že na to nejsi náchylný?

Článek jsem zaregistroval, přečetl tldr verzi a plánuji ho detailně prostudovat. Používám nejnovější verzi knihovny pro verifikaci JWT, povolený mám pouze jeden šiforvací algoritmus a tokeny podepisuji na své straně, měl bych tedy být v suchu. Děkuji za podnět :)

Editoval Filip Klimeš (21. 8. 2015 15:43)

souki
Bronze Partner | 22
+
0
-

hrach napsal(a):

Všichni píšete, že se tam nemá ukládat větší množství dat, ale třeba jenom id/hash uživatele. Jenže to přesně dělá už ta normální session :)

  • normalni session ma ulozeny nahodny hash. Pomoci toho hashe php sahne na disk/redis/… a najde data uzivatele, kde je ulozeno jeho id. Posleze si teprve sahnu do db pro entitu uzivatele.
  • jwt ma ulozeny id uzivatele a „digitalni podpis“ dat. Z cookie prectu id uzivatele, overim jeho podpis a sahnu si do db pro entitu uzivatele.

Rozdil je snad zrejmy. Ad delka a objem dat:

  • normalni session: 26 znaku pro identifikator
  • jwt: napr. 133 znaku pro tyto data {"loggedInAs":"admin","iat":1422779638} (vzano z odtu)

Ale v čem si teda s JWT pomůžu? Mělo by to řešit škálovatelnost, ale stejně si pak musím sáhnout do databáze (nebo někam), abych k identifikátoru získal další data – tzn úplně stejně jako u session.

Stejně tak u session nemusí jít o náhodný hash, ale může to být třeba hash s kontrolní částí, aby šel ověřit bez databáze.

Filip Klimeš
Nette Blogger | 156
+
0
-

souki napsal(a):

Ale v čem si teda s JWT pomůžu? Mělo by to řešit škálovatelnost, ale stejně si pak musím sáhnout do databáze (nebo někam), abych k identifikátoru získal další data – tzn úplně stejně jako u session.

Stejně tak u session nemusí jít o náhodný hash, ale může to být třeba hash s kontrolní částí, aby šel ověřit bez databáze.

Protože do session storage se při horizontálním škálování potřebuješ dostat ze všech instancí dané aplikace a to může být problém. Pokud používáš JWT a nepotřebuješ si do session ukládat nic navíc, nemusíš se tímto problémem zaobírat.

V obou případech ale samozřejmě musíš řešit přístup z instancí do DB, který se ale dá obejít snadněji.

Btw nebylo to nedávno, kdy Rohlíku zabily sessions server? ;)

Editoval Filip Klimeš (21. 8. 2015 16:39)

souki
Bronze Partner | 22
+
0
-

Filip Klimeš napsal(a):

souki napsal(a):

Ale v čem si teda s JWT pomůžu? Mělo by to řešit škálovatelnost, ale stejně si pak musím sáhnout do databáze (nebo někam), abych k identifikátoru získal další data – tzn úplně stejně jako u session.

Stejně tak u session nemusí jít o náhodný hash, ale může to být třeba hash s kontrolní částí, aby šel ověřit bez databáze.

Protože do session storage se při horizontálním škálování potřebuješ dostat ze všech instancí dané aplikace a to může být problém. Pokud používáš JWT a nepotřebuješ si do session ukládat nic navíc, nemusíš se tímto problémem zaobírat.

V obou případech ale samozřejmě musíš řešit přístup z instancí do DB, který se ale dá obejít snadněji.

Btw nebylo to nedávno, kdy Rohlíku zabily sessions server? ;)

Chápu, co to má v teorii řešit. V praxi to ale naráží na ty samé problémy jako session. Stejně se nakonec v cookie přenáší identifikátor, podle kterého se v nějakém zdroji hledají data. Není mi tedy jasné, co přesně JWT vyřešilo.

Řešil jsem tohle, když jsme migrovali do cloudu – tam je právě spousta instancí a potřebují sdílet session. Jednoduše se ale ukládají session data do Redisu (respektive Elasticache) a je po problému. Je to škálovatelné, replikované, … Vzniká tam prodleva ~1ms na komunikaci, ale to je pořád pohodička oproti alternativám.

Filip Klimeš
Nette Blogger | 156
+
+1
-

souki napsal(a):

Chápu, co to má v teorii řešit. V praxi to ale naráží na ty samé problémy jako session. Stejně se nakonec v cookie přenáší identifikátor, podle kterého se v nějakém zdroji hledají data. Není mi tedy jasné, co přesně JWT vyřešilo.

Řešil jsem tohle, když jsme migrovali do cloudu – tam je právě spousta instancí a potřebují sdílet session. Jednoduše se ale ukládají session data do Redisu (respektive Elasticache) a je po problému. Je to škálovatelné, replikované, … Vzniká tam prodleva ~1ms na komunikaci, ale to je pořád pohodička oproti alternativám.

Jup, Redis je asi nejlepší řešení. Problém je, že redis máš v RAM. Pokud si obsah Redisu nijak nezálohuješ a spadne ti server, tak jsou všichni uživatelé instantně odhlášeni. To se s JWT nestane.

A ještě jednou to sem napíšu, pokud potřebuješ ukládat tuny dat do session a provozovat kvůli tomu Redis server, potom JWT není pro Tebe. Pokud si vystačíš s autentifikací uživatele v session a nic víc, nepotřebuješ stavět Redis server.

A pro jistotu ještě zdůrazním, že tato knihovna je pouze alternativa, ne návrh na kompletní odstranění PHP Sessions z Nette.

souki
Bronze Partner | 22
+
0
-

Filip Klimeš napsal(a):
A pro jistotu ještě zdůrazním, že tato knihovna je pouze alternativa, ne návrh na kompletní odstranění PHP Sessions z Nette.

Mě na tom právě nejvíc děsilo, že by se to začalo slepě používat bez znalosti úskalí. Pokud je cílem vyřešit nestabilní úložiště session id a nic jiného, tak proč ne. Do quick start bych to ale určitě nedával :)

Ještě ale hloupý dotaz – jak se vyřeší odhlášení? Pokud to správně chápu, tak se pouze smaže cookie. Jak se zajistí, aby stejnou cookie už nemohl nikdo použít?

Filip Procházka
Moderator | 4668
+
+4
-

JWT používat neplánuji, ale nebudu ti ani vymlouvat jeho použití, pokud jsi našel vhodný use-case, tak go for it.

Titulek byl opravdu bulvární a tedy se nemůžeš divit, že komunita ti to přišla zkritizovat. Představ si, že by začátečník s PHP nebo s Nette použil tvé řešení, protože si na fóru přečetl, že JWT je výborná náhrada za sessions a pak se jednoho dne divil.

Filip Klimeš napsal(a):

Btw nebylo to nedávno, kdy Rohlíku zabily sessions server? ;)

Nezabily server, jenom ucpaly redis. A to proto že emuluji zámky, což považuji za vyřešeno. Kdybych použil „native“ řešení a netrval na zámcích, tak tento problém nemám.

Problém je, že redis máš v RAM.

Tady máš právě zásadní výhodu oproti např memcache – redis se umí ukládat na disk.

David Grudl napsal(a):

To si můžeme rovnou nadávat do pičí a kokotů, co na to vy zmrdi říkáte?

Připadá ti, že jsi pozitivně přispěl do diskuze?

Filip Klimeš
Nette Blogger | 156
+
0
-

souki napsal(a):

Mě na tom právě nejvíc děsilo, že by se to začalo slepě používat bez znalosti úskalí. Pokud je cílem vyřešit nestabilní úložiště session id a nic jiného, tak proč ne. Do quick start bych to ale určitě nedával :)

Super, konečně si rozumíme :) Tohle není RFC, jen doplňek do Nette FW.

Ještě ale hloupý dotaz – jak se vyřeší odhlášení? Pokud to správně chápu, tak se pouze smaže cookie. Jak se zajistí, aby stejnou cookie už nemohl nikdo použít?

Naopak, dobrý dotaz. Nabízí se několik řešení. Krátká expirace tokenů a refreshování, aby se zachovalo UX. Nebo můžeš použít JWT blacklist, ten ale samozřejmě přináší nutnost nějakého úložiště.

V případě katastrofického scénáře lze na serveru vyměnit secret a tím zneplatnit všechny dosud vydané JWT tokeny.

Filip Klimeš
Nette Blogger | 156
+
0
-

Filip Procházka napsal(a):

Titulek byl opravdu bulvární a tedy se nemůžeš divit, že komunita ti to přišla zkritizovat. Představ si, že by začátečník s PHP nebo s Nette použil tvé řešení, protože si na fóru přečetl, že JWT je výborná náhrada za sessions a pak se jednoho dne divil.

Titulek jsem napsal špatně, chybu si uvědomuji. (Formulář po mě chtěl 50 znaků, tak jsem tam něco plácnul, a pak už to nešlo změnit) Ale nikde jsem tady nenapsal, že je to výborná náhrada za sessions :( to pouze ostatní účastníci diskuze implikovali, jak je tady na fóru dobrým zvykem. (viz Nette PRO)

Filip Procházka
Moderator | 4668
+
+2
-

@FilipKlimeš no hele upřímně, fakt mi to tak zní (a zjevně nejenom mně). Titulek jsem ti změnil, může být?

Filip Klimeš
Nette Blogger | 156
+
0
-

Filip Procházka napsal(a):

@FilipKlimeš no hele upřímně, fakt mi to tak zní (a zjevně nejenom mně). Titulek jsem ti změnil, může být?

Díky! :)

Elijen
Člen | 171
+
0
-

Jan Tvrdík napsal(a):

Když nad tím tak přemýšlím, tak je tam asi ještě horší problém. Úplně každý zápis do session může selhat, pokud na server dorazí dva požadavky zároveň. Protože ty na serveru nic neukládáš, tak pokud session neměníš, tak pošleš zpátky stejnou cookie, jakou jsi dostal od klienta, přestože v té době může už existovat novější.

Není tohle zcela zásadní problém? Ideálně totiž přeci chceme token měnit co nejčastěji.

edit: Teď mě napadá, že v JWT nemá vůbec žádný smysl token měnit, protože všechny předchozí budou stále platné, nebo ne?

Editoval Elijen (22. 8. 2015 19:07)

skrivy
Člen | 51
+
+6
-

(na nasledujici post se divejte z pohledu admina – ne vyvojare)

Tenhle pristup je supr v momentech, kdy skalovani sessions storage zacne byt problem. Pokud vim, tak takto jsou implementovany sessions ve fb a twitteru (nepotvrzena informace). Nicmene, tento pristup doporucuje ve sve knize Steve Corona, pouzivali ho na twitpicu a docela dobre vi proc.

Problem snad vsech session storage implementovanych primo v PHP jsou zamky – PHP se snazi drzet sessions konzistentni. V pripade soubehu nekolika requestu s jednim sessionid, kdy jeden z pozadavku trva treba 20 vterin, vsechny ostatni pozadavky cekaji nez tento jeden dobehne. Ano, da se to sice resit, ale … Ve velkem mnozstvi aplikaci na webu se v session stejne drzi jen id uzivatele a nejake jeho jmeno, takze otazka je proc se trapit se sessions storage?

Pri nasazeni vyvojar musi vedet do ceho jde a take vedet proc je dobre to pouzivat. Tohle rozhodnuti vetsinou pada uz pri navrhu aplikace v ramci non-functional pozadavku, kde uz je celkem jasne jak aplikace bude vypadat. Je mnoho webu, kde se tento pristup hodi a resi mnoho provoznich problemu.

Osobne implementaci velmi vitam a jsem rad, ze se ji nekdo zhostil v ramci nette.

Offtopic: Mam pocit, ze lidi tady na foru zacinaji byt prilis agresivni.

Update:
Byl bych rad, kdyby se implementace dostala do upstreamu nette. Vim, ze @DavidGrudl to mel v jednom z todo listu. Bohuzel ho ted nemuzu najit.

Editoval skrivy (29. 8. 2015 18:40)

Elijen
Člen | 171
+
-2
-

skrivy napsal(a):
Problem snad vsech session storage implementovanych primo v PHP jsou zamky – PHP se snazi drzet sessions konzistentni. V pripade soubehu nekolika requestu s jednim sessionid, kdy jeden z pozadavku trva treba 20 vterin,…

Pokud používáš session jen na uložení id uživatele, tak přeci žádný problém se zámky mít nebudeš:

session_start();
$userId = $_SESSION['user_id'];
session_write_close();
Šaman
Člen | 2635
+
0
-

<OFFTOPIC>
@DavidGrudl: Protože vlákno ohledně slušných postů je zamčené, tak to píšu sem, kde to celé začalo.
Nemyslím si, že by celá komunita byla nějak zvlášť ironická, nebo hrubá.
Ani v tomhle vláknu nepadlo sprosté slovo až do tvého příspěvku (již smazaný). (Padl tu jeden debil, ale ten na nikoho necílil.) Ten zcenzurovaný příspěvek byl opravdu neobvykle útočný, ale stále se držel tématu, nebyl sprostý a napadal myšlenku, nikoliv autora.
Zavádět kvůli jednomu příspěvku zaškrtítko, že příspěvek je sluníčkový, to mi připadá jako zbytečný opruz. A to přemazání nevhodnych příspěvků taky nemá moc logiku, pokud není provedeno ihned. Viz tady. Příspěvek je smazaný, ale vyvolal diskuzi, které najednou chybí začátek. A navíc se dá dohledat v citacích v dalších postech.

Všeobecně z tvých příspěvků za poslední tři měsíce cítím, že bys potřeboval dovolenou a pročistit hlavu. Mám pocit, že tě Nette/komunita/budoucnost stresuje víc, je zdrávo.
</OFFTOPIC>

David Grudl
Nette Core | 8154
+
+1
-

@Šaman právě o ty zbytečně útočné výpady mi jde, nemají tu co dělat (a zbytečně lidi stresují a potřebují dovolenou). A nepiš prosím offtopic příspěvky, jde přece založit nové vlákno.

Tomáš Votruba
Moderator | 1114
+
+1
-

@FilipKlimeš K inspiraci StorageLessSession

theo
Člen | 57
+
0
-

Vzhledem k tomu, že potřebuji právě tuto věc implementovat do jedné aplikace, která je v Nette, logicky jsem sáhl po tomto rozšíření. Bohužel ale narážím na to, že i když mám nakonfigurováno podle README.md souboru z GitHubu, nefunguje to a nikde nemůžu najít žádnou ukázku jak to vlastně použít (kdyby to mělo aspoň testy…). Ne že bych byl v Nette úplný začátečník, ale nějak asi uniká, co s tím. Můžete mě odkázat na nějaké howto? Díky.