Questo sito utilizza cookie per raccogliere dati statistici.
Privacy Policy
# Cookies
## HTTP è stateless: cosa significa?
Il protocollo HTTP, che sta alla base della comunicazione tra client (come un browser) e server web, è **stateless**. Questo significa che ogni richiesta HTTP è **indipendente** e non contiene informazioni sulle richieste precedenti. Il server non ha modo di "ricordare" il client tra una richiesta e l'altra, a meno che non si implementino meccanismi per mantenere lo stato.
**Esempio del problema**:
Immagina un sito di e-commerce dove un utente aggiunge un prodotto al carrello. Senza un modo per mantenere lo stato tra le richieste HTTP, il server non sarebbe in grado di ricordare che l'utente ha già selezionato un prodotto una volta che passa a un'altra pagina del sito. Ogni richiesta sarebbe come se l'utente stesse visitando il sito per la prima volta.
## Cosa sono i cookies?
I **cookies** sono piccoli file di testo che i server inviano al browser dell'utente e che vengono memorizzati sul dispositivo dell'utente. Ogni volta che l'utente visita nuovamente il sito, il browser invia questi cookies al server, permettendo di "ricordare" l'utente e le sue preferenze. Questo meccanismo consente di superare la limitazione dell'HTTP di essere stateless.
## Problemi che i cookies risolvono
I cookies risolvono il problema della **mancanza di memoria** tra le richieste HTTP, consentendo al server di:
- **Mantenere l'autenticazione dell'utente**: un utente può accedere a un sito e rimanere connesso anche dopo aver cambiato pagina o aver chiuso e riaperto il browser.
- **Salvare le preferenze dell'utente**: come la lingua preferita o le impostazioni del tema.
- **Tracciare l'attività dell'utente**: per memorizzare i prodotti in un carrello, registrare l'attività di navigazione e raccogliere dati analitici.
## Come funzionano i cookies
Quando un utente visita un sito web, il server può inviare uno o più cookies al browser. Il browser memorizza questi cookies e **li include automaticamente nelle richieste future al server**. In questo modo, il server può associare le richieste successive allo stesso utente e mantenere informazioni su di lui. Quindi quando il browser effettua una richiesta HTTP al server e sono presenti dei cookies, questi vengono inviati come parte dell'intestazione della richiesta HTTP. Ecco un esempio pratico per mostrare come avviene il processo.
### Esempio di richiesta HTTP senza cookies
Immaginiamo una semplice richiesta HTTP GET a un server senza cookies:
```http
GET /index.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
```
In questa richiesta, il browser sta semplicemente richiedendo la pagina `/index.php` senza inviare alcun cookie.
### Esempio di richiesta HTTP con cookies
Se il sito ha impostato dei cookies (ad esempio, un cookie di preferenze del tema e un cookie che indica che l'utente ha accettato i termini), la richiesta HTTP includerà questi cookies nell'intestazione:
**Richiesta HTTP GET con cookies**:
```http
GET /index.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: preferenzaTema=scuro; accettatoTermini=true
```
### Struttura della risposta HTTP con cookies impostati
Quando un server PHP invia una risposta per impostare cookies, questi vengono inclusi nell'intestazione della risposta HTTP con `Set-Cookie`.
**Esempio di intestazione di risposta HTTP con cookies**:
```http
HTTP/1.1 200 OK
Date: Wed, 03 Nov 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Set-Cookie: preferenzaTema=scuro; Expires=Wed, 10 Nov 2024 12:00:00 GMT; Path=/
Set-Cookie: accettatoTermini=true; Expires=Fri, 03 Dec 2024 12:00:00 GMT; Path=/
Content-Type: text/html; charset=UTF-8
```
Queste intestazioni dicono al browser di memorizzare i cookies. Il browser, quindi, invierà i cookies memorizzati in tutte le richieste future al dominio specificato, fino alla loro scadenza o eliminazione.
### Flusso di lavoro completo con cookies
1. **Il server imposta i cookies** nella risposta HTTP.
2. **Il browser memorizza i cookies** e li invia automaticamente nelle richieste successive al server.
3. **Il server legge i cookies** dalla richiesta HTTP per mantenere lo stato o personalizzare la risposta.
## Cookies di prima parte vs cookies di terze parti
- **Cookies di prima parte**: sono impostati dal dominio del sito web che l'utente sta visitando (se visito il sito www.spaggiari.eu sono impostati da spaggiari). Servono per funzionalità come il mantenimento dell'accesso dell'utente e la personalizzazione dell'esperienza.
- **Cookies di terze parti**: sono impostati da un dominio **diverso** rispetto a quello del sito che l'utente sta visitando (se visito il sito www.spaggiari.eu potrebbero essere impostati da google o da facebook). Sono spesso utilizzati per scopi di **tracciamento e pubblicità**, permettendo agli inserzionisti di seguire il comportamento dell'utente su diversi siti web e di mostrare annunci personalizzati.
**Esempio di cookies di terze parti**:
Se visiti un sito web che include un widget di un social network (come un pulsante "Mi piace" di Facebook), il social network può impostare un cookie di terze parti. Questo cookie può essere usato per tracciare la tua attività su tutti i siti che integrano quel widget, fornendo dati utili per il marketing e la pubblicità.
## Utilizzo dei cookies in PHP
PHP rende facile lavorare con i cookies grazie a funzioni integrate per impostarli, leggerli ed eliminarli.
### Impostare un cookie
Per impostare un cookie in PHP, si utilizza la funzione `setcookie()`. Questa funzione deve essere chiamata **prima di qualsiasi output** HTML, poiché i cookies vengono inviati come parte dell'intestazione HTTP.
**Sintassi**:
```php
setcookie(name, value, expire, path, domain, secure, httponly);
```
**Esempio**:
```php
<?php
// Impostare un cookie che dura 7 giorni utilizzando la funzione time che ci da l'ora attuale e
// aggiungendo 7*24*60*60 secondi da ora.
setcookie("preferenzaTema", "scuro", time() + (7 * 24 * 60 * 60), "/");
?>
```
- **`name`**: il nome del cookie.
- **`value`**: il valore del cookie.
- **`expire`**: il timestamp UNIX che indica quando scadrà il cookie (qui è impostato a 7 giorni).
- **`path`**: il percorso per cui il cookie è valido (`"/"` significa l'intero dominio).
- **`secure`**: se impostato su `true`, il cookie sarà inviato solo tramite connessioni HTTPS e non connessioni HTTP.
- **`httponly`**: se impostato su `true`, il cookie non sarà accessibile tramite JavaScript, migliorando la sicurezza contro attacchi XSS.
### Leggere un cookie
I cookies inviati dal client al server possono essere letti utilizzando la variabile superglobale `$_COOKIE`.
**Esempio**:
```php
<?php
if (isset($_COOKIE['preferenzaTema'])) {
echo "Il tema preferito è: " . $_COOKIE['preferenzaTema'];
} else {
echo "Nessuna preferenza di tema impostata.";
}
?>
```
### Eliminare un cookie
Per eliminare un cookie, è sufficiente impostarlo con una data di scadenza passata.
**Esempio**:
```php
<?php
// Eliminare il cookie 'preferenzaTema'
setcookie("preferenzaTema", "", time() - 3600, "/");
?>
```