Poslední modifikace: 2024-02-22 20:48:15 UTC
HTTP = Hypertext Transfer Protocol
protokol pro přenos objektů libovolného typu (stránky, obrázky, …) mezi webovým serverem a prohlížečem
používá se i pro odesílání formulářových dat
jednoduchý aplikační protokol vystavený nad protokolem TCP
bezstavový protokol modelu požadavek/odpověď – přináší problémy pro webové aplikace
několik verzí – HTTP 0.9, HTTP 1.0, HTTP 1.1, HTTP/2, HTTP/3
(1) navázání spojení
(2) zaslání požadavku klientem
(3) zaslání odpovědi serverem
(4) uzavření spojení
pro stránky s mnoha vloženými objekty (obrázky apod.) je tento způsob pomalý, a proto novější verze HTTP umožňují během jednoho spojení vyřídit několik požadavků/odpovědí
metoda URL_dokumentu verze_HTTP
hlavičky
prázdná_řádka
tělo_požadavku
nejběžnější – žádost o stránku, odeslání dat z formuláře metodou GET
odeslání dat z formuláře
zaslání samotných hlaviček odpovědi
uložení objektu (stránky, obrázku apod.) na dané URL
smazání objektu (stránky, obrázku apod.) z daného URL
konfigurace a analýza způsobu připojení
protokol stavový_kód stavové_hlášení
hlavičky
prázdná_řádka
obsah_odpovědi
informativní kód
úspěšné vyřízení požadavku
přesměrování
chyba klienta
chyba na straně serveru
standardní metoda
<form method="GET" …>
před odesláním prohlížeč všechna data z formuláře zakóduje do jednoho dlouhého řetězce
název1=hodnota1&název1=hodnota2&...
hodnoty polí jsou upraveny tak, aby je šlo zapsat jako součást URL
mezera → +
speciální znaky, znaky s diakritikou apod. →
%xx
, kde xx
je reprezentuje
jednotlivé bajty z textu reprezentovaného v kódování UTF-8
zakódovaná data přidána za URL požadavku (za znak ?
)
webový server typicky předá skriptu data v proměnné prostředí QUERY_STRING
většina jazyků pro psaní webových aplikací však data zpřístupní pohodlnějším způsobem
data se kódují podobně jako při použití metody GET
data se přenášejí v těle požadavku HTTP
webový server data předává skriptu na jeho standardní vstup
opět ve většině jazyků lze data číst pohodlně bez nutnosti parsovat standardní vstup
odeslání formuláře lze simulovat pomocí zadání URL adresy
vhodné pro operace, které nemění stav backendu
lze uložit do záložek, poslat emailem, …
pro větší objemy dat (nevejdou se do URL)
nutné pro operace měnící stav backendu
standardně se formuláře odesílají jako typ application/x-www-form-urlencoded
při nahrávání souborů lze používá typ multipart/form-data
metodu lze vybrat i ručně
<form action="..." method="post" enctype="multipart/form-data">
…
</form>
některé hlavičky lze použít v požadavku i v odpovědi
některé jsou specifické pro požadavek, resp. odpověď
ne všechny hlavičky jsou povinné, většina je volitelná
datum a čas požadavku/odpovědi
druh zasílaných dat
doménová adresa serveru – umožňuje správnou funkci více virtuálních serverů na jedné společné adrese
přesměrování na jinou stránku
řízení proxy serverů a vyrovnávacích pamětí
datum, kdy vyprší platnost stránky
podmíněné načtení stránky
datum poslední modifikace souboru
seznam typů dat podporovaných klientem
seznam kódování, které podporuje klient
seznam podporovaných jazyků
seznam metod, kterými je dostupný určitý objekt
identifikace klienta
identifikace serveru
adresa stránky, kde bylo získáno URL právě kladeného požadavku (lze použít pro analýzu typu „odkud přišli“)
e-mailová adresa uživatele (ještě jsem neviděl prohlížeč, který by ji posílal;)
většina hlaviček je CGI rozhraním převedena na proměnné
např. User-Agent → $_SERVER['HTTP_USER_AGENT']
zapisují se před tělo odpovědi HTTP
v PHP je k dispozici funkce Header:
<?php Header("Content-Type: image/gif") ?>
informace na stránce se mění v čase
on-line přístup do IS
reklamní bannery
Cache-Control: no-cache, no-store, must-revalidate
Expires: datum v minulosti
používat s rozvahou, mnohdy zbytečně zatěžuje přenosové kapacity
některé proxy servery hlavičky ignorují – do všech URL se pak musí vkládat jedinečný řetězec
při pohybu v historii stránek může dojít k nechtěnému opětovnému zaslání dat z formuláře
vznikají duplicity v databázi, nebo se vypisují chybová hlášení
stránka obsluhující formulář by měla být v optimálním případě vyřazena z historie stránek
stránka, která posílá hlavičku Location
, se do historie nezařadí
pozor, adresa v hlavičce Location
musí být absolutní
pokud chceme skriptem generovat jiné druhy dat než HTML (např. obrázky, soubory ve Wordu apod.) musíme nastavit správný typ v hlavičce
Např.: Content-Type:
image/gif
pokud chceme vygenerovat soubor, který bude nabídnut k uložení, lze použít následující hlavičky
Content-type: application/octet-stream
Content-disposition: filename=najakysoubor.dat
protokol HTTP je bezstavový
server nemá stále spojení s klienty a nemůže je proto jednoznačně identifikovat
velké komplikace pro webové aplikace, které vyžadují stavovou informaci – např. nákupní košík
přenášení údajů v URL a skrytých polí formuláře
cookies
session proměnné
Web Storage
nebezpečné – všechny stavové informace jsou v každém požadavku/odpovědi
zbytečně zvyšuje přenosovou kapacitu
velmi pracné na implementaci – za každý odkaz a do každého formuláře se musí přidat všechny stavové proměnné
krátká informace, kterou si server uloží v prohlížeči
při následujících přístupech k témuž serveru je cookie zaslána zpět
cookie je vázána na server a případně i na adresář – informace se nedostanou k tomu, komu nepatří
časová platnost cookie
session cookie – platí do té doby, než se vypne prohlížeč
SetCookie('název', hodnota)
nastavena na konkrétní délku
SetCookie('název', hodnota, platnost)
cookie třetích stran, rizika, P3P
nebezpečné – všechny stavové informace jsou v každém požadavku/odpovědi
implementace je velice snadná
podporu cookies lze v prohlížeči vypnout, proto by dobře napsaná aplikace měla fungovat i bez nic
každému novému uživateli se přiřadí unikátní identifikátor (tzv. session-id)
předává se s každým požadavkem pomocí cookie nebo parametrů v URL, resp. skrytých polí ve formuláři
session-id je konstruováno tak, aby bylo těžko odhadnutelné (většinou náhodné číslo + hashovací funkce)
pro každé session-id má webový server vyhrazen prostor pro ukládání dat (proměnných)
sdílená paměť
soubory
databáze
poměrně bezpečné – s každým požadavkem se přenáší jen malá část dat a session-id
šetří kapacitu sítě – data jsou ukládána přímo na web-serveru
velice snadná implementace – většina prostředí pracuje se session proměnnými téměř stejně jako s běžnými proměnnými
podpora session proměnných ve skriptových prostředích:
ASP – zabudovaná podpora, pracuje pouze s cookies
PHP4, PHP5 – zabudovaná podpora, podporuje cookies i automatické přepisování URL adres
JSP – zabudovaná podpora, podporuje cookies, velice snadno může podporovat i přepisování URL adres
ASP.NET – zabudovaná podpora, podporuje cookies i automatické přepisování URL adres
úložiště dat na klientovi
součást HTML5, podporováno všemi moderními prohlížeči
pojme více dat než cookies a nepřenáší se na server, data zůstávají u klienta a jsou přístupná pouze pomocí JavaScriptu
localStorage – je persistentní i přes uzavření prohlížeče
sessionStorage – platné jen po dobu jedné relace
protokol je vnitřně binární, ale navenek (API) se chová analogicky jako předchozí verze
díky multiplexování může paralelně přenášet data po jednom spojení
podporuje komprimaci hlaviček
server může posílat data klientovi dříve než si je klient vyžádá (push)
většina implementací dovoluje jen šifrovaný přenos dat (TLS)
další vylepšení zejména s ohledem na zvýšení rychlosti a snížení latence
místo TCP se pro přenos dat používá protokol QUIC, což je „reimplementace efektivnějšího TCP nad UDP“
těsnější integrace s TLS