<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://jak.mazovia.edu.pl/index.php?action=history&amp;feed=atom&amp;title=JWT_bez_kontroln%C3%AD_logiky%3A_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD</id>
	<title>JWT bez kontrolní logiky: kde tokeny tiše selhávají - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://jak.mazovia.edu.pl/index.php?action=history&amp;feed=atom&amp;title=JWT_bez_kontroln%C3%AD_logiky%3A_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD"/>
	<link rel="alternate" type="text/html" href="https://jak.mazovia.edu.pl/index.php?title=JWT_bez_kontroln%C3%AD_logiky:_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD&amp;action=history"/>
	<updated>2026-10-16T22:56:44Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://jak.mazovia.edu.pl/index.php?title=JWT_bez_kontroln%C3%AD_logiky:_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD&amp;diff=863201&amp;oldid=prev</id>
		<title>FreemanEnderby7 o 19:14, 1 paź 2026</title>
		<link rel="alternate" type="text/html" href="https://jak.mazovia.edu.pl/index.php?title=JWT_bez_kontroln%C3%AD_logiky:_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD&amp;diff=863201&amp;oldid=prev"/>
		<updated>2026-10-01T19:14:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Wersja z 19:14, 1 paź 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Linia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Začnete tím&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;že si nainstalujete TypeScript globálně &lt;/del&gt;nebo &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;lokálně do projektu a vytvoříte konfigurační &lt;/del&gt;soubor &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tsconfig&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;json. V něm nastavíte cíl kompilace&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;povolíte přísné kontroly &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;určíte, kam se má výsledný JavaScript ukládat&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pro nový projekt je rozumné zapnout &quot;strict&quot;&lt;/del&gt;: &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;true&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zpočátku to bolí&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;protože kompilátor hlásí i to, co jste dřív přehlíželi&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Vyplatí se to ale vydržet: přísný režim vás naučí psát typy pořádně &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;předejde řadě problémů později&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nejčastější chyba je ukládat &lt;/del&gt;do &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;store všechno&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;včetně stavu formuláře &lt;/del&gt;nebo &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;otevřeného dialogu&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Druhá je mutace stavu uvnitř reduceru&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;která se projeví až později&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Třetí je obcházení Reduxu přímým voláním globální proměnné&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;čímž ztratíte veškerou výhodu dohledatelnosti&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud stav roste&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;rozdělte &lt;/del&gt;ho na &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;menší reducery a kombinujte je&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Až přestane být přehledný, &lt;/del&gt;není &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;to důvod přidávat další knihovny&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ale vrátit &lt;/del&gt;se &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;k návrhu dat&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Při ověřování si dejte pozor &lt;/del&gt;na &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;časové posuny&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Malá tolerance u exp a nbf &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v pořádku&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ale nesmí být v minutách&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Stejně tak kontrolujte&lt;/del&gt;, že &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;token nebyl použit před nbf. Odvolávání &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;slabina bezstavových tokenů: blacklist podle jti nebo krátká platnost s rotací refresh tokenů řeší většinu případů&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nikdy neposílejte token v URL&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dostane se do logů &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;refererů&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Napojení komponent na store patří co nejníž&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nespojujte celé stránky&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;když stačí jedna položka seznamu&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Komponenta &lt;/del&gt;má &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dostat jen data, která opravdu vykresluje, &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jen akce&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;které sama vyvolává. Přepočítávejte selektory&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;které vracejí nový objekt &lt;/del&gt;nebo &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pole, jinak se komponenta překresluje při každé změně store&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Typický problém je také příliš mnoho akcí &lt;/del&gt;pro &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jednu uživatelskou činnost; sloučte &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;do jedné&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;která popíše celý záměr&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Struktura projektu se vyplatí řešit dřív, než napíšete dvacátou routu&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Rozdělte &lt;/del&gt;kód &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;na trasy&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;controllery a vrstvu pro přístup k datům&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Jeden soubor s pěti sty řádky se nedá testovat ani rozumně upravovat&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Konfiguraci a tajné klíče držte mimo zdrojový kód&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ideálně v proměnných prostředí&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a nikdy &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;necommitujte do repozitáře. Stejně tak &lt;/del&gt;si &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;hlídejte&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;co posíláte klientovi: chybová odpověď nemá obsahovat stack trace ani interní detaily&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Kdy &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;se z pokrytí stává past Pokrytí &lt;/del&gt;přestává být užitečné &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ve chvíli, kdy &lt;/del&gt;se stane cílem &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;místo nástroje. Typickým projevem je test&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;který zavolá funkci, ale nekontroluje výsledek. Nebo &lt;/del&gt;testy&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, které jen procházejí kód, aby zvýšily procento. Dalším varovným signálem je snaha dostat se &lt;/del&gt;na &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sto procent za každou cenu&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Poslední procenta obvykle znamenají testy pro triviální gettery&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;obsluhu výjimek, které nikdy nenastanou, nebo mrtvý kód. Náklady rostou, přínos klesá.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Co hlídat při vydávání a ukládání Access token držte krátký, v řádu minut. Refresh token ukládejte jako serverovou relaci s možností odvolání, ne jako další JWT bez stavu. Do payloadu nepatří hesla, rodná čísla ani interní identifikátory, které nechcete ukázat. Pamatujte&lt;/del&gt;, že &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;payload je jen base64, nikoli šifra&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud potřebujete skrýt obsah&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;použijte JWE, nebo raději držte citlivá data na serveru a do tokenu dejte pouze odkaz&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Implementaci naopak odhadujte až ve chvíli, kdy &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;analytika hotová a znáte rozsah&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tým pak pracuje s jasnými vstupy a může použít relativní odhady&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;například bodové nebo velikostní. Nezahrnujte do implementace práci, která patří analytice, a naopak. Pokud se během implementace objeví nové analytické otázky, není to selhání odhadu&lt;/del&gt;, ale &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;signál, že analytická část nebyla dotažená. Řešte to jako samostatnou položku, ne jako „překvapení&quot; uvnitř sprintu&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Základem je ověřit podpis přesně tím algoritmem, který očekáváte. Nikdy nenechávejte knihovnu, aby si algoritmus vybrala podle hlavičky alg z tokenu. Pokud aplikace podporuje HS256 i RS256, musíte dopředu rozhodnout, který použijete, a ostatní odmítnout. Zvlášť nebezpečná je kombinace, kdy se veřejný klíč z RS256 dá podstrčit jako HMAC secret. Vždy porovnávejte iss, aud a exp; token bez expirace je jen trvalý přístupový klíč v cizích rukou.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Praktické pravidlo: pokud test neumí selhat &lt;/del&gt;při &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;změně logiky&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pravděpodobně nic neověřuje&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zkuste mutační testování na menším vzorku &lt;/del&gt;kódu. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Rychle ukáže&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;které &lt;/del&gt;testy &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jsou jen dekorace&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud mutace přežijí&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;máte sice vysoké pokrytí&lt;/del&gt;, ale &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;slabou sadu testů&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;To &lt;/del&gt;je &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;přesně ten okamžik, kdy je lepší číslo ignorovat &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;věnovat &lt;/del&gt;se &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;kvalitě assertions&lt;/del&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Typická chyba je ukládání tokenu &lt;/del&gt;do &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;localStorage &lt;/del&gt;a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;následné XSS&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;HttpOnly cookie s SameSite je bezpečnější&lt;/del&gt;, ale &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;vyžaduje ochranu proti CSRF&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Další častá &lt;/del&gt;chyba &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;je zapomenutý aud &lt;/del&gt;při &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;více službách: &lt;/del&gt;token &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;vydaný pro jednu API projde i do druhé&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Testujte negativní scénáře&lt;/del&gt;, ne jen &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;šťastnou cestu&lt;/del&gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Podepište token klíčem&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;který umíte rotovat&lt;/del&gt;, a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;staré klíče nechte ověřovat jen po dobu platnosti vydaných tokenů&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;CSS se připojuje buď přímo do dokumentu&lt;/ins&gt;, nebo &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jako samostatný &lt;/ins&gt;soubor. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Samostatný soubor je lepší&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;protože se stejné styly dají použít na více stránkách &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;prohlížeč si je uloží do mezipaměti&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Selektorů existuje několik typů&lt;/ins&gt;: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;podle názvu značky, podle třídy a podle identifikátoru&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Třídy se používají opakovaně&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;identifikátor má být na stránce jen jednou&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Záměna těchto dvou věcí vede k nepředvídatelným výsledkům &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;kódu, kterému po týdnu nikdo nerozumí&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Parametrizované dotazy bezpečně oddělí data od kódu, ale jen pro hodnoty, které patří &lt;/ins&gt;do &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;klauzulí WHERE&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;VALUES &lt;/ins&gt;nebo &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SET&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Jakmile aplikace potřebuje měnit název sloupce pro řazení nebo název tabulky podle vstupu od uživatele&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;musí přijít jiná obrana&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Řešením není escapování uvozovek&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ale mapování na pevný seznam povolených hodnot&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Uživatel pošle klíč&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;aplikace &lt;/ins&gt;ho &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;přeloží &lt;/ins&gt;na &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;konkrétní název sloupce&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud klíč v seznamu &lt;/ins&gt;není, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dotaz se vůbec nesestaví a vrátí &lt;/ins&gt;se &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;chyba. Tím zmizí prostor pro vložení poddotazu nebo podmínky, která vrátí celou tabulku&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Typická chyba je dlouhé držení větve a čekání &lt;/ins&gt;na &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;schválení&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Další &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;force push do sdílené větve&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;který smaže kolegům jejich commity. Vyhněte se také commitům se zprávami typu „oprava&quot; nebo „úpravy&quot;&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zaveďte si pravidlo&lt;/ins&gt;, že &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;hlavní větev &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;chráněná a přímý push do ní není možný&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tým, který dodržuje krátké větve, jasné zprávy a povinnou kontrolu&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;stráví méně času hašením požárů &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;více psaním kódu, který funguje&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Začněte tím, že si prohlédnete, které části kódu jsou kritické&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Platební logika, výpočty, zpracování vstupů od uživatele&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;přístupová práva&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tam &lt;/ins&gt;má &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pokrytí smysl &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tam se vyplatí investovat čas. Naopak gettery&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;settery&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;konfigurační soubory &lt;/ins&gt;nebo &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jednoduché přepisy hodnot testovat nemusíte&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Napsat &lt;/ins&gt;pro &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ně test &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;snadné&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ale hodnota je nulová a jen zvyšuje číslo&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Praktický postup: místo plošného čísla si ve CI nastavte prahy jen pro nové nebo změněné soubory&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zavedený &lt;/ins&gt;kód &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nechte být&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dokud se ho nedotknete&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pro kritické moduly nastavte ručně ověřený seznam scénářů, které musí být pokryté vždy&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Testy pište tak&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;aby selhaly&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;když &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;logika rozbitá — zkuste &lt;/ins&gt;si &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;je dočasně podvrátit a sledujte&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;zda skutečně spadnou&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Kdy &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;měření &lt;/ins&gt;přestává být užitečné &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud &lt;/ins&gt;se &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pokrytí &lt;/ins&gt;stane cílem &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;samo o sobě&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;začnou vznikat &lt;/ins&gt;testy &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;šité &lt;/ins&gt;na &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;míru metrice&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Typický příklad: vývojář obalí celou metodu jedním testem&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;který ověří jen to&lt;/ins&gt;, že &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nespadne&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Řádek se započítá&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ale chování zůstane neověřené&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Další častá chyba &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ignorování větví&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nástroj hlásí vysoké pokrytí&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;protože každý řádek proběhl&lt;/ins&gt;, ale &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;podmínky s okrajovými hodnotami zůstaly netknuté&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Základem je ověřit podpis přesně tím algoritmem, který očekáváte. Nikdy nenechávejte knihovnu, aby si algoritmus vybrala podle hlavičky alg z tokenu. Pokud aplikace podporuje HS256 i RS256, musíte dopředu rozhodnout, který použijete, a ostatní odmítnout. Zvlášť nebezpečná je kombinace, kdy se veřejný klíč z RS256 dá podstrčit jako HMAC secret. Vždy porovnávejte iss, aud a exp; token bez expirace je jen trvalý přístupový klíč v cizích rukou.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Formuláře jsou místo, kde se ztrácí nejvíc konverzí. Každé pole navíc snižuje ochotu dokončit akci. Ptejte se jen na to, co skutečně potřebujete, a zbytek zjistěte později. Popisky patří nad pole, ne dovnitř jako placeholder, protože ten po napsání zmizí a uživatel zapomene, co vyplňuje. Validujte &lt;/ins&gt;při &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;odchodu z pole&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ne při každém stisku klávesy. Chybová zpráva má být u konkrétního pole a konkrétní, ne souhrnná dole pod formulářem&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Pokrytí &lt;/ins&gt;kódu &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;testy se často bere jako univerzální metrika kvality&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Jenže číslo samo o sobě nic neříká o tom&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;zda &lt;/ins&gt;testy &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;skutečně odhalují chyby&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tým, který honí stovku procent, často píše testy&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jež procházejí&lt;/ins&gt;, ale &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nic netestují&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;První krok &lt;/ins&gt;je &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;přestat se ptát „kolik procent máme&quot; &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;začít &lt;/ins&gt;se &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ptát „co nám ty testy skutečně zachytí&quot;&lt;/ins&gt;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pozor na dvě věci, které lidi pletou. Za prvé, vysoké pokrytí neznamená kvalitu. Můžete mít devadesát procent a přesto propouštět chyby &lt;/ins&gt;do &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;produkce. Za druhé, nízké pokrytí nemusí být problém, pokud jde o kód, který se nemění &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;je triviální&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Rozhodujte podle rizika, ne podle čísla v přehledu.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;JWT tokeny se nasazují jako univerzální řešení autentizace&lt;/ins&gt;, ale &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;bez správně nastavené validace se z nich stává jen podepsaný kus textu, kterému server slepě věří&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nejčastější &lt;/ins&gt;chyba &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;není v algoritmu, nýbrž v tom, že se token dekóduje a jeho obsah se použije bez ověření podpisu a všech povinných polí. Útočník pak může změnit sub nebo role a dostat se tam, kam nemá.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Co hlídat &lt;/ins&gt;při &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;vydávání a ukládání Access &lt;/ins&gt;token &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;držte krátký, v řádu minut&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Refresh token ukládejte jako serverovou relaci s možností odvolání&lt;/ins&gt;, ne &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;jako další JWT bez stavu. Do payloadu nepatří hesla, rodná čísla ani interní identifikátory, které nechcete ukázat. Pamatujte, že payload je &lt;/ins&gt;jen &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;base64, nikoli šifra&lt;/ins&gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pokud potřebujete skrýt obsah&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;použijte JWE&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nebo raději držte citlivá data na serveru &lt;/ins&gt;a &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;do tokenu dejte pouze odkaz&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>FreemanEnderby7</name></author>
	</entry>
	<entry>
		<id>https://jak.mazovia.edu.pl/index.php?title=JWT_bez_kontroln%C3%AD_logiky:_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD&amp;diff=860595&amp;oldid=prev</id>
		<title>LMSSamira9054951: Utworzono nową stronę &quot;Začnete tím, že si nainstalujete TypeScript globálně nebo lokálně do projektu a vytvoříte konfigurační soubor tsconfig.json. V něm nastavíte cíl kompilace, povolíte přísné kontroly a určíte, kam se má výsledný JavaScript ukládat. Pro nový projekt je rozumné zapnout &quot;strict&quot;: true. Zpočátku to bolí, protože kompilátor hlásí i to, co jste dřív přehlíželi. Vyplatí se to ale vydržet: přísný režim vás naučí psát typy poř…&quot;</title>
		<link rel="alternate" type="text/html" href="https://jak.mazovia.edu.pl/index.php?title=JWT_bez_kontroln%C3%AD_logiky:_kde_tokeny_ti%C5%A1e_selh%C3%A1vaj%C3%AD&amp;diff=860595&amp;oldid=prev"/>
		<updated>2026-10-01T18:01:29Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;Začnete tím, že si nainstalujete TypeScript globálně nebo lokálně do projektu a vytvoříte konfigurační soubor tsconfig.json. V něm nastavíte cíl kompilace, povolíte přísné kontroly a určíte, kam se má výsledný JavaScript ukládat. Pro nový projekt je rozumné zapnout &amp;quot;strict&amp;quot;: true. Zpočátku to bolí, protože kompilátor hlásí i to, co jste dřív přehlíželi. Vyplatí se to ale vydržet: přísný režim vás naučí psát typy poř…&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Začnete tím, že si nainstalujete TypeScript globálně nebo lokálně do projektu a vytvoříte konfigurační soubor tsconfig.json. V něm nastavíte cíl kompilace, povolíte přísné kontroly a určíte, kam se má výsledný JavaScript ukládat. Pro nový projekt je rozumné zapnout &amp;quot;strict&amp;quot;: true. Zpočátku to bolí, protože kompilátor hlásí i to, co jste dřív přehlíželi. Vyplatí se to ale vydržet: přísný režim vás naučí psát typy pořádně a předejde řadě problémů později.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Nejčastější chyba je ukládat do store všechno, včetně stavu formuláře nebo otevřeného dialogu. Druhá je mutace stavu uvnitř reduceru, která se projeví až později. Třetí je obcházení Reduxu přímým voláním globální proměnné, čímž ztratíte veškerou výhodu dohledatelnosti. Pokud stav roste, rozdělte ho na menší reducery a kombinujte je. Až přestane být přehledný, není to důvod přidávat další knihovny, ale vrátit se k návrhu dat.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Při ověřování si dejte pozor na časové posuny. Malá tolerance u exp a nbf je v pořádku, ale nesmí být v minutách. Stejně tak kontrolujte, že token nebyl použit před nbf. Odvolávání je slabina bezstavových tokenů: blacklist podle jti nebo krátká platnost s rotací refresh tokenů řeší většinu případů. Nikdy neposílejte token v URL, dostane se do logů a refererů.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Napojení komponent na store patří co nejníž. Nespojujte celé stránky, když stačí jedna položka seznamu. Komponenta má dostat jen data, která opravdu vykresluje, a jen akce, které sama vyvolává. Přepočítávejte selektory, které vracejí nový objekt nebo pole, jinak se komponenta překresluje při každé změně store. Typický problém je také příliš mnoho akcí pro jednu uživatelskou činnost; sloučte je do jedné, která popíše celý záměr.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Struktura projektu se vyplatí řešit dřív, než napíšete dvacátou routu. Rozdělte kód na trasy, controllery a vrstvu pro přístup k datům. Jeden soubor s pěti sty řádky se nedá testovat ani rozumně upravovat. Konfiguraci a tajné klíče držte mimo zdrojový kód, ideálně v proměnných prostředí, a nikdy je necommitujte do repozitáře. Stejně tak si hlídejte, co posíláte klientovi: chybová odpověď nemá obsahovat stack trace ani interní detaily.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Kdy se z pokrytí stává past Pokrytí přestává být užitečné ve chvíli, kdy se stane cílem místo nástroje. Typickým projevem je test, který zavolá funkci, ale nekontroluje výsledek. Nebo testy, které jen procházejí kód, aby zvýšily procento. Dalším varovným signálem je snaha dostat se na sto procent za každou cenu. Poslední procenta obvykle znamenají testy pro triviální gettery, obsluhu výjimek, které nikdy nenastanou, nebo mrtvý kód. Náklady rostou, přínos klesá.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Co hlídat při vydávání a ukládání Access token držte krátký, v řádu minut. Refresh token ukládejte jako serverovou relaci s možností odvolání, ne jako další JWT bez stavu. Do payloadu nepatří hesla, rodná čísla ani interní identifikátory, které nechcete ukázat. Pamatujte, že payload je jen base64, nikoli šifra. Pokud potřebujete skrýt obsah, použijte JWE, nebo raději držte citlivá data na serveru a do tokenu dejte pouze odkaz.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Implementaci naopak odhadujte až ve chvíli, kdy je analytika hotová a znáte rozsah. Tým pak pracuje s jasnými vstupy a může použít relativní odhady, například bodové nebo velikostní. Nezahrnujte do implementace práci, která patří analytice, a naopak. Pokud se během implementace objeví nové analytické otázky, není to selhání odhadu, ale signál, že analytická část nebyla dotažená. Řešte to jako samostatnou položku, ne jako „překvapení&amp;quot; uvnitř sprintu.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Základem je ověřit podpis přesně tím algoritmem, který očekáváte. Nikdy nenechávejte knihovnu, aby si algoritmus vybrala podle hlavičky alg z tokenu. Pokud aplikace podporuje HS256 i RS256, musíte dopředu rozhodnout, který použijete, a ostatní odmítnout. Zvlášť nebezpečná je kombinace, kdy se veřejný klíč z RS256 dá podstrčit jako HMAC secret. Vždy porovnávejte iss, aud a exp; token bez expirace je jen trvalý přístupový klíč v cizích rukou.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Praktické pravidlo: pokud test neumí selhat při změně logiky, pravděpodobně nic neověřuje. Zkuste mutační testování na menším vzorku kódu. Rychle ukáže, které testy jsou jen dekorace. Pokud mutace přežijí, máte sice vysoké pokrytí, ale slabou sadu testů. To je přesně ten okamžik, kdy je lepší číslo ignorovat a věnovat se kvalitě assertions.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Typická chyba je ukládání tokenu do localStorage a následné XSS. HttpOnly cookie s SameSite je bezpečnější, ale vyžaduje ochranu proti CSRF. Další častá chyba je zapomenutý aud při více službách: token vydaný pro jednu API projde i do druhé. Testujte negativní scénáře, ne jen šťastnou cestu. Podepište token klíčem, který umíte rotovat, a staré klíče nechte ověřovat jen po dobu platnosti vydaných tokenů.&lt;/div&gt;</summary>
		<author><name>LMSSamira9054951</name></author>
	</entry>
</feed>