HTTP

Jan Komárek, 514267@mail.muni.cz

Obsah

Protokol HTTP


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 / 1.1


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)
    

HTTP hlavičky versus HTTP-EQUIV v HTML


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.

Range request


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
    

Výhody HTTP/2 (SPDY)


HTTP/3 - HTTP over QUIC


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ě.

Apache - Konfigurace


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>
    

Apache - moduly


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

Načtení modulu (Debian/Ubuntu a openSUSE)

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ů:

Apache - .htaccess


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.

Apache - virtuální servery (Virtual Host)


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

SSL vrstva (certifikáty, problém s virtuálními servery)


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 Stapling


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.

alt_text
Zdroj

V httpd lze tuto možnost zapnout přidáním direktiv:

SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
    

CGI (Common Gateway Interface)


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}!")
    

Alternativní HTTP servery


Problém detekce kódování a jazyka, multiviews (Content Negotiation)


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

Autentizace (basic autentizace, cookies)


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 servery


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

Zdroje


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