Protokol HTTP
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (Vytvoření kostry stránky.) |  (Doplněn postup komunikace, hlavičky a metody.) | ||
| Řádka 3: | Řádka 3: | ||
| == Protokol HTTP  == | == Protokol HTTP  == | ||
| * Protokol HTTP popisuje postup klienta a serveru při stahování obsahu webových stránek. | * Protokol HTTP popisuje postup klienta a serveru při stahování obsahu webových stránek. | ||
| − | * Klientem je v tomto případě internetový prohlížeč uživatele | + | * Klientem je v tomto případě internetový prohlížeč uživatele. | 
| + | * Serverem je serverová aplikace Apache, nginx, IIS či jiná, která naslouchá požadavkům a jako odpověď poskytuje klientům obsah webových stránek. | ||
| − | * Protokol je ''[[ | + | * Protokol HTTP je ''[[Protokoly#Stavové a bezestavové protokoly|bezestavový]]''. Každý požadavek se řeší zcela nezávisle na předchozích požadavcích. | 
| Řádka 14: | Řádka 15: | ||
| # Uživatel zadá adresu do adresního řádku prohlížeče. | # Uživatel zadá adresu do adresního řádku prohlížeče. | ||
| # Pro navázání spojení se serverem je třeba získat IP adresu serveru. | # Pro navázání spojení se serverem je třeba získat IP adresu serveru. | ||
| − | # Prohlížeč proto osloví DNS server | + | # Prohlížeč proto osloví DNS server a přeloží doménové jméno na IP adresu (například '''<code>www.oauh.cz</code> → <code>212.111.4.142</code>'''). | 
| − | + | ||
| − | <div class="Poznamka">Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde [[ | + | <div class="Poznamka">Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde [[Protokoly aplikační vrstvy#DNS|Protokoly aplikační vrstvy]].</div> | 
| === HTTP: Odeslání příkazu a přijetí odpovědi === | === HTTP: Odeslání příkazu a přijetí odpovědi === | ||
| − | # Prohlížeč naváže spojení se  | + | # Prohlížeč naváže spojení se serverem pomocí IP adresy (využije služeb protokolu TCP). | 
| − | #  | + | # Prohlížeč pošle příkazy, které požaduje provést | 
| − | # | + | #: Příklad: <code>GET nazev_stranky.htm HTTP/1.1</code> | 
| − | + | # K požadavku může připojit ještě další informace: ''hlavičky protokolu HTTP''. Jejich počet je volitelný. | |
| − | #  | + | # Některé hlavičky mohou být povinné (například hlavička <code>Host</code> v protokolu HTTP 1.1). | 
| + | # Požadavek končí prázdným řádkem. | ||
| === Zpracování požadavku: dynamické stránky === | === Zpracování požadavku: dynamické stránky === | ||
| Řádka 32: | Řádka 33: | ||
| === HTTP: Odpověď serveru === | === HTTP: Odpověď serveru === | ||
| + | # Jako odpověď server vrátí verzi protokolu, stavový kód a textový popis stavu. | ||
| + | #* Příklad: <code>HTTP/1.1 200 OK</code> ... požadavek skončil bez chyby | ||
| + | #* Příklad: <code>HTTP/1.1 404 Page Not Found</code> ... požadovaný soubor na serveru nebyl nalezen. | ||
| + | # Následují [[#Hlavičky HTTP|hlavičky]] odpovědi. (Počet je volitelný.) | ||
| + | # Poté server připojí prázdný řádek a data souboru, který byl požadován. | ||
| # Přijetím odpovědi komunikace končí. | # Přijetím odpovědi komunikace končí. | ||
| # Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto. | # Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto. | ||
| + | # Prohlížeč následně zobrazí stránku podle popisu v jazyce HTML | ||
| + | |||
| + | <div class="Poznamka">Protokol HTTP verze 1.1 umožňuje po ukončení komunikace (po přijetí odpovědi) ihned poslat další požadavek bez ukončení spojení. Server tedy spojení neuzavírá ihned po odeslání odpovědi, ale až s nějakým zpožděním.</div> | ||
| === Obrázky a jiné objekty ve stránkách === | === Obrázky a jiné objekty ve stránkách === | ||
| * Pokud je v popisu stránky obrázek či jiný vložený objekt, prohlížeč naváže nové spojení a vyžádá si stažení souboru s obrázkem (či jiným objektem). | * Pokud je v popisu stránky obrázek či jiný vložený objekt, prohlížeč naváže nové spojení a vyžádá si stažení souboru s obrázkem (či jiným objektem). | ||
| − | |||
| + | == Metody HTTP == | ||
| + | * Protokol HTTP používá k popisu požadavků tzv. ''metody'' (methods). | ||
| + | * Můžeme si je představit jako textové „příkazy“, které posíláme serveru.  | ||
| + | * Je tedy docela snadné si komunikaci prohlédnout a případně hledat chyby. | ||
| + | * Na druhou stranu to ale také nahrává útočníkům, proto dnes mnoho serverů vyžaduje využití SSL pro šifrování komunikace. | ||
| + | * Při použití „https“ se požadavky protokolu HTTP posílají šifrovaným kanálem. Textový zápis metod zůstává stejný, ale celá komunikace je nyní zašifrovaná. | ||
| − | |||
| + | === Metoda GET === | ||
| + | * Základní požadavek, který slouží ke stažení webové stránky, používá metodu GET. | ||
| + | * Syntaxe: <code>GET ''složka/soubor'' HTTP/1.1</code> | ||
| + | * Jako druhý parametr se uvádí verze protokolu HTTP. Dnes nejběžněji HTTP 1.1. | ||
| + | * Na dalších řádcích následují [#Hlavičky protokolu HTTP| hlavičky protokolu HTTP]. | ||
| + | * Požadavek končí prázdným řádkem. | ||
| − | |||
| − | + | === Další metody === | |
| − | === Další  | + | |
| * Kromě stahování obsahu webových stránek dnes lze protokol HTTP využít i pro další účely včetně modifikace obsahu webových stránek. | * Kromě stahování obsahu webových stránek dnes lze protokol HTTP využít i pro další účely včetně modifikace obsahu webových stránek. | ||
| − | * K těmto účelům slouží další  | + | * K těmto účelům slouží další metody: | 
| ; <code>POST</code> | ; <code>POST</code> | ||
| + | * Požadavek s desláním formulářových dat. | ||
| + | * Neukládá se do historie prohlížeče. | ||
| ; <code>PUT</code> | ; <code>PUT</code> | ||
| + | * Nahrání souboru na server. | ||
| ; <code>DELETE</code> | ; <code>DELETE</code> | ||
| + | * Smazání souborů na serveru. | ||
| == Hlavičky protokolu HTTP == | == Hlavičky protokolu HTTP == | ||
| + | * Jedná se o doplňující textové informace, které posílají server nebo prohlížeč. | ||
| + | * Jednotlivé hlavičky se oddělují koncem řádku. | ||
| + | * Více o hlavičkách HTTP viz: [https://en.wikipedia.org/wiki/List_of_HTTP_header_fields Wikipedia → List_of_HTTP_header_fields] | ||
| + | ; Příklady hlaviček prohlížeče | ||
| + | * Tyto hlavičky může posílat prohlížeč k serveru. | ||
| + | * <code>Host: www.oauh.cz</code> | ||
| + | ** Z jaké domény vyžadujeme informace (na dnešním hostingu může běžně na jedné IP adrese běžet více domén). | ||
| + | * <code>User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0</code> | ||
| + | ** Označení prohlížeče, který bude stránku zobrazovat. | ||
| − | = | + | ; Příklady hlaviček serveru | 
| + | * Doplňující informace pro prohlížeč. | ||
| + | * <code>Date: Sun, 03 May 2020 14:27:01 GMT</code> | ||
| + | ** Datum zpracování požadavku. | ||
| + | * <code>Server: Apache/2.2.12 (Linux/SUSE)</code> | ||
| + | ** Serverová aplikace, která požadavek zpracovala. | ||
| + | * <code>Content-Type: text/html; charset=iso-8859-1</code> | ||
| + | ** Typ obsahu odesílaného souboru. | ||
| + | * <code>Expires: Thu, 01 Dec 1994 16:00:00 GMT</code> | ||
| + | ** Kdy obsah přestává být platný a měl by se stáhnout znovu. | ||
| + | * <code>Location: /pub/WWW/People.html</code> | ||
| + | ** Přesměrování — klient by měl místo této stránky stáhnout stránku z uvedené URL. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | == Verze protokolu HTTP == | ||
| + | * Dnes je nejběžnější použití HTTP/1.1 (publikováno 1997, aktualizováno 2014) nebo HTTP/2 (publikováno 2015). | ||
| + | * Starší verze 0.9 a 1.0 už se dnes běžně nepoužívají. | ||
| + | * Postupně se pracuje na specifikaci HTTP/3. | ||
| Řádka 89: | Řádka 138: | ||
| * Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky. | * Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky. | ||
| * Spusťte program PuTTY a vyplňte údaje pro připojení k serveru. | * Spusťte program PuTTY a vyplňte údaje pro připojení k serveru. | ||
| − | + | {| class="wikitable" | |
| − | + | |-- | |
| + | | Server: || <code>www.oauh.cz</code>  | ||
| + | |-- | ||
| + | | Port: || <code>80</code>  | ||
| + | |-- | ||
| + | | Connection-type: || <code>raw</code>  | ||
| + | |-- | ||
| + | |} | ||
| + | |||
| + | * Aby se po ukončení spojení okno neuzavřelo, zatrhněte navíc:  | ||
| + | |||
| + | {| class="wikitable"  | ||
| + | |-- | ||
| + | | Close window on exit: || <code>Never</code>  | ||
| + | |-- | ||
| + | |} | ||
| * Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem. | * Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem. | ||
| ** Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET). | ** Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET). | ||
| * Zkontrolujte odpověď. | * Zkontrolujte odpověď. | ||
| − | ** Odpověď serveru by měla začínat: <code>200 OK</code> | + | ** Odpověď serveru by měla začínat: <code>HTTP/1.1 200 OK</code> | 
| ** Pokud je odpověď jiná, najděte chybový kód a upravte postup. | ** Pokud je odpověď jiná, najděte chybový kód a upravte postup. | ||
| + | ** Dnes servery často vyžadují šifrované spojení přes HTTPS. V tom případě bude nejspíš odpověď serveru začínat: <code>HTTP/1.1 301 Moved permanently</code> a bude následovat hlavička <code>Location:</code>, která udává, na jaké adrese najdete stránku nyní (https://...). | ||
| </div> | </div> | ||
Verze z 4. 5. 2020, 11:03
| Obsah | 
Protokol HTTP
- Protokol HTTP popisuje postup klienta a serveru při stahování obsahu webových stránek.
- Klientem je v tomto případě internetový prohlížeč uživatele.
- Serverem je serverová aplikace Apache, nginx, IIS či jiná, která naslouchá požadavkům a jako odpověď poskytuje klientům obsah webových stránek.
- Protokol HTTP je bezestavový. Každý požadavek se řeší zcela nezávisle na předchozích požadavcích.
Chování klienta a serveru
Příprava na stažení webové stránky
- Uživatel zadá adresu do adresního řádku prohlížeče.
- Pro navázání spojení se serverem je třeba získat IP adresu serveru.
-  Prohlížeč proto osloví DNS server a přeloží doménové jméno na IP adresu (například www.oauh.cz→212.111.4.142).
Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde Protokoly aplikační vrstvy.
HTTP: Odeslání příkazu a přijetí odpovědi
- Prohlížeč naváže spojení se serverem pomocí IP adresy (využije služeb protokolu TCP).
-  Prohlížeč pošle příkazy, které požaduje provést
-  Příklad: GET nazev_stranky.htm HTTP/1.1
 
-  Příklad: 
- K požadavku může připojit ještě další informace: hlavičky protokolu HTTP. Jejich počet je volitelný.
-  Některé hlavičky mohou být povinné (například hlavička Hostv protokolu HTTP 1.1).
- Požadavek končí prázdným řádkem.
Zpracování požadavku: dynamické stránky
- Pokud se jedná o statickou webovou stránku, server pouze vyhledá správný soubor a odešle jeho obsah.
- Pokud jsou ale v obsahu stránky použity skriptovací jazyky PHP, ASP.net, Python či další, musí server nejprve zpracovat veškeré příkazy a teprve výsledný kód se odešle jako odpověď.
- Toto se netýká skriptů zpracovávaných na straně klienta (v prohlížeči) — dnes typicky JavaScript. Tyto skripty se odesílají spolu s kódem stránky a jejich zpracování provádí až prohlížeč na počítači klienta.
HTTP: Odpověď serveru
-  Jako odpověď server vrátí verzi protokolu, stavový kód a textový popis stavu.
-  Příklad: HTTP/1.1 200 OK... požadavek skončil bez chyby
-  Příklad: HTTP/1.1 404 Page Not Found... požadovaný soubor na serveru nebyl nalezen.
 
-  Příklad: 
- Následují hlavičky odpovědi. (Počet je volitelný.)
- Poté server připojí prázdný řádek a data souboru, který byl požadován.
- Přijetím odpovědi komunikace končí.
- Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto.
- Prohlížeč následně zobrazí stránku podle popisu v jazyce HTML
Protokol HTTP verze 1.1 umožňuje po ukončení komunikace (po přijetí odpovědi) ihned poslat další požadavek bez ukončení spojení. Server tedy spojení neuzavírá ihned po odeslání odpovědi, ale až s nějakým zpožděním.
Obrázky a jiné objekty ve stránkách
- Pokud je v popisu stránky obrázek či jiný vložený objekt, prohlížeč naváže nové spojení a vyžádá si stažení souboru s obrázkem (či jiným objektem).
Metody HTTP
- Protokol HTTP používá k popisu požadavků tzv. metody (methods).
- Můžeme si je představit jako textové „příkazy“, které posíláme serveru.
- Je tedy docela snadné si komunikaci prohlédnout a případně hledat chyby.
- Na druhou stranu to ale také nahrává útočníkům, proto dnes mnoho serverů vyžaduje využití SSL pro šifrování komunikace.
- Při použití „https“ se požadavky protokolu HTTP posílají šifrovaným kanálem. Textový zápis metod zůstává stejný, ale celá komunikace je nyní zašifrovaná.
Metoda GET
- Základní požadavek, který slouží ke stažení webové stránky, používá metodu GET.
-  Syntaxe: GET složka/soubor HTTP/1.1
- Jako druhý parametr se uvádí verze protokolu HTTP. Dnes nejběžněji HTTP 1.1.
- Na dalších řádcích následují [#Hlavičky protokolu HTTP| hlavičky protokolu HTTP].
- Požadavek končí prázdným řádkem.
Další metody
- Kromě stahování obsahu webových stránek dnes lze protokol HTTP využít i pro další účely včetně modifikace obsahu webových stránek.
- K těmto účelům slouží další metody:
-  POST
- Požadavek s desláním formulářových dat.
- Neukládá se do historie prohlížeče.
-  PUT
- Nahrání souboru na server.
-  DELETE
- Smazání souborů na serveru.
Hlavičky protokolu HTTP
- Jedná se o doplňující textové informace, které posílají server nebo prohlížeč.
- Jednotlivé hlavičky se oddělují koncem řádku.
- Více o hlavičkách HTTP viz: Wikipedia → List_of_HTTP_header_fields
- Příklady hlaviček prohlížeče
- Tyto hlavičky může posílat prohlížeč k serveru.
-  Host: www.oauh.cz- Z jaké domény vyžadujeme informace (na dnešním hostingu může běžně na jedné IP adrese běžet více domén).
 
-  User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0- Označení prohlížeče, který bude stránku zobrazovat.
 
- Příklady hlaviček serveru
- Doplňující informace pro prohlížeč.
-  Date: Sun, 03 May 2020 14:27:01 GMT- Datum zpracování požadavku.
 
-  Server: Apache/2.2.12 (Linux/SUSE)- Serverová aplikace, která požadavek zpracovala.
 
-  Content-Type: text/html; charset=iso-8859-1- Typ obsahu odesílaného souboru.
 
-  Expires: Thu, 01 Dec 1994 16:00:00 GMT- Kdy obsah přestává být platný a měl by se stáhnout znovu.
 
-  Location: /pub/WWW/People.html- Přesměrování — klient by měl místo této stránky stáhnout stránku z uvedené URL.
 
Verze protokolu HTTP
- Dnes je nejběžnější použití HTTP/1.1 (publikováno 1997, aktualizováno 2014) nebo HTTP/2 (publikováno 2015).
- Starší verze 0.9 a 1.0 už se dnes běžně nepoužívají.
- Postupně se pracuje na specifikaci HTTP/3.
Úkol: Prohlédněte si komunikaci
- Úkol
- Prohlédněte si komunikaci mezi klientem a serverem
- Najděte stránku WebSniffer.cc.
- Zadejte nějakou URL adresu do okénka.
- Web sniffer vám vypíše kompletní komunikaci mezi vaším prohlížečem a serverem.
- Zobrazen máte požadavek s odeslanými hlavičkami i přijatou odpověď včetně hlaviček, které poskytuje server.
Úkol: Odeslání požadavku ručně
Úkol: Vyzkoušejte si ručně, co musí udělat prohlížeč!
-  Vyberte si web, ke kterému se zkusíte připojit. (V našem příkladu píšeme www.oauh.cz. Vy napište skutečnou URL adresu bez HTTP.
- Do poznámkového bloku (či jiného čistě textového editoru) si připravte požadavek:
GET / HTTP 1.1 Host: www.oauh.cz <prázdný řádek>
- Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky.
- Spusťte program PuTTY a vyplňte údaje pro připojení k serveru.
| Server: | www.oauh.cz | 
| Port: | 80 | 
| Connection-type: | raw | 
- Aby se po ukončení spojení okno neuzavřelo, zatrhněte navíc:
| Close window on exit: | Never | 
-  Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem.
- Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET).
 
-  Zkontrolujte odpověď.
-  Odpověď serveru by měla začínat: HTTP/1.1 200 OK
- Pokud je odpověď jiná, najděte chybový kód a upravte postup.
-  Dnes servery často vyžadují šifrované spojení přes HTTPS. V tom případě bude nejspíš odpověď serveru začínat: HTTP/1.1 301 Moved permanentlya bude následovat hlavičkaLocation:, která udává, na jaké adrese najdete stránku nyní (https://...).
 
-  Odpověď serveru by měla začínat: 
- Obvyklé chyby
-  Chybějící hlavička Host:
- Špatná velikost písmen (dodržte malá a velká písmena podle vzoru).
- Chybějící prázdný řádek na konci (požadavek končí prázdným řádkem — dvěma dvojicemi CR+LF).
