Protokol HTTP

4IZ278 – Webové aplikace

Jirka Kosek

Poslední modifikace: 2024-02-22 20:48:15 UTC

Úvod

Co je to HTTP

  • 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

Základní model protokolu

  • (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í

Struktura požadavku v HTTP 1.0 a 1.1

metoda URL_dokumentu verze_HTTP
hlavičky
prázdná_řádka

tělo_požadavku
Příklad 1. Ukázka jednoduchého požadavku
GET /clanky/obsah.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Host: www.server.cz

Metody požadavku

GET

nejběžnější – žádost o stránku, odeslání dat z formuláře metodou GET

POST

odeslání dat z formuláře

HEAD

zaslání samotných hlaviček odpovědi

PUT

uložení objektu (stránky, obrázku apod.) na dané URL

DELETE

smazání objektu (stránky, obrázku apod.) z daného URL

TRACE, CONNECT, OPTIONS

konfigurace a analýza způsobu připojení

Struktura odpovědi v HTTP 1.0 a 1.1

protokol stavový_kód stavové_hlášení
hlavičky
prázdná_řádka
obsah_odpovědi
Příklad 2. Ukázka odpovědi
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 06 Dec 2000 13:37:40 GMT
X-Powered-By: PHP/4.0.3pl1
Content-type: text/html

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
<html>
<head>
<title>Dobývání znalostí z databází 2000</title>
<link rel="stylesheet" type="text/css" href="base.css">
...

Stavové kódy

1xx

informativní kód

2xx

úspěšné vyřízení požadavku

3xx

přesměrování

4xx

chyba klienta

5xx

chyba na straně serveru

Předávání formulářových dat

Metoda GET

  • 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

Metoda POST

  • 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

Výběr metody

GET

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, …

POST

pro větší objemy dat (nevejdou se do URL)

nutné pro operace měnící stav backendu

Další možnosti

  • 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>

Hlavičky

O hlavičkách obecně

  • 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á

Nejdůležitější hlavičky

Date

datum a čas požadavku/odpovědi

Content-Type

druh zasílaných dat

Host

doménová adresa serveru – umožňuje správnou funkci více virtuálních serverů na jedné společné adrese

Location

přesměrování na jinou stránku

Ovládání vyrovnávacích pamětí, proxy serverů a načítání stránek

Cache-Control

řízení proxy serverů a vyrovnávacích pamětí

Expires

datum, kdy vyprší platnost stránky

If-Modified-Since, If-Unmodified-Since, If-None-Match

podmíněné načtení stránky

Last-Modified

datum poslední modifikace souboru

Domlouvání obsahu

Accept

seznam typů dat podporovaných klientem

Accept-Charset

seznam kódování, které podporuje klient

Accept-Language

seznam podporovaných jazyků

Allow

seznam metod, kterými je dostupný určitý objekt

Identifikační údaje

User-Agent

identifikace klienta

Server

identifikace serveru

Referer

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“)

From

e-mailová adresa uživatele (ještě jsem neviděl prohlížeč, který by ji posílal;)

Čtení hlaviček

  • většina hlaviček je CGI rozhraním převedena na proměnné

  • např. User-Agent → $_SERVER['HTTP_USER_AGENT']

Generování hlaviček

  • zapisují se před tělo odpovědi HTTP

  • v PHP je k dispozici funkce Header:

    <?php Header("Content-Type: image/gif") ?>

Praktické využití HTTP hlaviček

Zákaz kešování stránek

  • 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

Automatické přesměrování klienta

  • 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í

Identifikace typu generovaných dat

  • 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
    

Limity HTTP

Omezení HTTP

  • 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

Řešení

  • přenášení údajů v URL a skrytých polí formuláře

  • cookies

  • session proměnné

  • Web Storage

Předávání stavových proměnných v URL a skrytých polích formulářů

  • 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é

Cookies

  • 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

Předávání stavových informací pomocí cookies

  • 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

Session proměnné

  • 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

Předávání stavových informací pomocí session proměnných

  • 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

Web Storage

  • ú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

Novější verze HTTP

HTTP/2

  • 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)

HTTP/3

  • 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

Další zdroje informací

Další zdroje informací