HTTP (HyperText Transfer Protocol) je síťový protokol používaný pro přenos dat mezi klientem a serverem. HTTP byl navrhnutý tak, aby byl jednoduchý a lidsky čitelný, to se změnilo s novou verzí HTTP/2 a HTTP/3, které zabalují HTTP zprávy do framů.
Protokol je bezstavový - klient posílá požadavky na server, který mu odpovídá. Pomocí cookies (hodnoty uložené na straně klienta) je možné udržovat jednotlivé sezení.
HTTP request se skládá z:
Ukázka:
GET /static/img/background.png HTTP/1.1 User-Agent: curl/7.68.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br
Odpověď serveru se skládá z:
Ukázka:
200 OK Age: 9578461 Cache-Control: public, max-age=315360000 Connection: keep-alive Content-Length: 3077 Content-Type: image/png Date: Thu, 30 Oct 2022 15:34:46 GMT Last-Modified: Wed, 1 Oct 2022 18:27:50 GMT Server: Apache (image content of 3077 bytes)
V záhlaví HTML dokumentu je možné specifikovat meta tag <meta http-quiv="name" content="content">, které by měly být ekvivalentní HTTP hlavičkám.
Některé servery tyto tagy přímo přidávají do odpovědí serveru. Jinak je na klientovi, aby si tyto hlavičky sám přečetl.
Pokud server podporuje (na nějakém konkrétním souboru/stránce) range request, klient je schopný si vyžádat jen část dat. To se používá například v přehrávačích nebo při stahování souborů (možnost pozastavit stahování).
Ukázka:
Klient: curl --head http://i.imgur.com/z4d4kWk.jpg Server: HTTP/1.1 200 OK … Accept-Ranges: bytes Content-Length: 146515 Klient: GET /z4d4kWk.jpg HTTP/1.1 Host: i.imgur.com Range: bytes=0-1023 Server: HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024
HTTP/3 zachovává stejnou sémantiku jako HTTP/2, ale používá QUICk místo TCP.
QUIC používá UDP pro navázání multiplexovaného spojení. Při použití TLS vrstvy naváže spojení a provede TLS handshake společně.
Hlavní konfigurační soubor se většinou jmenuje httpd.conf (v Ubuntu apache2.conf). Nastavení vložené do tohoto souboru se aplikují na celý server. Tento soubor obsahuje základní nastavení, definuje, které složky jsou přístupné z webu, název konfiguračního souboru (.htaccess), načítá dalších nastavení (například portů) atd.
Jednotlivé nastavení (direktiva) se aplikují vždy na určitý rozsah (scope).
Možné rozsahy: <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>
Příklad:
<DirectoryMatch "^/www/(.+/)?[0-9]{3}/"> # ... </DirectoryMatch>
Httpd je modulární server. Základní funkcionalita je zakomponovaná do jádra. Další funkcionalitu je možné přidat přes moduly.
Načtené moduly je možné vypsat příkazem
apachectl -M
Moduly lze zapnout příkazem (vytvoří symlink modulu z /etc/apache2/mods-enabled/ na /etc/apache2/mods-available):
a2enmod ssl
Nebo vypnout (odstraní symlink modulu z /etc/apache2/mods-enabled/ na /etc/apache2/mods-available):
a2dismod ssl
Příklady modulů:
Httpd umožňuje decentralizovat konfiguraci speciálním souborem (většinou .htaccess ). Direktiva specifikované v tomto souboru se aplikují na složku, v níž je soubor umístěn a celý podstrom. Tento soubor používá stejnou syntaxi jako hlavní konfigurační soubor. Jeho výhodou je, že se čte při každém požadavku na server a proto není potřeba při změně restartovat celý server.
Httpd podporuje běh více webů na jednom zařízení. Virtuální server je možné rozdělit buď podle jména (www.example.com), ip adresy nebo portu.
Informace o Virtual hosts
apachectl -S
Příklad konfigurace dvou webů rozdělených podle jmen:
/etc/apache2/sites-available/pv090.conf <VirtualHost *:80> # This first-listed virtual host is also the default for *:80 ServerName pv090.fi.muni.cz ServerAlias www.pv090.fi.muni.cz DocumentRoot "/var/www/pv090" </VirtualHost>
/etc/apache2/sites-available/alpha.conf <VirtualHost *:80> ServerName alpha.pv090.fi.muni.cz ServerAlias www.alpha.pv090.fi.muni.cz DocumentRoot "/var/www/alpha" </VirtualHost>
Jako u modulů je možné jednotlivé weby zapnout vytvořením symlinku v /etc/apache2/sites-enabled
nebo
příkazem a2ensite/a2dissite
Pro zabezpečenou komunikaci je potřeba využít TLS vrstvy. V httpd serveru se virtualhost používající modul mod_ssl vytvoří následovně:
Listen 443 <VirtualHost *:443> ServerName www.example.com SSLEngine on SSLCertificateFile "/path/to/www.example.com.cert" SSLCertificateKeyFile "/path/to/www.example.com.key" </VirtualHost>
Je možné vynutit použití určitého (silného) šifrování přidáním direktivy:
SSLCipherSuite HIGH:!aNULL:!MD5
OCSP se využívá pro zjištění platnosti certifikátu. Při navazování TLS spojení klienta se serverem, se server dotáže na platnost certifikátu, který pak pošle klientovi. Ten na základě OCSP odpovědi zkontroluje platnost certifikátu, který mu server poslal.
V httpd lze tuto možnost zapnout přidáním direktiv:
SSLUseStapling On SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
CGI umožňuje komunikaci mezi webserverm a programy generující dynamický obsah v prakticiky jakémkoliv programovacím jazyce.
Pro fungování CGI v httpd je potřeba aktivovat mod_cgi. Konfigurace složky obsahující CGI programy:
<Directory "/var/www/proto080/cgi"> Options +ExecCGI AddHandler cgi-script .cgi .py </Directory>
Při psaní CGI programů je potřeba nejdříve vypsat MIME-type header (Content-type: text/html)
a poté
může následovat
libovolný obsah (většinou html/plaintext).
Příklad Python CGI programu:
#!/usr/bin/python3 print("Content-type: text/plain") print() name = "Alpha" print(f"Hello from {name}!")
Občas chceme zobrazit jeden dokument například ve více jazycích podle preference klienta. K tomu se využívá Content Negotiation, které podle hlavičky dotazu vrátit specifickou verzi souboru.
Například pokud pošle dotaz
GET /intex.html HTTP/1.1 Accept-Language: en
vrátí se soubor index.html.en
, ale pro dotaz
GET /intex.html HTTP/1.1
Accept-Language: fr
se vrátí soubor index.html.fr
Lze využít tyto hlavičky - Accept-Language, Accept, Accept-Encoding, Accept-Charset
HTTP podporuje basic autentizaci pomocí jména a hesla nebo například OAuth 2.0 Bearer Token.
Při přístupu k obsahu vyžadující autentizaci je uživatel vyzván k zadání jména a hesla. To je poté na serveru ověřeno.
Konfigurace basic autentizace v httpd:
Vytvoření souboru s hesly
htpasswd -c /path/to/passwords user1
Nastavení autentizace pro složku
<Directory "/var/www/htdocs"> AuthType Basic AuthName "Secure Files" AuthBasicProvider file AuthUserFile " /path/to/passwords" </Directory>
Pro autentizaci se v dnešní době používají cookies, do kterých se uloží token, kterým se uživatel prokazuje při
každém dotazu na server. Pro zvýšení bezpečnosti se využívá HttpOnly Cookie
, které je možné nastavit a
číst
pouze přes hlavičky v odpovědi ze serveru.
Set-Cookie: token=abcde12345; Expires=Thu,28 Oct 2022 07:28:00 GMT; Secure; HttpOnly
Klient nemá možnost zjistit obsah takového cookies a tedy nemůže (neměl by být) být ani ukraden útočníkem.
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookieshttps://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies)
HTTP proxy cache slouží k snížení zátěže hlavního http serveru. Uchovává kopii jednotlivých objektů a při dotazu klienta zkontroluje, zda má v cache požadovaný objekt a zda je tento objekt aktuální. (Objekt může být,html soubor, fotka, video, …)
https://docs.trafficserver.apache.org/admin-guide/configuration/cache-basics.en.html
https://developer.mozilla.org/en-US/docs/Glossary/QUIC
https://developer.mozilla.org/en-US/docs/Web/HTTP
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
https://httpd.apache.org/docs/2.4/configuring.html
https://httpd.apache.org/docs/2.4/vhosts/
https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html#page-header
http://vancouver-webpages.com/META/#equiv
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol