Cosa sono gli header HTTP?

Pubblicità

Introduzione agli Header HTTP

A che servono gli header HTTP? Servono a capire che cosa succeda durante la connessione ad un sito o ad un servizio web, e possono essere utili per inquadrare al meglio eventuali problemi o bug, e poterli risolvere. Per capire cosa sia un header HTTP dobbiamo chiederci cosa succeda dietro le quinte quando, ad esempio, proviamo ad aprire un indirizzo internet nel nostro browser.

Se digitiamo (un esempio, un sito a caso):

trovalost.it

il client avrà inviato una richiesta su protocollo HTTPS (Hyper Text Transfer Protocol Secure), al web server del sito, mediante DNS. Avrà richiesto di vedere nello specifico la home page del sito, ovviamente:ed il server dovrà fornire una risposta del tipo “OK”, se nulla ostacola l’operazione, oppure “KO” in caso di errore/i.

Differenza tra richieste GET e POST

In genere possiamo vedere gli header HTTP mediante una linea di comando del programma cURL: le modalità principali sono mediante GET o mediante POST. La differenza tra i due è semplice: le GET appendono gli eventuali parametri della richiesta direttamente nell’URL, sia in chiaro che in forma crittografata, mentre le POST le includono sempre nel corpo (body) della richiesta. Ci sono anche altri tipi di richieste che possono essere utili in questo ambito, come ad esempio UPDATE.

I browser in qualche modo possono emulare quasi tutte e due le modalità, sia POST che GET, ma con qualche limitazione (in alcuni casi): per questo è molto consigliabile fare debug usando client dedicati come ad esempio PostMan.

Header HTTP di tipo GET

Sono le cURL classiche, per così dire, e si possono formulare come segue. Le risposte saranno tipicamente JSON o XML da parserizzare e rendere (con un ulteriore passaggio) all’interno di un risultato finale: un PDF o una pagina HTML, di norma.

in formato JSON:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://host/path

in formato XML:

curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://host/path

Header HTTP di tipo POST

Incorporano i dati nel body della richiesta, quindi in questo caso passeremo i parametri mediante –data:

Inviare parametri

curl --data "param1=value1&param2=value2" http://host/path

Fare upload di un file

curl --form "[email protected]" http://host/path

fare una chiamata REST su un file

curl -X POST -d @myfile http://host/path

fare login in un sito

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://host/Login
curl -L -b headers http://host/

Gli HTTP headers (intestazioni HTTP) permettono al client ed al server di scambiarsi le informazioni che gli servono e comunicare secondo una convenzione comune. Un header HTTP (ma anche HTTPS per estensione) è fatto da una triade del tipo:

  • un nome;
  • un segno di due punti (:);
  • un valore;

Spazi e a capo, in questo frangente, vengono solitamente ignorati.

Esempi di header HTTP

Gli header HTTP sono in genere trasmessi singolarmente o in gruppo, nella forma seguente:

Accept: text/html

oppure:

Accept-Charset: utf-8

oppure, ancora:

Content-Length: 348

ed indicano rispettivamente: un contenuto in HTML, un charset impostato a UTF-8 ed una dimensione del contenuto di 348 byte. Quindi sono insiemi di coppie:

chiave: valore

dove la chiave indica il nome della proprietà e valore il suo… valore, per l’appunto.

Come trovare gli header HTTP

Gli header HTTP si possono identificare aprendo una linea di comando (terminale) sul proprio computer, e digitando un comando cURL, nella forma base:

curl -I www.google.it

che restituirà qualcosa del genere, da leggersi come elenco di coppie per riga. Nell’esempio vediamo, tanto per capirci, che il campo Date ha valore Sun, 22 Mar 2020 11:39:30 GMT, che quello Expires è pari a -1, che il campo Cache-Control è impostato su private, max-age=0 e così via.

HTTP/1.1 200 OK
Date: Sun, 22 Mar 2020 11:39:30 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP=”This is not a P3P policy! See g.co/p3phelp for more info.”
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-03-22-11; expires=Tue, 21-Apr-2020 11:39:30 GMT; path=/; domain=.google.it; Secure
Set-Cookie: NID=200=KXE32BblqlTYt6X7Tqiu-4JKuLSvzyGGtS-C231TbzOvvmZW7wkwlQsgiRKXnC5LGgbc-6MztIkB1kAwerTBJ8OM7LN5t409YXVjO6ZpsLxgm_BKReE0oLUi5YtEUNVF7kFDTjxk1TEBnLzps86Sbg_yNe2pRe5tecz3UapbH38; expires=Mon, 21-Sep-2020 11:39:30 GMT; path=/; domain=.google.it; HttpOnly
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

