Introduzione al protocollo HTTP
La sigla HTTP sta per Hypertext Transfer Protocol, è il protocollo principale a cui ci riferiamo quando parliamo di servizi web. In generale, un protocollo è un insieme di regole che definiscono il modo con il quale due entità dialogano tra di loro. Su Internet i protocolli sono specificati in documenti pubblici chiamati Requests for Comments (RFC), in particolare il protocollo HTTP è descritto nell'RFC 1945. Questo documento specifica la sintassi di richieste e risposte, e la loro semantica.
Richieste
Una richiesta HTTP è un messaggio inviato da un client verso il server per richiedere una specifica risorsa. Analizziamo una semplice richiesta di esempio.
GET / HTTP/1.1
Host: google.it
User-Agent: curl/8.2.1
Accept: */*
La prima riga è detta request line ed è composta da:
- metodo della richiesta, in questo caso
GET, - path, in questo caso
/, - versione del protocollo, in questo caso
HTTP/1.1.
Subito dopo la request line sono specificati sono gli header della richiesta, ognuno composto dal nome dell'header e dal valore, separati da due punti e spazio (: ).
Gli header permettono di inviare al server informazioni riguardo la richiesta e riguardo al client che ha effettuato la richiesta.
Risposte
Una risposta HTTP viene inviata dal server al client in relazione a una specifica richiesta. Analizziamo la struttura di una risposta di esempio:
HTTP/1.1 301 Moved Permanently
Location: http://www.google.it/
Content-Type: text/html; charset=UTF-8
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-TSpCnWtoiDaYVkH_9k7wlw' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
Date: Wed, 01 May 2024 14:23:17 GMT
Expires: Fri, 31 May 2024 14:23:17 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 218
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.it/">here</A>.
</BODY></HTML>
La prima riga è detta response line ed è composta da:
- versione del protocollo, in questo caso
HTTP/1.1, - il codice di stato della risposta, in questo caso
301, - la frase di risposta, che esprime in maniera più verbosa il significato del codice di errore che la precede.
Subito dopo la response line vi sono gli header della risposta, che sono costruiti esattamente come gli header della richiesta ma servono al server per fornire informazioni al client. Più nello specifico sono informazioni che istruiscono il browser su come comportarsi in determinati contesti. Analizzeremo alcuni degli header più importanti di seguito.
Metodi
Il metodo HTTP indica il tipo di operazione si sta richiedendo al server. I due metodi principali sono:
GET: si usa per richiedere una risorsa,POST: si usa per aggiungere una risorsa (è usato per implementare i form).
Inoltre, con l'avvento del modello delle API di tipo "REST" sono stati aggiunti anche altri metodi:
PUT: si usa per aggiornare una risorsa,DELETE: si usa per cancellare una risorsa.
Questi non sono gli unici metodi possibili, ma sono quelli più utilizzati nella pratica.
Dato che l'applicazione è scritta dallo sviluppatore, sarà lui a decidere come associare le operazioni ai vari metodi.
Un buon design richiede che i metodi siano usati secondo il loro significato.
Non è raro però trovare applicazioni che violino queste indicazioni, ad esempio usando il metodo GET per creare risorse, o comunque modificare lo stato dell'applicazione.
Comportamenti di questo tipo nelle applicazioni web, possono portare all'insorgere di problematiche di sicurezza.
Codici di risposta
Il codice di risposta indica l'esito della richiesta. Ci sono vari codici di risposta standard, divisi per numero abbiamo:
1XX: sono i codici informativi, sono usati per dare informazioni provvisorie. In genere sono poco presenti nella navigazione quotidiana, sono per lo più usati in richieste particolari che il browser fa2XX: la richiesta ha avuto successo.3XX: sono usati per indicare che la risorsa si trova in un altro percorso.4XX: durante l'esecuzione dell'operazione richiesta c'è stato un errore ed è attribuibile a come il client ha costruito la richiesta.5XX: durante l'esecuzione dell'operazione c'è stato un errore da parte del server.
Alcuni codici di errore comuni sono:
200 OK: operazione eseguita correttamente, di solito usato in risposta a delle richieste GET.201 Created: la richiesta ha portato alla creazione di una nuova risorsa.301 Moved Permanently: la risorsa è stata spostata. Questa risposta necessita che il server aggiunga anche un headerLocationche contiene il nuovo percorso al quale la risorsa si trova. Questa risposta è usata per effettuare un redirect del browser.400 Bad Request: il client ha inviato dati sbagliati, mancanti o codificati in un formato non compreso dal server.401 Unauthorized: l'operazione non può essere eseguita perché l'utente non ha abbastanza permessi o perché mancano le informazioni per capire che utente abbia eseguito la richiesta.404 Not Found: impossibile trovare la risorsa.500 Internal Server Error: generico errore del server.
Header
Come abbiamo anticipato gli header sono usati nelle richieste per aggiungere informazioni sulla richiesta stessa, sull'utente che la sta richiedendo ma anche sul client che l'utente sta usando. Nelle risposte invece contengono informazioni sulla risposta, informazioni sullo stato della risorsa, sul server stesso e alcuni header sono usati dal server per istruire il browser a compiere alcune azioni o comportarsi in alcune maniere in predeterminati contesti.
Alcuni degli header più comuni nelle richieste sono:
Host: example.com: dalla versione 1.1 del protocollo HTTP è obbligatorio. Un singolo server HTTP può ospitare vari siti web tramite il concetto divirtual host, il client quindi può specificare quale di questi siti intende visitare usando questo headerContent-Type: application/x-www-form-urlencoded: in caso di richieste che contengono un body (ad esempio le POST) questo header specifica la codifica con la quale questi dati verranno inviati nel body.Content-Length: 104: indica la lunghezza del body.Cookie: name=value: si usa per inviare al server i cookie che il browser ha memorizzato. Di cookie parleremo più approfonditamente nel prossimo bloccoWWW-Autheticate: token: si usa per specificare il token della basic auth.Authorization: type token: è usato comunemente, nelle applicazioni basate su REST, per inviare un token che identifica l'utente.
Alcuni degli header più comuni nelle risposte sono invece:
Content-Type: application/x-www-form-urlencoded: stessa cosa di prima ma per la risposta.Content-Length: 104: indica la lunghezza del body della risposta.Set-Cookie: x=asd: istruisce il browser a salvare.
Tra gli header di risposta ci sono tanti header pensati per aumentare la sicurezza lato client, parleremo di questi header dopo aver introdotto alcune vulnerabilità, in modo da comprendere appieno il loro significato.
Nuove versioni e features
Durante gli anni il protocollo è stato largamente rivisto e sono state rilasciate varie versioni: HTTP 1.1, HTTP 2, HTTP 3 che hanno gradualmente aggiunto altre funzionalità e hanno modificato, anche radicalmente, la struttura. Ad esempio HTTP 1 e HTTP 1.1 sono protocolli testuali, mentre HTTP 2 e HTTP 3 sono completamente binari, per ragioni di efficienza.