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
Host
v 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 permanently
a 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).