Zkratka proHyperText Transfer Protocolhá té té péTakéHTTP/1.1, HTTP/2, HTTP/3, hypertextový přenosový protokolZákladní
Definice
HTTP je aplikační protokol, kterým si klient (prohlížeč, mobilní aplikace, skript) a server vyměňují požadavky a odpovědi na webu. Klient pošle metodu, cílovou adresu a hlavičky, server vrátí stavový kód, hlavičky a případné tělo odpovědi. Protokol je bezstavový: každý požadavek stojí sám o sobě a stav se drží pomocí cookies nebo tokenů.
Co si klient a server vlastně vymění
HTTP definuje tvar jedné výměny zpráv. Klient odešle požadavek: metodu (GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS), cílovou cestu, verzi protokolu a sadu hlaviček. Server odpoví stavovým kódem, vlastními hlavičkami a obvykle tělem: HTML, JSON, obrázkem. Hlavičky nesou metadata, která rozhodují o většině reálného chování: Content-Type určuje formát, Authorization nese přihlášení, Cache-Control říká, jak dlouho smí být odpověď uložená v cache.
Proč je bezstavovost výhoda i problém
HTTP nedrží mezi požadavky žádnou paměť. Server po odeslání odpovědi nemusí o klientovi nic vědět, což je důvod, proč lze provoz rozprostřít přes desítky strojů za load balancerem a přidávat instance podle zátěže. Cenou je, že přihlášení, košík nebo jazyková volba se musí přenášet znovu s každým požadavkem: typicky cookie nebo bearer tokenem v hlavičce. Odtud plyne i klasická chyba: stav uložený v paměti jedné instance se po přesměrování na jinou instanci ztratí.
Skupiny stavových kódů
Stavový kód je první informace, kterou při ladění čtete. Rozsah 2xx znamená úspěch (200 OK, 201 Created, 204 No Content). Rozsah 3xx je přesměrování, kde záleží na trvalosti: 301 a 308 jsou permanentní a mění to, co si zapamatují vyhledávače, 302 a 307 jsou dočasné. Rozsah 4xx označuje chybu na straně klienta (400, 401, 403, 404, 429), rozsah 5xx selhání serveru (500, 502, 503, 504). Rozdíl mezi 401 a 403 je častý zdroj zmatku: první znamená „neznám tě“, druhý „znám tě, ale nesmíš“.
Čím se liší HTTP/1.1, HTTP/2 a HTTP/3
Sémantika metod, kódů a hlaviček je ve všech verzích stejná; liší se způsob přenosu po drátě. HTTP/1.1 posílá textové zprávy po jednom TCP spojení a další požadavek čeká na dokončení předchozího, takže prohlížeče otevíraly víc spojení najednou. HTTP/2 přidalo binární rámce, multiplexování více streamů v jednom spojení a komprimaci hlaviček. HTTP/3 přesunulo přenos na QUIC nad UDP, čímž odpadlo blokování hlavou fronty na úrovni TCP a zrychlilo se navazování spojení.
Metody, idempotence a bezpečnost
Specifikace rozlišuje metody bezpečné (jen čtou, typicky GET a HEAD) a idempotentní (opakované provedení má stejný efekt jako jedno: PUT, DELETE). POST ani jedno není, proto se u plateb a objednávek doplňuje idempotenční klíč. Samotné HTTP navíc nešifruje: důvěrnost a integritu dodává až TLS, tedy HTTPS, které je dnes pro moderní API i prohlížečové funkce prakticky povinné.
Příklady z praxe
Syrový požadavek a odpověď HTTP/1.1
Když do prohlížeče zadáte adresu, odejde textový požadavek se jménem hostitele a hlavičkami. Server vrátí stavový řádek, hlavičky a tělo. Stejnou výměnu si můžete vynutit ručně přes telnet nebo curl a přesně vidět, co obě strany poslaly.
GET /clanky/http HTTP/1.1 Host: webzi.cz Accept: text/html Accept-Encoding: gzip HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Cache-Control: public, max-age=300 Content-Length: 4821Podmíněný požadavek ušetří přenos dat
Server u odpovědi vrátí ETag. Při dalším načtení pošle prohlížeč hlavičku If-None-Match s touto hodnotou. Pokud se obsah nezměnil, server odpoví 304 Not Modified bez těla a klient použije uloženou kopii. U obrázků a statických skriptů to typicky ušetří většinu přenesených bajtů.
GET /assets/app.js HTTP/1.1 Host: webzi.cz If-None-Match: "9f2a4c1" HTTP/1.1 304 Not Modified ETag: "9f2a4c1" Cache-Control: public, max-age=31536000, immutable
Časté omyly
- MýtusGET požadavek nemůže nic rozbít, jen čte data.
- Ve skutečnostiBezpečnost metody GET je smluvní pravidlo specifikace, ne technická pojistka. Pokud si aplikace naprogramuje mazání přes odkaz s GET, smaže data i prohlížečový prefetch nebo crawler. Změnové operace patří pod POST, PUT, PATCH nebo DELETE.
- MýtusHTTP/2 a HTTP/3 jsou nové protokoly, takže se musí přepsat API.
- Ve skutečnostiNovější verze HTTP mění jen způsob přenosu zpráv po síti. Metody, stavové kódy, hlavičky i sémantika požadavků zůstávají stejné, takže aplikační kód se obvykle nemění vůbec a upgrade se řeší na úrovni serveru nebo CDN.
- MýtusHTTPS je jiný protokol než HTTP.
- Ve skutečnostiHTTPS je totéž HTTP, jen přenášené uvnitř šifrovaného TLS spojení. Metody, kódy i hlavičky jsou identické, přibývá jen šifrování, ověření identity serveru certifikátem a ochrana proti změně dat na cestě.
Časté dotazy
- Jaký je rozdíl mezi stavovými kódy 401 a 403?
- Stavový kód 401 Unauthorized znamená, že server požadavek neověřil: chybí přihlašovací údaje nebo je token neplatný či vypršelý. Odpověď by měla obsahovat hlavičku WWW-Authenticate s tím, jaké ověření server očekává. Kód 403 Forbidden naopak znamená, že identita je známá a platná, jen daný uživatel nemá k prostředku oprávnění. Opakované poslání stejných údajů u 403 nepomůže, u 401 ano, pokud se klient přihlásí správně. Praktické pravidlo: 401 řeší přihlášení, 403 řeší role a oprávnění.
- Kdy se hodí přejít z HTTP/1.1 na HTTP/2 nebo HTTP/3?
- Přechod na HTTP/2 dává největší smysl u stránek, které načítají hodně malých souborů: skripty, styly, ikony, obrázky. Multiplexování odstraní čekání ve frontě a komprese hlaviček sníží režii opakovaných cookies. HTTP/3 nad QUIC pomáhá hlavně na nespolehlivých mobilních sítích, kde ztráta jednoho paketu neblokuje ostatní streamy, a při rychlém navazování spojení. U jednoduchého API s malým počtem velkých odpovědí je rozdíl menší. Podporu obvykle zapnete na úrovni reverzní proxy nebo CDN, aplikační kód zůstává beze změny.
- Jak HTTP udržuje přihlášeného uživatele, když je bezstavové?
- HTTP samo o sobě mezi požadavky nic nepamatuje, stav se proto přenáší v každém požadavku znovu. Nejčastěji server po přihlášení vystaví session cookie, kterou prohlížeč automaticky posílá v hlavičce Cookie u dalších požadavků na stejnou doménu. Alternativou u API je bearer token v hlavičce Authorization, typicky JWT. Server pak podle identifikátoru dohledá relaci v databázi nebo si ověří podpis tokenu. Cookies je vhodné označit atributy HttpOnly, Secure a SameSite, jinak jsou zneužitelné skriptem na stránce nebo přes cizí web.
- Co znamenají hlavičky Cache-Control a ETag pro rychlost webu?
- Hlavička Cache-Control určuje, jestli a jak dlouho smí prohlížeč nebo CDN odpověď uchovat. Hodnota max-age s vysokým číslem se hodí pro soubory s hashem v názvu, protože se jejich obsah nikdy nemění. ETag je otisk konkrétní verze obsahu: klient ho vrátí v hlavičce If-None-Match a server může odpovědět 304 Not Modified bez těla. Kombinace obojího snižuje objem přenášených dat i latenci a přímo se promítá do metrik načítání stránky. Chybějící cache hlavičky patří mezi nejčastější příčiny zbytečně pomalého webu.
- Proč je špatný nápad posílat data měnící stav přes metodu GET?
- Metoda GET je ve specifikaci definovaná jako bezpečná, což znamená, že by neměla měnit stav na serveru. Prohlížeče, proxy servery i vyhledávací roboti na to spoléhají: odkazy si předběžně načítají, ukládají do cache a opakují je při obnovení stránky. Pokud se za GET odkazem skrývá mazání nebo platba, operace se provede bez záměru uživatele. Parametry v URL navíc končí v logách serveru, v historii prohlížeče a v hlavičce Referer, takže se přes GET nemají posílat ani hesla nebo tokeny.
Zdroje
- RFC 9110: HTTP Semantics(otevře se v novém okně)
- RFC 9112: HTTP/1.1(otevře se v novém okně)
- RFC 9114: HTTP/3(otevře se v novém okně)
- HTTP(otevře se v novém okně)
- Hypertext Transfer Protocol (HTTP) Status Code Registry(otevře se v novém okně)