Měnící se podoba bezpečnosti frontendu
Po léta fungovalo odvětví v nebezpečném omylu: bezpečnost je „problém backendu“. V tomto zastaralém modelu byli frontend vývojáři zodpovědní za „sklo“ – UI/UX – zatímco těžká práce v podobě autentizace, validace dat a zmírňování hrozeb probíhala za firewallem.
Jak se posouváme do let 2025 a 2026, tato hranice fakticky zmizela. S nástupem komplexních Single Page Applications (SPA), mikrofrontendů a edge computingu je nyní frontend primární plochou pro útoky. Moderní prohlížeče zavedly výkonná API pro obranu proti sofistikovaným hrozbám, ale vyžadují aktivní implementaci ze strany vývojářů. Současně globální předpisy, jako je EU Cyber Resilience Act (CRA), nařizují „Security-by-Design“, čímž se správa zranitelností stává zákonným požadavkem, nikoli pouze osvědčeným postupem.
Tento průvodce zkoumá základní pilíře bezpečnosti frontendu v současné éře a poskytuje technickou hloubku potřebnou k vytváření odolných a vyhovujících webových aplikací.
1. Moderní autentizace: OAuth 2.1 a Zero-Trust
Oblast autentizace prošla významnou konsolidací. Od roku 2025 nahradil OAuth 2.1 roztříštěná RFC standardu OAuth 2.0 a vytvořil bezpečnější základ pro aplikace na straně klienta.
Konec Implicit Grant a vzestup PKCE
Nejvýznamnější změnou v OAuth 2.1 je formální odstranění toku Implicit Grant. Tento tok, dříve běžný u SPA, vracel access tokeny přímo ve fragmentu URL, což je činilo zranitelnými vůči „úniku access tokenu“ prostřednictvím historie prohlížeče nebo hlaviček referer.
Novým standardem pro všechny frontendové aplikace je Authorization Code Flow s PKCE (Proof Key for Code Exchange). PKCE zajišťuje, že i když útočník zachytí autorizační kód, nemůže jej vyměnit za token bez tajného „code verifier“, který nikdy neopustí paměť klienta.
// Konceptuální příklad generování PKCE challenge ve frontendové službě
async function generatePKCE() {
const verifier = generateRandomString(128);
const challengeBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
const challenge = base64UrlEncode(challengeBuffer);
// Uložení verifier do paměti (ne do LocalStorage!) pro krok výměny
sessionStorage.setItem('pkce_verifier', verifier);
return challenge;
}Přechod na architekturu Zero-Trust
V architektuře frontendu typu Zero-Trust již nepředpokládáme, že uživatel je „v bezpečí“ jen proto, že má platnou session cookie. Každé citlivé volání API je považováno za unikátní požadavek, který musí být autorizován. To často zahrnuje používání krátkodobých access tokenů s omezeným rozsahem (scoped). Namísto jediné role „admin“ nyní vývojáři implementují granulární oprávnění, která jsou validována při každé interakci v UI a následném požadavku na API.

2. Neutralizace injekcí pomocí Trusted Types a sanitizace
Cross-Site Scripting (XSS) zůstává hlavní hrozbou, ale metodika jeho prevence se posunula od reaktivního „escapování“ k proaktivní bezpečnosti „založené na pravidlech“.
Implementace Trusted Types API
Trusted Types API mění pravidla hry v prevenci DOM-based XSS. Umožňuje vývojářům uzamknout „injection sinks“ – nebezpečné funkce jako .innerHTML, eval() nebo document.write(). Jakmile je toto zapnuto prostřednictvím Content Security Policy (CSP), prohlížeč odmítne přijmout prosté řetězce pro tyto funkce. Místo toho musíte předat objekt „Trusted Type“ vytvořený prostřednictvím předem definované politiky.
// 1. Definice politiky (obvykle ve vstupním bodě aplikace)
const escapeHTMLPolicy = trustedTypes.createPolicy("myAppPolicy", {
createHTML: (input: string) => {
// Použití knihovny jako DOMPurify k sanitizaci vstupu
return DOMPurify.sanitize(input, { RETURN_TRUSTED_TYPE: true });
}
});
// 2. Použití politiky
const userInput = "<img src=x onerror=alert(1)>";
const secureElement = document.getElementById("content");
// Toto by vyvolalo TypeError, pokud jsou Trusted Types vynuceny:
// secureElement.innerHTML = userInput;
// Toto je bezpečný a kompatibilní způsob:
secureElement.innerHTML = escapeHTMLPolicy.createHTML(userInput);Kontextové kódování výstupu
Zatímco moderní frameworky jako React a Vue provádějí základní HTML escapování automaticky, nechrání proti všem kontextům. Vývojáři musí zůstat ostražití ohledně:
- Kontext atributů:
href="javascript:alert(1)"není standardním escapováním zachyceno. - Kontext CSS: Hodnoty ovládané uživatelem v tazích
stylemohou vést k exfiltraci dat. - Kontext JSON: Předávání dat ze serveru přímo do tagu
<script>vyžaduje specifické JSON escapování, aby se zabránilo vyskočení z řetězce.
DOMPurify v roce 2026
DOMPurify (v3.3.1+) zůstává průmyslovým standardem. Moderní verze jsou optimalizovány pomocí WebAssembly (Wasm) pro výkon blízký nativnímu a nabízejí hlubokou integraci s Trusted Types API. Při zpracování obsahu generovaného uživateli (komentáře, profily atd.) by měla sanitizace probíhat co nejblíže k „sinku“.