In alternativa, se si preferisce un tool con interfaccia grafica, si può ricorrere al tool per trovare l’IP di un dominio sul nostro sito, che mostra anche informazioni sugli header.

Tipologia di Header HTTP

Gli header HTTP sono in genere di quattro tipi, che corrispondono a specifici record che vengono o meno riempiti di dati:

  • General header: sono header comuni sia al client che al server
  • Request header: header di richiesta con info varie su come è stata effettuata e da chi
  • Response header: header di risposta con info sulla posizione del server e simili
  • Entity header: contiene informazioni aggiuntive come dimensione della risposta e tipo-MIME.

Un altro modo per raggrupparli prevede di suddividerli sulla base dello scopo che hanno: si chiamano header End-to-End, che corrispondono a quello iniziale e finale di ogni coppia richiesta/risposta, e poi abbiamo gli header Hop-By-Hop che invece sono utili a livello di trasporto, e sono ad esempio:

Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, TE, Trailer, Transfer-Encoding, Upgrade.

Lista header di autenticazione

WWW-Authenticate
Serve a definire il metodo di autenticazione per la risorsa o URL richiesto
Authorization
Contiene in genere le credenziali di accesso, username e password
Proxy-Authenticate
definisce il reverse proxy utili per l’autenticazione
Proxy-Authorization
Contiene in genere le credenziali di accesso del reverse proxy, quindi username e password

Lista header di cache

Age
Età del contenuto in cache, espresso in secondi.
Cache-Control
Indica la direttiva di cache adottata dalla pagina.
Expires
Indica ora e data di scadenza della cache.
Pragma
Specifiche della cache con varie ripercussioni nel suo funzionamento
Warning
Avviso di eventuali problemi o errori di configurazione

Lista header di Client

Accept-CH
Content-DPR
DPR
Downlink
Save-Data
Viewport-Width
Width

Lista header Conditionals

Sono spesso vitali per le prestazioni della pagina web in termini di velocità di caricamento, in molti casi, ed interessano la parte SEO tecnica del sito.

Last-Modified
è utile per determinare la data di ultima modifica di un URL, in modo che (ad esempio) browser e motori di ricerca non ci passino inutilmente più volte, consumando crawl-budget. Dipendono dalle condizioni If-Modified-Since oppure If-Unmodified-Since.
ETag
Identifica la versione della risorse, questa volta usando le condizioni If-Match o If-None-Match
If-Match
If-None-Match
If-Modified-Since
If-Unmodified-Since

Lista header di Connection

Connection
Keep-Alive

Lista header di Content negotiation

Accept
Accept-Charset
Accept-Encoding
Accept-Language

Lista header di Controllo

Expect
Max-Forwards

Lista header per Cookies

Cookie
Lista dei cookie memorizzati nella sessione client-server attuale.
Set-Cookie
Cookie2
Set-Cookie2

Lista header CORS

Access-Control-Allow-Origin
Access-Control-Allow-Credentials
Access-Control-Allow-Headers
Access-Control-Allow-Methods
Access-Control-Expose-Headers
Access-Control-Max-Age
Access-Control-Request-Headers
Access-Control-Request-Method
Origin

Lista header Do Not Track

DNT
Tk

Lista header Downloads

Content-Disposition

Lista header Message body

Content-Length
Content-Type
Content-Encoding
Content-Language
Content-Location

Lista header Proxies

Forwarded
X-Forwarded-For
X-Forwarded-Host
X-Forwarded-Proto
Via

Lista header Redirects

Location

Lista header Request context

From
Host
Referer
Referrer-Policy
User-Agent

Lista header Response context

Allow
Server

Lista header Range requests

Accept-Ranges
Range
If-Range
Content-Range

Lista header Security

Content-Security-Policy (CSP)
Content-Security-Policy-Report-Only
Public-Key-Pins (HPKP)
Public-Key-Pins-Report-Only
Strict-Transport-Security (HSTS)
Upgrade-Insecure-Requests
X-Content-Type-Options
X-Frame-Options (XFO)
X-XSS-Protection

Lista header Server-sent events

Ping-From
Ping-To
Last-Event-ID

Lista header Transfer coding

Transfer-Encoding
TE
Trailer

Lista header WebSockets

Sec-WebSocket-Key
Sec-WebSocket-Extensions
Sec-WebSocket-Accept
Sec-WebSocket-Protocol
Sec-WebSocket-Version

Lista header di altro tipo

Date
Large-Allocation
Link
Retry-After
SourceMap
Upgrade
Vary
X-DNS-Prefetch-Control
X-Firefox-Spdy
X-Requested-With
X-UA-Compatible
2 voti
Pubblicato in FAQ