
Každý obrázok, každý štýl aj každý článok, ktorý čítate, prišiel do prehliadača ako odpoveď na otázku v jazyku HTTP. Je to jeden z mála internetových protokolov, ktoré si človek dokáže prečítať aj bez nástrojov – je textový, stručný a po rokoch používania až prekvapivo logický. Kto ho raz pochopí, rozumie polovici problémov, s ktorými sa na webe stretáva.
Otázka a odpoveď, nič viac
HTTP (Hypertext Transfer Protocol) funguje na princípe požiadavka – odpoveď. Klient, zvyčajne prehliadač, pošle požiadavku. Server odpovie. Spojenie samo o sebe nič nepamätá: každá požiadavka musí niesť všetko, čo server potrebuje vedieť. Hovorí sa tomu bezstavovosť. Ak si server má pamätať, že ste prihlásení, musí si prehliadač tú informáciu nosiť so sebou – najčastejšie v cookie.
Celú cestu od zadania adresy po zobrazenie stránky rozoberáme v článku Čo sa stane od zadania adresy po zobrazenie stránky.
Takto vyzerá jednoduchá požiadavka v podobe HTTP/1.1:
GET /historia-webu/ HTTP/1.1
Host: worldwideweb.sk
Accept-Language: sk,cs;q=0.8
Accept-Encoding: gzip, br
Prvý riadok obsahuje metódu, cestu a verziu. Nasledujú hlavičky. Hlavička Host je povinná, pretože na jednej IP adrese dnes bežne beží desiatky webov a server musí vedieť, ktorý z nich chcete. A odpoveď:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Cache-Control: max-age=600
Content-Encoding: br
<!doctype html>…
Metódy: čo od servera chcem
Norma RFC 9110 definuje osem metód. V bežnom živote stretnete hlavne tieto:
- GET – daj mi zdroj. Najčastejšia metóda, prehliadač ju používa pri každom kliknutí na odkaz.
- POST – spracuj tieto dáta. Odoslanie formulára, objednávka, komentár.
- PUT a DELETE – nahraď, resp. odstráň zdroj. Typické pre API, napríklad REST rozhranie WordPressu.
- HEAD – to isté ako GET, ale bez tela. Hodí sa na kontrolu, či stránka existuje.
- OPTIONS – aké možnosti má tento zdroj. Prehliadač ho posiela pri kontrolách CORS.
Dôležité sú dve vlastnosti. Bezpečná metóda (GET, HEAD, OPTIONS) nemá nič meniť. Idempotentná metóda (okrem bezpečných aj PUT a DELETE) má rovnaký výsledok, či ju pošlete raz alebo päťkrát. POST idempotentná nie je – preto sa prehliadač pri obnovení stránky po odoslaní formulára pýta, či ho naozaj chcete poslať znova. Z praxe: ak niekto spraví odkaz „zmazať“ ako obyčajné GET, skôr či neskôr mu obsah zmaže vyhľadávací robot, ktorý odkazy len prechádza.
Stavové kódy: odpoveď v troch čísliciach
Prvá číslica kódu určuje triedu:
- 1xx – informačné. Napríklad
103 Early Hints, ktorým server prehliadaču napovie, čo si môže začať sťahovať, ešte kým odpoveď pripraví. - 2xx – úspech.
200 OK,201 Created,204 No Content. - 3xx – presmerovanie.
301je trvalé (vyhľadávače si zapamätajú novú adresu),302dočasné,304 Not Modifiedhovorí „verzia, ktorú máš v cache, je stále aktuálna“. - 4xx – chyba na strane klienta.
404 Not Found,403 Forbidden,401 Unauthorized(napriek názvu znamená „neoverený“),429 Too Many Requests. - 5xx – chyba na strane servera.
500je všeobecná,502a504zvyčajne znamenajú, že sprostredkovateľ (napríklad CDN) sa nedohovoril so serverom za ním,503je dočasná nedostupnosť.
Postreh z prevádzky webov: najzradnejšia je stránka, ktorá zobrazí „Stránka neexistuje“, ale vráti kód 200. Pre človeka je to chyba, pre vyhľadávač plnohodnotná stránka. Google takéto prípady označuje ako „soft 404“ a oplatí sa ich v Search Console hľadať.
Hlavičky robia väčšinu práce
Telo odpovede je obsah, ale správanie webu určujú hlavičky. Content-Type hovorí, či ide o HTML, obrázok alebo JSON. Cache-Control rozhoduje, ako dlho si prehliadač či CDN môže odpoveď ponechať. Set-Cookie ukladá cookies. Location pri presmerovaní nesie novú adresu. Bezpečnostné hlavičky ako Strict-Transport-Security alebo Content-Security-Policy obmedzujú, čo prehliadač smie urobiť. Ak chcete vedieť, ako je nejaký web nastavený, hlavičky vám o ňom povedia viac než zdrojový kód stránky.
Cache: najrýchlejšia požiadavka je tá, ktorá sa nepošle
HTTP má od začiatku zabudovanú myšlienku, že odpoveď sa dá použiť opakovane. Server v hlavičke Cache-Control určí, ako dlho je odpoveď „čerstvá“ – napríklad max-age=600 znamená desať minút. Počas tejto doby prehliadač na server vôbec nejde. Keď čas uplynie, nemusí sťahovať všetko znova: pošle podmienenú požiadavku s hlavičkou If-None-Match (obsahuje značku ETag z predchádzajúcej odpovede) alebo If-Modified-Since. Ak sa nič nezmenilo, server odpovie krátkym 304 Not Modified bez tela. Pri obrázkoch a štýloch je to obrovská úspora. Opačný problém poznáte z praxe tiež: upravíte CSS a návštevníci stále vidia staré, pretože ho majú v cache. Preto sa k súborom pridáva verzia do názvu alebo parametra.
Od jedného riadku po QUIC
Prvá verzia, dnes nazývaná HTTP/0.9, vznikla v CERN-e v rokoch 1990–1991 spolu s prvým webovým serverom Tima Bernersa-Leeho. Poznala jedinú metódu GET, žiadne hlavičky a vracala len HTML. HTTP/1.0 (RFC 1945, 1996) pridal hlavičky, stavové kódy a iné typy obsahu ako HTML. HTTP/1.1 (prvýkrát RFC 2068 v roku 1997) priniesol trvalé spojenia, povinnú hlavičku Host a lepšiu prácu s cache – a vydržal ako hlavná verzia takmer dve desaťročia.
HTTP/2 (RFC 7540, 2015, dnes RFC 9113) zachoval význam správ, ale zmenil spôsob prenosu: namiesto textu binárne rámce a viac súbežných požiadaviek v jednom spojení. HTTP/3 (RFC 9114, 2022) presunul HTTP z TCP na QUIC, ktorý beží nad UDP. Stratený paket tak zdrží len jeden prúd dát, nie všetky naraz, čo pomáha najmä na mobilných sieťach.
V roku 2022 IETF celú normu upratala: význam správ, metódy a kódy, spoločné pre všetky verzie, sú v RFC 9110, cache v RFC 9111 a jednotlivé verzie v samostatných dokumentoch. Ak hľadáte odpoveď na otázku „ako sa má správať 308?“, otvorte RFC 9110 – je napísané zrozumiteľnejšie, než by ste od normy čakali.
Ako si to vyskúšať
Najjednoduchšie je nástroj curl, ktorý je dnes súčasťou Windows aj macOS. Príkaz curl -I https://worldwideweb.sk/ vypíše len stavový kód a hlavičky odpovede. V prehliadači nájdete to isté v nástrojoch pre vývojárov (F12) na záložke Network – po kliknutí na požiadavku uvidíte aj stĺpec s verziou protokolu, kde sa pri veľkých weboch dnes bežne objavuje h3.