🌐 BI-TWA.21 – Základy webových technologií

Státnicové poznámky · Bakalářské státní zkoušky · FIT ČVUT

4 okruhy HTTP & stav Server & REST Bezpečnost Klient & AJAX
Okruh 1 · BI-WI.21-17

Obsluha a struktura HTTP požadavku a odpovědi ve webové aplikaci. Stav webové aplikace.

Principy fungování HTTP protokolu, struktura požadavku a odpovědi, přehled verzí, a způsoby udržování stavu v bezestavové webové aplikaci (URL, cookies, sessions).

🔗 URL, URI, URN – identifikace zdrojů

URL (Uniform Resource Locator) – identifikuje lokaci zdroje na webu. Je podmnožinou URI.
URI (Uniform Resource Identifier) – obecný identifikátor zdroje (může identifikovat i bez lokace).
URN (Uniform Resource Name) – trvalé jméno zdroje bez lokace (např. ISBN).

Formát URL dle RFC 1738:

  • scheme:[//authority]path[?query][#fragment]
  • scheme – protokol (https, http, ftp, …)
  • authority – doménové jméno nebo IP adresa (např. usermap.cvut.cz)
  • path – cesta ke zdroji (např. /search)
  • query – parametry dotazu za ? (např. query=Novák)
  • fragment – kotva v rámci stránky za # (např. profile)

Příklad: https://usermap.cvut.cz/search?query=Novák#profile

Proč rozlišujeme URL a URI?

Jeden uživatel Jan Novák může mít UUID jako trvalé URI (uuid:0d34f3bd-…), ale také URL profilu, URL fotky, URL QR kódu – různé lokace pro stejný zdroj. URI je nadřazený pojem, URL je konkrétní adresa.

🌍 DNS – Domain Name System

DNS – hierarchický distribuovaný systém, který překládá doménová jména na IP adresy a poskytuje další metadata.
  • Hierarchie: 13 logických kořenových (root) DNS serverů (A-M) → TLD servery (.cz, .com) → autoritativní servery domény
  • Správce TLD: ICANN (Internet Corporation for Assigned Names and Numbers), autorita TLD: IANA, autorita .cz: CZ.NIC
  • Efektivní cachování – změny se projeví až po vypršení TTL (Time To Live)

Průběh DNS dotazu (zjednodušeně):

  1. Prohlížeč se zeptá lokálního DNS serveru na IP pro username.cvut.cz.
  2. Lokální DNS nezná → ptá se kořenového serveru → získá adresu DNS pro .cz.
  3. DNS pro .cz nezná plnou adresu → odkáže na DNS pro .cvut.cz.
  4. DNS pro .cvut.cz zná a vrátí IP adresu.
  5. Lokální DNS si odpověď uloží do cache a vrátí ji prohlížeči.
Důsledek cachování

Pokud se změní IP adresa serveru (DNS záznam), uživatelé s platnou cache budou stále směrováni na starou adresu. Změna se projeví až po vypršení TTL záznamu.

🔀 Forward Proxy vs. Reverse Proxy

Proxy – prostředník (meziserver) mezi klientem a serverem.
TypKde stojíSlouží komuTypické využití
Forward Proxy Na straně klienta (ve firmě, ISP) Klientům Nedostatek IP adres (NAT), monitorování provozu, bezpečnost, izolace sítě
Reverse Proxy Na straně serveru (před farmou serverů) Serverům Zabezpečení, vyvažování zátěže (load balancing), cachování, stabilita

Proč je to důležité? V REST architektuře klient neví, s čím komunikuje – může to být load balancer, cache server nebo skutečný server. Toto je princip vrstvené architektury.

📡 HTTP – HyperText Transfer Protocol

HTTP – protokol aplikační vrstvy (nad TCP/IP), textový, bezestavový, funguje na principu požadavek → odpověď. Šifrovaná varianta je HTTPS (port 443).
  • Porty: HTTP → 80 (nebo 8080), HTTPS → 443 (nebo 8443)
  • Bezestavový = každý požadavek je nezávislý, server si nepamatuje předchozí komunikaci
  • Verze: 0.9, 1.0, 1.1, 2, 3
VerzeKlíčová vlastnost
HTTP/0.9Pouze GET, žádné hlavičky, vrací přímo HTML
HTTP/1.0Hlavičky, stavové kódy, Content-Type
HTTP/1.1Povinná hlavička Host, Keep-Alive, chunked přenos, pokročilé cachování
HTTP/2Binární, multiplexované (více požadavků přes 1 spojení), komprese hlaviček, server-push
HTTP/3Funguje nad UDP (QUIC), zdokonaluje paralelní zpracování, jednodušší přechod mezi sítěmi

📤 Struktura HTTP požadavku (Request)

Request – zpráva odeslaná klientem serveru, popisuje požadovanou akci.

Formální gramatika:

  • Request ::= RequestLine (Header CRLF)* CRLF [body]
  • RequestLine ::= Method RequestUri HTTPVersion CRLF

Příklad požadavku:

GET /profile/140f269cb240 HTTP/1.1
Host: usermap.cvut.cz
Accept: text/html

Základní HTTP metody:

  • GET – získání dat (stavu), zobrazení stránky, vyhledávání. Idempotentní i safe.
  • POST – změna dat (vytváření, úprava, mazání). Není idempotentní ani safe.
  • PUT – náhrada/vytvoření zdroje. Idempotentní.
  • DELETE – smazání zdroje. Idempotentní.
  • PATCH – částečná úprava. Není idempotentní ani safe.
  • HEAD – jako GET, ale bez těla odpovědi (jen hlavičky).
Safe vs. Idempotentní

Safe (bezpečná) metoda nemění stav serveru – lze bezpečně cachovat. Idempotentní metoda má vždy stejný efekt i při opakování (nastav na 10 = stále 10, ale inkrementuj o 1 ≠ idempotentní).

📥 Struktura HTTP odpovědi (Response) a stavové kódy

Response – zpráva zaslaná serverem klientovi jako výsledek zpracování požadavku.

Formální gramatika:

  • Response ::= StatusLine (Header CRLF)* CRLF [body]
  • StatusLine ::= HTTPVersion Status CRLF

Příklad odpovědi:

HTTP/1.1 200 OK
Date: Sun, 5 Jul 2020 16:46:06 GMT
Content-Length: 39
Content-Type: text/html

<html><body>Ahoj svete!</body></html>

Skupiny stavových kódů:

RozsahKategoriePříklady
1xxInformační – požadavek přijat, zpracování pokračuje100 Continue
2xxÚspěch200 OK, 201 Created, 204 No Content
3xxPřesměrování – nutná další akce301 Moved Permanently, 302 Found, 304 Not Modified
4xxChyba klienta400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed
5xxChyba serveru500 Internal Server Error, 503 Service Unavailable
401 vs 403 – častá záměna!

401 Unauthorized = uživatel není autentizován (nepřihlášen). 403 Forbidden = uživatel je přihlášen, ale nemá oprávnění (neautorizován).

📋 HTTP Hlavičky (Headers)

Hlavičky přenášejí metadata o požadavku nebo odpovědi.

Hlavička (Request)Hlavička (Response)Popis
HostDoménové jméno cílového serveru (povinné v HTTP/1.1)
AcceptContent-TypeTyp obsahu (MIME type), např. text/html, application/json
Accept-LanguageContent-LanguageJazyk obsahu
RefererPředchozí adresa (pozn: překlep ve standardu!)
OriginPředchozí doména (pro CORS)
CookieSet-CookiePřenos cookies
LocationCílová URL při přesměrování
AuthorizationWWW-AuthenticateAutentizační údaje

🔄 Stav webové aplikace – proč a jak

HTTP je bezestavový protokol – každý požadavek je izolovaný, server si nepamatuje předchozí komunikaci. Stav musí být reprezentován explicitně.

Tři základní mechanismy udržování stavu:

1. Stav v URL

  • Typicky pro vyhledávání a filtrování: /search?user=Svobo*&page=2
  • Výhoda: Stav je sdílitelný (záložka, odkaz v e-mailu)
  • Nevýhoda: Nehodí se pro důvěrné informace (hesla, tokeny)
  • Stav je řízen výhradně HTML hypertextovými odkazy <a href="...">

2. Cookies

  • Úložiště dat na straně klienta (v prohlížeči)
  • Server nastaví cookie přes hlavičku Set-Cookie, klient ji automaticky odesílá v každém dalším požadavku v hlavičce Cookie
  • Vhodné pro relativně malá data (klíč–hodnota)
  • Nelze se spolehnout na autenticitu – uživatel může cookie upravit nebo smazat

Parametry cookies:

  • Expires / Max-Age – životnost cookie (bez toho platí jen do zavření prohlížeče)
  • Secure – cookie se posílá pouze přes HTTPS
  • HttpOnly – cookie není přístupná přes JavaScript (ochrana před XSS)
  • SameSite – omezení cross-site zasílání (ochrana před CSRF)
HTTP/1.1 200 OK
Set-Cookie: CID=46872; Max-Age=3600; Secure; HttpOnly

3. Sessions (relace)

  • Data jsou uložena na serveru, klient dostane pouze unikátní identifikátor session (Session ID)
  • Data nejsou přístupná klientovi → nejsou volně modifikovatelná
  • Provázání klienta se session: přes cookie (preferováno) nebo query parametr v URL
  • Úložiště session: soubor, relační DB, key-value DB (Redis), paměť
Session přes URL – bezpečnostní riziko

Pokud je Session ID součástí URL (/index.php?PHPSESSID=8291747127241), může být sdíleno jako záložka nebo odkaz – příjemce pak převezme identitu odesílatele. Preferujte vždy cookie.

Cookie vs. Session – klíčový rozdíl

Cookie = data uložena u klienta, posílají se vždy. Session = data uložena na serveru, u klienta je jen ID. Session je bezpečnější (data nelze snadno podvrhnout), ale vytváří zátěž na serveru a vyžaduje sdílené úložiště při škálování.

Okruh 2 · BI-WI.21-18

Základní postupy, technologie a standardy na straně serveru. Architektura webové aplikace a související návrhové vzory. REST.

Architektura klient-server, vícevrstvé architektury, MVC a příbuzné vzory, návrhové vzory GoF, webové služby (REST, SOAP, GraphQL), databázové vzory a hosting.

🏗️ Architektury webových aplikací

Architektura popisuje návrh celé aplikace z vysoké úrovně. Různé architektury reprezentují různou úroveň pohledu a vzájemně se nevylučují.

2-vrstvá architektura:

  • Thin-client / Smart-server – tradiční přístup; veškerá logika na serveru, klient jen zobrazuje HTML
  • Thick-client / Dumb-server – moderní přístup (SPA); server poskytuje jen API, logika je v prohlížeči

Vícevrstvá architektura (N-tier):

  • Separace odpovědností, abstrakce, snížení závislostí
  • Komunikace probíhá mezi sousedními vrstvami (nebo v rozvolněné variantě přes více vrstev)
  • 3-vrstvá: Prezentační vrstva → Logická (business) vrstva → Datová vrstva

Monolitická architektura:

  • Celá aplikace je jeden nasaditelný celek
  • Jednoduché testování, ale špatně se škáluje (musí se škálovat jako celek) a je hůře udržovatelná

Microservices (mikroslužby):

  • Dekompozice na malé nezávislé služby – jedna funkcionalita = jedna služba
  • Výborná škálovatelnost, nezávislé nasazení každé služby
  • Složitější orchestrace a komunikace mezi službami

Enterprise Service Bus (ESB):

  • Centrální moderátor komunikace mezi službami
  • Zajišťuje: vyhledání služby, zasílání zpráv, kontrolu stavu, mediaci, zabezpečení

🧩 MVC, MVP a architektonické vzory

MVC (Model-View-Controller) – návrhový vzor oddělující logiku aplikace, data a prezentaci.
  • Model – business logika a data (přístup k databázi, pravidla, validace)
  • View – prezentační vrstva (HTML šablony, zobrazení dat)
  • Controller – řídí tok aplikace, přijímá požadavky, volá model, vybírá view

MVP (Model-View-Presenter):

  • Presenter přebírá veškerou logiku z View
  • View je pasivní – jen zobrazuje a předává uživatelské vstupy presenteru
  • Lepší testovatelnost (Presenter lze testovat bez UI)

Front Controller:

  • Řídí běh celé aplikace – vstupní bod každého HTTP požadavku (typicky index.php)
  • Provádí routing, autentizaci, autorizaci a předává řízení konkrétnímu controlleru

Template View:

  • Spravuje šablony s zástupnými symboly ({{ $name }})
  • Implementuje návrhový vzor Interpreter
  • Příklady: Latte (Nette), Twig (Symfony), Blade (Laravel)

📐 Návrhové vzory GoF (Gang of Four)

Návrhový vzor – obecné, standardizované, opakovaně použitelné řešení typického problému při návrhu softwaru. Musí mít jméno, řešit problém za určitých podmínek a být srozumitelně vysvětlitelný.

Creational (Kreační) – řeší vytváření objektů:

  • Singleton – existuje jediná instance (konfigurace, DB spojení). Označován za anti-pattern (globální stav, ztěžuje testování).
  • Factory / Factory Method / Abstract Factory – správný výběr třídy pro vytvoření objektu bez přímé závislosti na konkrétní třídě
  • Builder – usnadňuje sestavování komplikovaných objektů (e.g. SQL dotaz, HTTP požadavek)
  • Prototype – vytváří kopie existujících objektů (metoda clone())

Structural (Strukturální) – uspořádání tříd a komponent:

  • Proxy – druhotný přístup k objektu (lazy-loading, cachování)
  • Adapter – interoperabilita rozhraní (dvě různé knihovny pro zpracování obrázků)
  • Facade – zastiňuje detaily implementace, sdružuje celý package do jedné přístupné třídy
  • Decorator – obohacuje základní třídy, obaluje původní objekty (podobný proxy, ale jiný účel)
  • Composite – stromová struktura vztahu část-celek (adresáře, menu)
  • Bridge – odděluje abstrakci od implementace (modulární struktura)
  • Flyweight – sdílení instancí se stejnými vlastnostmi (šetří paměť; 100× stejné tlačítko s jiným textem)

Behavioral (Behaviorální) – chování a interakce objektů:

  • Observer – „nevolejte nás, zavoláme vás"; pozorovatelé se registrují k observable a jsou notifikováni při změně stavu
  • Command – zapouzdřuje akci jako objekt (lze volat hned, later, nebo odvolat)
  • Strategy – zaměnitelné algoritmy (výpočet ceny pro různé zákazníky)
  • State – chování objektu závisí na jeho vnitřním stavu (definování HTTP hlaviček před a po vykreslení)
  • Chain of Responsibility – posílání požadavku přes řetěz objektů (autentizace → autorizace → cache → zpracování)
  • Template Method – definuje obecný postup, konkrétní kroky implementují potomci
  • Visitor – přidává novou funkcionalitu do hierarchie tříd bez úpravy původních tříd
  • Mediator – organizuje interakci mezi objekty (controller, presenter)
  • Interpreter – reprezentace virtuálního jazyka (BBcode, Markdown)
  • Iterator – procházení kolekcí bez znalosti její struktury

Vzory pro IoC (Inversion of Control):

  • Dependency Injection – závislosti jsou předány zvenčí (přes konstruktor, setter nebo rozhraní), ne vytvářeny uvnitř
  • Service Locator – globální služba, která zná a vrací všechny ostatní služby

🌐 REST – Representational State Transfer

REST – softwarová architektura pro distribuované hypermediální systémy, definovaná R. Fieldingem v dizertační práci. Popisuje principy fungování webu (HTTP/1.0 → HTTP/1.1).

6 REST omezení (constraints):

  1. Klient–server – separace zodpovědností; klient a server se vyvíjejí nezávisle
  2. Bezestavovost – každý požadavek obsahuje všechny potřebné informace; server neuchovává stav klienta
  3. Cachovatelnost – odpovědi musí být označeny jako cacheable/non-cacheable
  4. Vrstvená architektura – klient neví, zda komunikuje přímo se serverem nebo s proxy; snadná rozšiřitelnost
  5. Uniformní rozhraní – klíčový princip: identifikace zdrojů (resources), manipulace přes reprezentaci, samopopisné zprávy, HATEOAS
  6. Code on Demand (volitelné) – server může posílat klientovi spustitelný kód (JavaScript)

Klíčové elementy REST:

ElementPopisPříklad
Zdroj (Resource)Konceptuální entita nebo skupina entitUživatel, článek, kolekce knih
Resource IdentifierJedinečná identifikace zdrojeURL, URN
ReprezentaceForma, ve které je zdroj přenášenJSON, XML, HTML, JPEG
Metadata reprezentaceInformace o reprezentaciMedia type, čas poslední úpravy

Identifikace zdrojů – pravidla URL:

  • Výstižný, unikátní název
  • Hierarchická struktura: /books/{id}/authors
  • Singulár (/book/{id}) nebo plurál (/books/{id}) – zvolte jedno a dodržujte konzistentně
  • URL pouze identifikuje zdroj, HTTP metoda popisuje akci

REST rozhraní – metody na kolekcích a instancích:

MetodaKolekce /booksInstance /books/{id}
GET200 OK – seznam knih200 OK – detail knihy, 404 Not Found
POST201 Created – vytvoří novou knihu405 Method Not Allowed
PUT405 nebo nahradí celou kolekci200 OK / 201 Created / 204 No Content – nahradí nebo vytvoří
DELETE405 nebo smaže celou kolekci200 OK / 204 No Content – smaže
PATCHNení standardizováno200 OK / 204 No Content – částečná úprava

Cachování v REST:

  • Cache-Control: no-store – bez cachování
  • Cache-Control: max-age=3600 – platnost 1 hodinu
  • Cache-Control: private – jen v prohlížeči (ne proxy)
  • ETag + If-None-Match – validace pomocí hash obsahu (304 Not Modified = použij cache)
  • Last-Modified + If-Modified-Since – validace časovým razítkem
HATEOAS – Hypermedia as the Engine of Application State

Odpověď REST API by měla obsahovat hypertextové odkazy na další možné akce. Klient tak nepotřebuje dopředu znát strukturu API – naviguje ji dynamicky. Příklad: odpověď na GET /books/42 obsahuje linky na /books/42/authors a DELETE /books/42.

🔌 Webové služby – REST, SOAP, GraphQL, RPC

Webová služba – standardizované API umožňující komunikaci dvou nebo více aplikací přes síť.
StandardPrincipVýhody / Nevýhody
RPCVzdálené volání procedur (XML-RPC, gRPC)Jednoduchý model, gRPC je binární a vhodný pro microservices
SOAP + WSDLKomplexní model webové služby v XML; WSDL popisuje rozhraníSilně typovaný, enterprise-ready; ale verbózní a složitý
RESTCRUD operace nad zdroji přes HTTP; JSON/XMLJednoduché, cachovatelné; ale méně expressivní pro komplexní dotazy
GraphQLDotazovací jazyk; klient specifikuje přesně jaká data chceFlexibilní pro klienty; ale složité cachování a verzování

GraphQL specifika:

  • Architektura i dotazovací jazyk v jednom; silně typované schéma
  • Query – získávání dat
  • Mutation – modifikace dat
  • Subscription – real-time notifikace (WebSocket)
  • Problémy: obtížné cachování (jeden endpoint /graphql), složité verzování, vlastní formát dotazů

🗄️ Databázové návrhové vzory a persistence dat

Typy úložišť:

  • Memory storage – rychlé, ale po restartu ztraceno. Vhodné pro cache, krátkodobou session (Redis, SQLite in-memory).
  • Souborový systém – problém s konkurenčním přístupem (zamykání), pomalý zápis. Vhodné pro session, statická data (DokuWiki).
  • Relační DB – ACID transakce, správa zámků, distribuovatelné. (MySQL, PostgreSQL, MSSQL)
  • Nerelační (NoSQL) DB – klíč-hodnota, dokumentová, grafová. (Redis, MongoDB, Neo4J)

Vzory přístupu k databázi:

VzorPrincipPříklad
Active RecordObjekt = řádek v DB; objekt obsahuje i metody pro práci s DB (load, save, delete)$article = Article::load(42); $article->save();
Data MapperOddělená business data a logika ukládání; Mapper (Repository) řeší persistenci; lze snadno vyměnit za jiný druh úložiště$article = $mapper->load(42); $mapper->save($article);
Unit of WorkFronta změn; změny se provedou najednou v jedné transakci při flush()$manager->persist($a); $manager->remove($b); $manager->flush();
Okruh 3 · BI-WI.21-19

Bezpečnost webových aplikací. Rizika a jejich opatření. Autentizace a autorizace uživatele.

OWASP Top 10, konkrétní typy útoků (SQL Injection, XSS, CSRF, Session Stealing), metody autentizace a druhy autorizace s jejich implementací.

🛡️ Základní pojmy bezpečnosti webových aplikací

Bezpečnost webové aplikace zahrnuje: znát hrozby, zabezpečit všechny kanály (síť, hostitel, aplikace), detekovat hrozby (logovat, zpracovat) a vyvíjet bezpečně od začátku.
PojemDefinice
ZdrojChráněná informace nebo funkcionalita v aplikaci
HrozbaPotenciální negativní efekt (ztráta dat, nedostupnost, …)
ZranitelnostChyba v aplikaci, která je předpokladem pro realizaci hrozby
ÚtokAkce využívající zranitelnost k poškození zdrojů
OpatřeníOchrana implementovaná proti konkrétní hrozbě

📋 OWASP Top 10 – přehled verzí

OWASP (Open Web Application Security Project) – nezisková organizace vydávající seznam nejkritičtějších bezpečnostních rizik webových aplikací.
#OWASP 2010OWASP 2017
1InjectionInjection
2XSSBroken Authentication
3Broken Auth & Session MgmtSensitive Data Exposure
4Insecure Direct Object ReferencesXML External Entities (XXE)
5CSRFBroken Access Control
6Security MisconfigurationSecurity Misconfiguration
7Insecure Cryptographic StorageXSS
8Failure to Restrict URL AccessInsecure Deserialization
9Insufficient Transport Layer ProtectionUsing Components with Known Vulnerabilities
10Unvalidated Redirects and ForwardsInsufficient Logging & Monitoring

Injection je stále na prvním místě. XSS kleslo ze 2. na 7. místo v 2017 (lepší frameworky). CSRF zcela vypadlo z top 10 v 2021 (SameSite cookie to výrazně zmírňuje).

💉 SQL Injection – princip, příklad, ochrana

SQL Injection – útočník vloží SQL kód do vstupu, který je nekontrolovaně vložen do SQL dotazu, a tím změní jeho chování.

Nebezpečný kód:

$query = "SELECT * FROM course WHERE abbrev = '$_GET[abbrev]';";

Pokud útočník zadá jako hodnotu ' OR 1=1 OR abbrev = ', vznikne:

SELECT * FROM course WHERE abbrev = '' OR 1=1 OR abbrev = '';

Výsledek: vrátí se všechny záznamy. Útočník může získat citlivá data, poznat architekturu nebo data zničit.

Ochrana:

  • Validace vstupu – ověřit datové typy a formáty
  • Escapování – relativně náchylné na chybu, vždy využívat frameworky (ne vlastní implementaci)
  • Prepared Statements (parametrizované dotazy) – nejlepší ochrana; dotaz se odešle na SQL engine ODDĚLENĚ od dat, engine sám rozliší kód a data
$stmt = $pdo->prepare("SELECT * FROM course WHERE abbrev = ?");
$stmt->execute([$_GET['abbrev']]);

Remote Code Execution

Remote Code Execution (RCE) – spuštění útočníkova kódu v kontextu naší aplikace. Problém dynamických jazyků (PHP, Python, …).

Zranitelný kód:

include_once("pages/" . $_GET['page'] . ".php");

Útočník zadá ../config/database → načte se konfigurační soubor. Nebo vzdálené URL.

Ochrana:

  • Nikdy nekompilovat/vykonávat vstup od uživatele
  • Používat whitelist povolených hodnot:
switch ($_GET['page']) {
    case 'homepage': case 'detail': case 'contacts':
        include_once("pages/$_GET[page].php"); break;
    default: include_once("pages/404.php"); break;
}

🔴 Cross-Site Scripting (XSS)

XSS – injekce JavaScriptu do webové stránky; útočníkův skript se spouští v bezpečnostním kontextu dané stránky s plnou důvěrou prohlížeče.

Typy XSS:

  • Dočasný (Reflected) XSS – škodlivý kód je součástí URL nebo cookie; ohrožuje jen konkrétního uživatele
  • Perzistentní (Stored) XSS – škodlivý kód je uložen v databázi (komentář, uživatelský profil); ohrožuje všechny uživatele

Příklad zranitelného kódu (PHP):

echo "<p>$comment</p>";

Pokud comment obsahuje <script>window.location='https://utocnik.cz'</script>, spustí se útočníkův kód.

Ochrana:

  • Escapování výstupu – nejdůležitější; různé kontexty vyžadují různé escapování (HTML, JS, CSS, URL)
  • Validace vstupu – odmítat nebezpečné znaky na vstupu
  • Content Security Policy (CSP) – HTTP hlavička omezující, odkud se smí načítat skripty
  • HttpOnly cookie – JavaScript nemůže číst session cookie, čímž zabrání session stealing přes XSS

🔀 Cross-Site Request Forgery (CSRF)

CSRF – útok, při kterém útočník přiměje prohlížeč přihlášeného uživatele odeslat nežádoucí požadavek na důvěřující web. Server důvěřuje přihlášenému uživateli, ale požadavek nepochází od něj.

Příklad: uživatel je přihlášen na bankovním webu. Útočník ho naláká na stránku s:

<img src="http://vase-banka.cz/posli.php?kam=MUJUCET&kolik=10000" />

Prohlížeč automaticky přiloží cookies (session ID) → banka považuje požadavek za legitimní.

Ochrana:

  • Anti-CSRF token (XSRF token) – server vygeneruje unikátní token uložený v session a ve skrytém poli formuláře; při POST se porovnají; útočník token nezná
  • Kontrola hlavičky Referer/Origin – ne 100% (dá se podvrhnout), ale pomáhá
  • SameSite cookie – moderne cookies se neposílají při cross-site požadavcích
  • Více-faktorové ověření – u důležitých akcí vyžadovat extra faktor
  • Důsledné dodržování HTTP metod – GET nikdy nesmí mít vedlejší efekty (ale nechrání samo o sobě)

🔑 Session Stealing

Session Stealing – útočník získá Session ID a tím převezme identitu přihlášeného uživatele.

Způsoby krádeže Session ID:

  • Session ID v URL (lze zkopírovat z odkazu)
  • Slabý generátor Session ID (inkrementální hodnoty → útočník zkusí sousední hodnoty)
  • Cookie Stealing – přes XSS útočník přečte cookie a pošle ji na svůj server
  • Cookie Cooking – útočník nastaví uživateli předem dané Session ID (session fixation)

Ochrana:

  • Dlouhé náhodné Session ID (kryptograficky bezpečný generátor)
  • Časté obnovení Session ID (zvláště po přihlášení)
  • Akceptovat pouze Session ID vygenerovaná serverem
  • Cookies s atributem HttpOnly a Secure
  • Šifrování transportní vrstvy (HTTPS)
  • Doplňkové ověření: IP adresa, User-Agent, Referer, nonce

⚠️ Další bezpečnostní hrozby

  • Replay Attack – opakování dříve zachycených validních požadavků; ochrana: nonce (číslo použitelné jen jednou), časová razítka
  • Denial-of-Service (DoS) – snaha znepřístupnit zdroj zahlcením požadavky nebo zneužitím nákladné operace; DDoS = distribuovaná verze. Prevence: firewall, rate limiting, CAPTCHA, CDN.
  • Hesla – zásady ukládání:
    • Nikdy plain-text!
    • Vždy silný hash (bcrypt, Argon2, scrypt) – ne MD5 nebo SHA1
    • Vždy salt (náhodná hodnota přidaná před hashováním) – chrání před rainbow tables
    • Předávání pouze přes HTTPS
    • Změna hesla: vždy znovu ověřit identitu, ideálně dvoufaktorově

🔐 Autentizace – identifikace a ověření identity

Autentizace – proces identifikace uživatele a ověření jeho identity (kdo jsi?).

Faktory autentizace:

  • Něco víš (Something you know) – heslo, PIN, ověřovací otázka
  • Něco máš (Something you have) – telefon (SMS, authenticator app), hardware token (USB, smart card), certifikát
  • Někým jsi (Something you are) – otisk prstu, duhovka, DNA

Druhy autentizace ve webových aplikacích:

MetodaPrincipBezpečnost
HTTP BasicBase64(user:pass) v Authorization hlavičce; posílá se při každém požadavkuBase64 není šifrování; bez HTTPS je snadno odposlechnutelné. V praxi vždy HTTPS.
HTTP DigestMD5 hash hesla + nonce místo plaintextuMD5 je slabé. Stále nutné HTTPS.
Přihlašovací formulářVlastní implementace; informace o přihlášení uložena v cookie (session ID)Hesla solit a hashovat (bcrypt). Nutné HTTPS.
API klíčNáhodný, neuhodnutelný token v hlavičce nebo parametruMusí být přes HTTPS, odvolatelný. Vhodné pro aplikace.
OAuth 2.0Delegace přístupu přes třetí stranu (Google, GitHub); access token + refresh tokenKomplexní, ale bezpečný. Standard pro „Login přes Google".

Více-faktorové ověřování (MFA/2FA):

  • Kombinuje alespoň dva různé faktory
  • Vhodné vrstvit dle citlivosti operace: čtení (0 faktorů) → běžné operace (1 faktor) → důležité akce (2+ faktory)
  • Vždy hledat kompromis mezi bezpečností a uživatelskou přívětivostí

🔓 Autorizace – ověření oprávnění

Autorizace – proces ověření, zda má uživatel oprávnění provést danou akci nebo přistoupit k danému zdroji (co smíš dělat?).
Autentizace vs. Autorizace – klíčový rozdíl

Autentizace = proces identifikace (kdo jsi?). Autorizace = proces udělení oprávnění (co smíš?). Autentizace předchází autorizaci. Existuje i autorizace bez autentizace (geolokace, souhlas s podmínkami).

Typy autorizace:

  • Geolokace (IP adresa, GPS) – geografické omezení přístupu
  • Věk – ověření věku dotazníkem při vstupu
  • Souhlas – souhlas s licenčními podmínkami
  • Preference – výběr uživatelského profilu (domácnosti vs. firmy)
  • Autentizace – přihlášení jako základ autorizace

Implementační vzory autorizace:

VzorPrincipVhodné pro
Role (RBAC) Statické přiřazení práv rolím; hasRole(ADMIN); plochá nebo hierarchická struktura rolí Jednoduché aplikace s jasně danými rolemi
Voter Rozhodování na základě vazby uživatel–entita; canEdit(article, user) Oprávnění vázaná na konkrétní objekt (autor článku)
ACL (Access Control List) Komplexní přiřazení; statické i dynamické; hierarchické nebo grafové; kombinace role + voter Komplexní enterprise systémy s jemnou granularitou

Implementace přístupu – Chain of Responsibility: Požadavek prochází řetězem kontrol: geolokace → ověření věku → souhlas s podmínkami → autentizace → autorizace. Každý článek řetězu buď propustí nebo odmítne požadavek.

Okruh 4 · BI-WI.21-20

Základní postupy, technologie a standardy na straně klienta. Asynchronní zpracování požadavků webovým prohlížečem (AJAX), jeho výhody a nevýhody.

HTML5, CSS3, JavaScript/ECMAScript, DOM a události, AJAX a způsoby komunikace, Single Page Application vs. MPA, moderní přístupy (PWA, WebSockets).

📄 HTML5 – sémantika a struktura dokumentu

HTML (HyperText Markup Language) – značkovací jazyk pro strukturování dokumentů na webu. HTML5 je živý standard (Living Standard) spravovaný WHATWG.

Základní struktura HTML dokumentu:

  • <!DOCTYPE html> – deklarace typu dokumentu
  • <html lang="cs"> – kořenový element s jazykem
  • <head> – metadata: charset, viewport, title, styly, skripty
  • <body> – obsah stránky

Dělení elementů:

  • Blokové – zabírají celý řádek; h1–h6, p, div, ul, ol, table, form, blockquote, pre, address, hr
  • Řádkové – součást textu; a, span, strong, em, img, input, label, button, abbr, code, kbd
  • Bezvýznamové (Generic containers) – div (blokový), span (řádkový); nenesou sémantiku, pouze strukturují

Sémantické elementy HTML5:

  • <main> – hlavní obsah dokumentu
  • <article> – celistvá část dokumentu (novinka, komentář)
  • <section> – tematická sekce (blok komentářů)
  • <header> – záhlaví stránky nebo sekce
  • <nav> – navigační oblast
  • <aside> – vedlejší informace (sidebar, poznámky autora)
  • <footer> – zápatí stránky nebo sekce

Proč sémantika? Prohlížeč, vyhledávače i čtečky obrazovky lépe rozumí obsahu → lepší SEO, accessibility, outline dokumentu.

Formuláře v HTML5 – nové atributy a typy:

  • Nové typy inputu: email, tel, url, date, time, number, range
  • Nové atributy: required, pattern, min/max, placeholder, autocomplete
  • Metoda GET: data v URL (jen ASCII, idempotentní). Metoda POST: data v těle (binární data, multipart/form-data).

🎨 CSS – Kaskádové styly a kaskáda

CSS (Cascading Style Sheets) – jazyk popisující vizuální prezentaci HTML dokumentu. HTML = struktura, CSS = vzhled.

Selektory a specificita:

  • * – univerzální (0,0,0,0)
  • E – element (0,0,0,1)
  • .class – třída, atribut, pseudo-třída (0,0,1,0)
  • #id – identifikátor (0,1,0,0)
  • style="" – inline styl (1,0,0,0)
  • !important – přepíše vše (použít jen výjimečně)

Kaskáda – pořadí priority:

  1. Nalezni všechny deklarace vztahující se k elementu
  2. Seřaď dle důležitosti: UA → uživatel → autor → autor !important → uživatel !important
  3. Při rovnosti: seřaď dle specificity selektoru
  4. Při rovnosti: pozdější deklarace vítězí

Box model:

  • contentpaddingbordermargin
  • box-sizing: content-box (default) – width/height = jen obsah; padding/border se přičítají navíc
  • box-sizing: border-box – width/height zahrnuje i padding a border; intuitivnější

Moderní CSS3 layout:

  • Flexbox (display: flex) – jednorozměrné rozvrhování (řádek nebo sloupec)
  • Grid (display: grid) – dvourozměrné rozvrhování (řádky i sloupce)
  • Media Queries – adaptivní/responzivní design pro různá zařízení

CSS metodiky (konvence pojmenování):

  • BEM (Block Element Modifier) – .btn, .btn__icon, .btn--primary
  • OOCSS (Object-Oriented CSS) – oddělit strukturu od skinu, kontejner od obsahu
  • SMACSS – base, modules, layout (.l-content), state (.is-opened), theme

⚙️ JavaScript, ECMAScript a DOM

ECMAScript – standardizovaný jazyk pro skriptování (ECMA-262). JavaScript je implementace ECMAScript pro prohlížeče. Dynamicky typovaný, funkcionální, prototypový jazyk.

Vlastnosti JavaScriptu:

  • Imperativní syntaxe podobná Javě/C
  • Dynamicky typovaný (run-time evaluation)
  • Funkcionální – vnořené funkce, closures, lambda (arrow functions)
  • Prototypová dědičnost
  • Run-time prostředí: DOM (v prohlížeči), Node.js (na serveru)

Načítání JS do HTML:

  • Klasicky v <head> – blokuje parsování HTML (starý přístup)
  • async – stáhne asynchronně, spustí hned po stáhnutí (i za parsování HTML)
  • defer – stáhne asynchronně, spustí až po naparsování celého dokumentu (doporučeno)

DOM (Document Object Model):

  • Model reprezentující HTML dokument jako stromovou strukturu
  • Nezávislý na platformě/jazyku; standardizovaný W3C
  • Verze: DOM Level 1 (1998), Level 2 – getElementById() (2000), Level 3 – XPath, keyboard events (2004)

DOM události a jejich tok:

  • Capture fáze – událost prochází od rootu dolů k cílovému elementu
  • Bubble fáze – událost probublává od cílového elementu zpět k rootu
  • Registrace: addEventListener('click', handler, false) (false = bubble, true = capture)
  • Vícenásobná registrace posluchačů je možná (na rozdíl od onclick = ...)

Kdy registrovat události:

  • DOMContentLoaded – HTML naparsován, deferred skripty spuštěny; vhodné pro registraci event listenerů
  • window.load – veškerý obsah (obrázky, videa) načten; vhodné pro dynamický obsah závislý na zdrojích

🔁 AJAX – Asynchronous JavaScript and XML

AJAX – není samostatná technologie, ale množina technologií umožňující asynchronní komunikaci se serverem bez nutnosti plného znovunačtení stránky. Klíčová technologie: XMLHttpRequest (dnes spíše Fetch API).

Technologie AJAX:

  • HTML + CSS – prezentace
  • DOM – manipulace se stránkou
  • XML nebo JSON – výměna dat
  • JavaScript + XMLHttpRequest/Fetch API – asynchronní komunikace a propojení

Jak AJAX funguje – princip:

  1. Uživatel provede akci (klik, scrollování, …)
  2. JavaScript zachytí událost a vytvoří HTTP požadavek (XHR nebo fetch)
  3. Požadavek jde na server asynchronně – stránka zůstává použitelná
  4. Server vrátí data (JSON, HTML fragment, XML)
  5. JavaScript zpracuje odpověď a aktualizuje DOM (jen změněnou část)
Výhody AJAX
  • Zkrácení odezvy – načítá se jen změněná část, uživatel méně čeká
  • Méně přenášených dat – v jednom požadavku se posílá jen potřebné
  • Úspora zdrojů na serveru – server přepočítává jen změnu, ne celou stránku
  • Lepší UX – plynulé interakce bez blikání (výměna celé stránky)
Nevýhody AJAX
  • Komplikovanější práce s historií prohlížeče – nutno použít fragment URL nebo History API (pushState)
  • Problematičtější záložky – URL se nemění, stav nelze záložkovat bez extra implementace
  • Indexace JS obsahu může být omezená – část crawlerů JavaScript zpracuje omezeně nebo se zpožděním, takže obsah načtený až přes AJAX může mít horší SEO
  • Uživatel může mít JS zakázán – aplikace nemusí fungovat
  • Vyšší počet HTTP požadavků – každá interakce = nový požadavek
  • Složitější kód – asynchronní logika je komplexnější na psaní a debugování

Způsoby AJAX komunikace:

  • Short Polling – klient se pravidelně ptá serveru (např. každých 5 s); jednoduché, ale neefektivní
  • Long Polling – klient odešle požadavek, server drží připojení otevřené, dokud nemá nová data; po odpovědi klient hned pošle nový
  • Streaming / Chunked Response – server posílá data postupně v jednom dlouhém spojení
  • WebSockets – trvalé obousměrné spojení (viz níže)
  • Server-Sent Events (SSE) – jednosměrné (server → klient) real-time push notifikace

📱 Single Page Application (SPA) vs. Multi Page Application (MPA)

SPA – aplikace, kde se při navigaci nemění celá stránka, ale jen část DOM; větší část logiky běží na klientovi.
AspektMPA (tradiční)SPA
NavigaceFull-page reloadJen aktualizace DOM
Rychlost po načteníPomalejšíRychlejší odezva
Prvotní načteníRychléPomalejší (celá aplikace najednou)
SEODobré (crawleři vidí HTML)Problematické (nutný SSR)
Historie prohlížečeNativníNutno řešit (History API)
Přístup k datůmServer vrací HTMLPřes API (REST, GraphQL)

SPA výhody:

  • Jen jedno prvotní načtení statických souborů
  • Rychlejší responsivita – přijdou jen data, ne celé HTML
  • Přívětivější UX (plynulé přechody)

SPA nevýhody:

  • JS-only – bez JS aplikace nefunguje (nutný SSR pro přístupnost a SEO)
  • Při špatné implementaci pomalejší než MPA
  • Typické problémy JS/AJAX: history, bezpečnostní skenování
  • Aktualizace aplikace za běhu – nutno přenačíst celou SPA

SPA frameworky: React, Angular, Vue.js, Ember, Backbone, Svelte

🔌 WebSockets a moderní přístupy

WebSocket – protokol umožňující trvalé obousměrné (full-duplex) spojení mezi klientem a serverem. Vhodný pro real-time aplikace.

Princip navázání spojení: HTTP-first → WebSocket protocol upgrade (101 Switching Protocols) → přepnutí na WS protokol

  • Hlavičky se posílají jen jednou (při upgrade)
  • Trvalé statefull spojení (na rozdíl od bezestavového HTTP)
  • Nutno implementovat vlastní aplikační protokol nad WS
  • Vyžaduje speciální server pro zpracování (např. Node.js, Ratchet)

Události WebSocket: open (spojení navázáno), message (přijata zpráva), close (ukončeno), error (chyba)

Vhodné použití: hry, chaty, burzovní aplikace, monitoring, streaming

Progressive Web Application (PWA):

  • Webová aplikace dodávaná přes web, tvářící se jako nativní aplikace
  • Lze nainstalovat na zařízení, nemusí se spouštět v prohlížeči (prohlížeč je schován na pozadí)
  • Technologie: Web App Manifest (název, ikona, start URL, display mode) + Service Workers
  • Service Workers – proxy mezi aplikací a sítí; nemají přístup k DOM; zajišťují: cachování (offline fungování), push notifikace, background sync
  • Podpora: Chromium (nejlepší), Safari (omezená), Firefox (minimální)

Web Storage API:

  • localStorage – persistentní, sdílí se mezi okny stejné aplikace, bez expirace
  • sessionStorage – omezený lifetime (jen aktuální okno/tab)
  • Cookies: max 4 kB, Web Storage: max 5–10 MB
  • IndexedDB – NoSQL databáze v prohlížeči; ukládání JSON, téměř neomezená velikost; vhodné pro offline cache

🚀 Rapid Application Development (RAD) a SPA frameworky

Cíl: pracovat s minimálním úsilím, věnovat čas logice, ne opakujícímu se kódu.

CSS frameworky:

  • Obecné – Bootstrap, Bulma, Foundation (hotové komponenty)
  • Utility-first – Tailwind, Materialize (kombinace utility tříd)
  • Classless – aplikuje styly přímo na HTML elementy bez tříd (HTML-first přístup)
  • Lightweight – Pure.css, Milligram, Skeleton (minimální footprint)

JS support knihovny (alternatívy k SPA):

  • Alpine.js – „Vue.js v HTML atributech"; reaktivita bez build step
  • Hotwire (Turbo + Stimulus) – Rails ekosystém; Turbo Drive nahrazuje full-reload za AJAX, Turbo Frames přenačítá jen bloky, Stimulus definuje komponenty v JS odděleně od HTML

Verzovací modely (Git workflows):

  • Git Flow – robustní, větve pro feature/release/hotfix; vhodné pro verzované software
  • GitHub Flow – jednodušší; main je vždy deployable; feature větve + pull request + code review
  • GitLab Flow – kombinace, environment větve
  • One Flow – lineární historie, žádná develop větev, základ je rebase

Sémantické verzování (SemVer):

  • Formát: MAJOR.MINOR.PATCH (např. 1.2.3)
  • MAJOR – zpětně nekompatibilní změny
  • MINOR – přidání funkce se zachováním kompatibility
  • PATCH – oprava chyby se zachováním kompatibility
  • Konvence rozsahů: ^1.2.3 = >=1.2.3 <2.0.0, ~1.2.3 = >=1.2.3 <1.3.0