3. Zabezpečení prohlížeče pomocí CSP a bezpečných cookies
Prohlížeč poskytuje několik mechanismů pro izolaci vaší aplikace od škodlivých skriptů. Jejich správná konfigurace je znakem seniorního frontend vývojáře.
Content Security Policy (CSP) Level 3
Silná CSP je vaší poslední linií obrany. V roce 2025 jsme se posunuli od rozsáhlých „allow-listů“ (které se těžko udržují) k Strict CSP využívajícím nonce a strict-dynamic.
- Nonce: Unikátní, kryptograficky silný náhodný řetězec generovaný pro každý požadavek. Spustí se pouze skripty s odpovídajícím atributem
nonce. - Strict-Dynamic: Tato direktiva říká prohlížeči, že pokud je skript důvěryhodný (přes nonce), měly by být důvěryhodné i všechny skripty, které dynamicky načítá. To zjednodušuje správu u komplexních stromů závislostí.
Příklad CSP hlavičky:
Content-Security-Policy:
object-src 'none';
script-src 'nonce-rAnd0m123' 'strict-dynamic' https:;
base-uri 'none';Bezpečná správa cookies a CHIPS
Ukládání session tokenů je věčným tématem diskusí. Konsenzus pro léta 2025–2026 je jasný: Vyhněte se LocalStorage pro citlivé tokeny.
Místo toho používejte cookies s těmito nezbytnými atributy:
- HttpOnly: Zabraňuje přístupu JavaScriptu, čímž zmírňuje dopad XSS.
- SameSite=Lax/Strict: Zabraňuje Cross-Site Request Forgery (CSRF) omezením toho, kdy jsou cookies odesílány.
- Partitioned (CHIPS): Cookies Having Independent Partitioned State (CHIPS) umožňují vývojářům zvolit „partitioned“ úložiště. To je klíčové pro vkládané prvky třetích stran (jako platební widgety), aby si udržely stav bez povolení sledování napříč weby, což splňuje moderní požadavky na soukromí.
Subresource Integrity (SRI)
Útoky na dodavatelský řetězec (supply chain) přibývají. Pokud načítáte knihovnu z CDN (např. Google Fonts nebo konkrétní JS utilitu), musíte použít SRI. To zajistí, že pokud bude CDN napadena a soubor změněn, prohlížeč jej odmítne spustit.
<script src="https://example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"></script>4. Bezpečná komunikace a integrita vstupu
Frontendové aplikace zřídkakdy existují v izolaci. Komunikují s API, jinými okny (iframy) a workery.
Bezpečná implementace postMessage
Při použití window.postMessage pro komunikaci mezi různými původy (cross-origin) jsou dvěma nejčastějšími chybami neověření původu odesílatele a nespecifikování cílového původu příjemce.
// Příjemce: Vždy ověřujte, kdo k vám mluví
window.addEventListener("message", (event) => {
const trustedOrigins = ["https://app.trusted.com", "https://auth.trusted.com"];
if (!trustedOrigins.includes(event.origin)) {
console.error("Zablokována zpráva z nedůvěryhodného původu:", event.origin);
return;
}
// Vždy parsujte data bezpečně
try {
const message = JSON.parse(event.data);
handleMessage(message);
} catch (e) {
console.error("Neplatný formát zprávy");
}
});Rozdíl mezi validací a sanitizací
Častou chybou je spoléhání se na validaci na straně klienta jako na bezpečnostní opatření.
- Validace: Funkce UX. Říká uživateli „toto není platná e-mailová adresa“. Útočník ji snadno obejde pomocí proxy nástroje jako OWASP ZAP.
- Sanitizace: Bezpečnostní funkce. Odstraňuje nebezpečné znaky ze vstupu předtím, než je uložen nebo vykreslen.
- Vynucení: Bezpečnostní logika musí být vždy vynucena na serveru. Úkolem frontendu je zajistit, aby data odesílaná na server byla správně zformátována a data přijatá ze serveru byla bezpečně vykreslena.
5. Compliance, závislosti a faktor AI
Role frontend vývojáře nyní zahrnuje i určitou míru právního a regulačního povědomí.
EU Cyber Resilience Act (CRA) a SBOM
Do září 2026 bude EU CRA vyžadovat, aby softwarové produkty poskytovaly Software Bill of Materials (SBOM). Pro frontend vývojáře to znamená, že musíte být schopni doložit každý NPM balíček, tranzitivní závislost a skript hostovaný na CDN ve vaší aplikaci.
Nástroje jako Snyk, Dependabot nebo Socket již nejsou volitelné. Měly by být integrovány do vaší CI/CD pipeline, aby automaticky označovaly zranitelnosti ve vašem package-lock.json.
Rizika kódu generovaného AI
Nástup AI asistentů pro kódování (Cursor, GitHub Copilot) přinesl novou třídu zranitelností: AI-halucinované závislosti. Byly zdokumentovány případy, kdy AI navrhne neexistující balíčky, které pak útočníci zaregistrují na NPM, aby provedli útoky na dodavatelský řetězec.
Osvědčený postup: Nikdy „slepě“ nemergeujte bezpečnostní logiku nebo přidání závislostí generované AI. Každý řádek kódu vygenerovaný AI musí projít manuální bezpečnostní revizí lidským vývojářem.

Často kladené otázky
Je bezpečnost frontendu zodpovědností frontend vývojáře?
Ano, moderní webová architektura přenesla významnou část zodpovědnosti na stranu klienta. Zatímco backend zabezpečuje databázi a serverovou logiku, frontend vývojář je zodpovědný za ochranu uživatelské relace, prevenci XSS a implementaci bezpečných politik na úrovni prohlížeče.
Jaká jsou nejčastější bezpečnostní rizika frontendu?
Mezi nejčastější rizika patří Cross-Site Scripting (XSS), nezabezpečené ukládání citlivých tokenů v LocalStorage a zranitelnosti v dodavatelském řetězci prostřednictvím závislostí třetích stran. Velkým problémem zůstává také nesprávná konfigurace Content Security Policies (CSP) a Cross-Origin Resource Sharing (CORS).
Jak zabráním XSS v moderních frameworku jako React nebo Vue?
Ačkoli frameworky poskytují výchozí escapování, musíte se vyhnout „únikovým cestám“ jako dangerouslySetInnerHTML nebo v-html, pokud data nejsou sanitizována přes DOMPurify. Implementace Trusted Types API navíc poskytuje vrstvu ochrany na úrovni prohlížeče, která zachytí pokusy o injekci, i když jsou ochrany na úrovni frameworku obejity.
Je bezpečné ukládat autentizační tokeny v LocalStorage?
Obecně ne. LocalStorage je přístupný jakémukoli JavaScriptu běžícímu na stejném původu, což znamená, že zranitelnost XSS může vést k okamžité krádeži tokenu. Mnohem bezpečnější je používat HttpOnly a Secure cookies nebo ukládat tokeny v paměti se strategií rotace Refresh Tokenů.
Jaký je rozdíl mezi validací vstupu a sanitizací?
Validace vstupu kontroluje, zda data odpovídají specifickému formátu (např. platný e-mail) pro účely UX, zatímco sanitizace odstraňuje nebo kóduje nebezpečné znaky (např. <script>), aby se zabránilo jejich spuštění. Validace probíhá před zpracováním, zatímco sanitizace probíhá před vykreslením nebo uložením dat.
Závěr
Webová bezpečnost v letech 2025 a 2026 je vícevrstvá disciplína. Jako frontend vývojáři jsme strážci prostředí prohlížeče uživatele. Přijetím OAuth 2.1, vynucováním Trusted Types a udržováním důsledného Software Bill of Materials můžeme budovat aplikace, které jsou nejen funkční, ale také odolné vůči stále složitějšímu prostředí hrozeb.
Posun směrem k „Security-by-Design“ není jen regulační překážkou – je to příležitost k budování důvěry u uživatelů. Začněte auditem svých aktuálních hlaviček pomocí Mozilla Observatory, skenováním závislostí pomocí Snyk a přesunem citlivých tokenů z LocalStorage. Bezpečnost není jednorázový úkol; je to neustálý závazek k excelenci v inženýrství.