Sessione, in informatica e telecomunicazioni, è un termine che può essere utilizzato per indicare: il colloquio tra utente ed elaboratore su un determinato argomento, tipicamente un'applicazione software; l'attività svolta tra due entità per trasferire dati in entrambi i sensi per tutta la durata del collegamento ovvero compreso all'interno del tempo di connessione tra le entità stesse. Con il suo significato di base il termine è entrato in questi ambiti intorno agli anni settanta. Si parla di livello di sessione nel caso si parli di modello OSI.
Sessione Web In inglese, la parola "sessione" si riferisce a un periodo di tempo discreto durante il quale viene eseguita un'attività. Una sessione web è quindi il tempo che un utente trascorre navigando su un determinato sito web: dal momento in cui arriva sulla prima pagina, al momento in cui lascia il sito.
Una sessione web è costituita da dati o file che sono persistenti durante l'uso di un sito web o di un'applicazione web. Queste risorse sono identificate in modo univoco con un ID di sessione. Il browser dell'utente riceve questo ID all'inizio di una nuova sessione e questo ID viene scambiato durante ogni successiva comunicazione tra il browser e il server.
Una sessione web include tutte le informazioni che possono essere rilevanti durante la visita dell'utente. A seconda dello scopo del sito Web o dell'applicazione Web, ciò può includere dati come:
Le pagine visualizzate dall'utente I dettagli di contatto che l'utente ha inserito in un modulo Gli articoli nel carrello degli acquisti dell'utente
Di solito esiste un limite di tempo massimo per le sessioni web, dopo il quale la sessione scadrà. Questo limite di tempo massimo dipende dall'attuazione. Ad esempio, le sessioni web in Google Analytics scadono dopo 30 minuti di inattività; l'ulteriore attività dell'utente verrà trattata come una nuova sessione.
I siti Web e le applicazioni Web con un numero molto elevato di utenti spesso memorizzano nella cache le sessioni Web, in modo che possano essere recuperate in modo più rapido ed efficiente.
I vantaggi dell'utilizzo delle sessioni web sono evidenti: le sessioni web consentono al sito web di avere una qualche forma di "memoria a breve termine" sull'attività di un utente.
Da un lato, non avere alcuna memoria degli utenti sarebbe estremamente scomodo. Se un sito Web di e-commerce non è in grado di ricordare le azioni di un utente, ad esempio, gli utenti dovrebbero effettuare ordini di e-commerce tutti in una volta all'interno di una singola azione, invece di memorizzare gli articoli in un carrello della spesa.
D'altra parte, anche avere una memoria troppo lunga può essere poco pratico. Ad esempio, se un utente torna su un sito di e-commerce dopo un mese, potrebbe non voler vedere gli stessi articoli nel carrello degli acquisti dell'ultima volta.
Le sessioni web rappresentano un equilibrio tra questi due estremi. Le sessioni Web a breve termine forniscono ai siti Web e alle applicazioni Web una "memoria" sufficiente per creare esperienze utente coinvolgenti e personalizzate nel corso della visita di un utente, senza memorizzare troppe informazioni irrilevanti a lungo termine.
Le sessioni Web vengono spesso confrontate (e confuse con) i cookie. Sebbene sia i cookie che le sessioni web memorizzino informazioni su un utente, le loro funzioni sono diverse nella pratica.
I cookie sono file di testo che vengono utilizzati per autenticare e tenere traccia dei visitatori di un sito Web e che vengono memorizzati solo sulla macchina dell'utente. La durata di un cookie è in genere molto più lunga di quella di una sessione web, nell'ordine di mesi o addirittura anni. I cookie sono il modo in cui i siti Web memorizzano le informazioni dell'utente a lungo termine che dovrebbero essere preservate: ad esempio, accedendo automaticamente all'utente quando arriva al sito Web o compilando automaticamente un modulo con i dettagli dell'utente.
Al contrario, le sessioni web hanno lo scopo di memorizzare informazioni solo sulle attività più recenti dell'utente. Le sessioni Web vengono archiviate sul server anziché sul client, il che consente di impedire agli utenti malintenzionati di modificarle. Sia le sessioni web che i cookie possono essere utilizzati in combinazione per tenere traccia del comportamento a lungo e breve termine degli utenti.
Funzionamento
Il ciclo di sessione comprende tre fasi: Avvio o apertura: Si avvia uno scambio di informazioni tra l'utente (od anche il client) che intende avvalersi di un servizio e il server che sovraintende tale servizio. La procedura più nota e comune è quella di login. Il server prepara e memorizza un pacchetto di informazioni permanenti che diventeranno i parametri di sessione e, per l'utente, i suoi dati di lavoro per tutta la sessione (solitamente i dati preparati dal server vengono inseriti nei cookie, che a loro volta vengono scaricati dai web Browser e sfruttati per mantenere la sessione del servizio attivo, senza dover ogni volta reinserire i dati manualmente.)
Lavoro in sessione: Il colloquio prosegue, sempre con lo scambio delle informazioni di sessione. Le tipiche applicazioni per il web prevedono spesso che nell'arco della sessione parte di queste informazioni possano essere variate o aggiunte di nuove.
Chiusura: Su richiesta dell'utente o del client il server cancella le informazioni di sessione. In assenza di una specifica richiesta, nella gran parte delle applicazioni è prevista la chiusura o fine automatica di sessione, dopo un certo tempo in cui l'utente/client non invia alcun messaggio.
Autenticazione Web, gestione delle sessioni e controllo degli accessi Una sessione Web è una sequenza di richieste HTTP di rete e transazioni di risposta associate allo stesso utente. Le applicazioni Web moderne e complesse richiedono la conservazione delle informazioni o dello stato di ciascun utente per la durata di più richieste. Pertanto, le sessioni forniscono la possibilità di stabilire variabili, come diritti di accesso e impostazioni di localizzazione, che si applicheranno a ogni interazione che un utente ha con l'applicazione web per la durata della sessione.
Le applicazioni Web possono creare sessioni per tenere traccia degli utenti anonimi dopo la prima richiesta dell'utente. Un esempio potrebbe essere il mantenimento della preferenza della lingua dell'utente. Inoltre, le applicazioni Web utilizzeranno le sessioni una volta che l'utente si è autenticato. Ciò garantisce la capacità di identificare l'utente su eventuali richieste successive oltre a poter applicare controlli di sicurezza di accesso, accesso autorizzato ai dati privati dell'utente e aumentare l'usabilità dell'applicazione. Pertanto, le attuali applicazioni Web possono fornire funzionalità di sessione sia prima che dopo l'autenticazione.
Una volta stabilita una sessione autenticata, l'ID sessione (o token) è temporaneamente equivalente al metodo di autenticazione più forte utilizzato dall'applicazione, come nome utente e password, passphrase, password monouso (OTP), certificati digitali basati su client, smartcard o dati biometrici (come impronte digitali o retina oculare).
HTTP è un protocollo senza stato (RFC2616 sezione 5), in cui ogni coppia di richieste e risposte è indipendente da altre interazioni web. Pertanto, al fine di introdurre il concetto di sessione, è necessario implementare funzionalità di gestione della sessione che colleghino sia i moduli di autenticazione che di controllo di accesso (o autorizzazione) comunemente disponibili nelle applicazioni web:
L'ID di sessione o il token associa le credenziali di autenticazione dell'utente (sotto forma di una sessione utente) al traffico HTTP dell'utente e ai controlli di accesso appropriati applicati dall'applicazione web. La complessità di questi tre componenti (autenticazione, gestione della sessione e controllo degli accessi) nelle moderne applicazioni web, oltre al fatto che la sua implementazione e associazione risiede nelle mani dello sviluppatore web (poiché i framework di sviluppo web non forniscono relazioni strette tra questi moduli), rende molto impegnativa l'implementazione di un modulo di gestione delle sessioni sicuro. La divulgazione, l'acquisizione, la previsione, la forza bruta o la fissazione dell'ID di sessione porteranno ad attacchi di dirottamento della sessione (o sidejacking), in cui un utente malintenzionato è in grado di impersonare completamente un utente vittima nell'applicazione web. Gli aggressori possono eseguire due tipi di attacchi di dirottamento della sessione, mirati o generici. In un attacco mirato, l'obiettivo dell'aggressore è impersonare un utente vittima dell'applicazione Web specifico (o privilegiato). Per gli attacchi generici, l'obiettivo dell'aggressore è impersonare (o ottenere l'accesso come) qualsiasi utente valido o legittimo nell'applicazione web.
ID di sessione Per mantenere lo stato autenticato e tenere traccia dei progressi degli utenti all'interno dell'applicazione web, le applicazioni forniscono agli utenti un identificatore di sessione (ID sessione o token) che viene assegnato al momento della creazione della sessione e viene condiviso e scambiato dall'utente e dall'applicazione web per tutta la durata della sessione (viene inviato ad ogni richiesta HTTP). L'ID sessione è una coppia name=value.
Con l'obiettivo di implementare ID di sessione protetti, la generazione di identificatori (ID o token) deve soddisfare le seguenti proprietà.
Fingerprinting del nome dell'ID Il nome utilizzato dall'ID di sessione non deve essere estremamente descrittivo né offrire dettagli non necessari sullo scopo e sul significato dell'ID.
I nomi degli ID di sessione utilizzati dai framework di sviluppo di applicazioni Web più comuni possono essere facilmente rilevati tramite fingerprint, come PHPSESSID(PHP), JSESSIONID(J2EE), CFID& CFTOKEN(ColdFusion), ASP.NET_SessionId(ASP.NET), ecc. Pertanto, il nome dell'ID di sessione può rivelare il tecnologie e linguaggi di programmazione utilizzati dall'applicazione web.
Si consiglia di modificare il nome dell'ID di sessione predefinito del framework di sviluppo Web con un nome generico, ad esempio id.
Lunghezza ID sessione L'ID sessione deve essere sufficientemente lungo da impedire attacchi di forza bruta, in cui un utente malintenzionato può passare attraverso l'intero intervallo di valori ID e verificare l'esistenza di sessioni valide.
La lunghezza dell'ID sessione deve essere almeno 128 bit (16 byte).
La lunghezza dell'ID di sessione di 128 bit viene fornita come riferimento in base alle ipotesi fatte nella sezione successiva Entropia dell'ID di sessione. Tuttavia, questo numero non deve essere considerato un valore minimo assoluto, poiché altri fattori di implementazione potrebbero influenzarne la forza. Ad esempio, esistono implementazioni ben note, come ID di sessione Microsoft ASP.NET: "L'identificatore di sessione ASP.NET è un numero generato in modo casuale codificato in una stringa di 24 caratteri composta da caratteri minuscoli dalla A alla Z e da numeri da 0 a 5 ". Può fornire un'entropia efficace molto buona e, di conseguenza, può essere considerato abbastanza lungo da evitare supposizioni o attacchi di forza bruta.
Entropia (ID sessione) L'ID di sessione deve essere imprevedibile (abbastanza casuale) per evitare attacchi di indovinazione, in cui un utente malintenzionato è in grado di indovinare o prevedere l'ID di una sessione valida attraverso tecniche di analisi statistica. A tal fine, è necessario utilizzare un buon CSPRNG (Cryptographically Secure Pseudorandom Number Generator).
Il valore dell'ID di sessione deve fornire almeno l'entropia 64 bit (se viene utilizzato un buon PRNG, questo valore è stimato essere la metà della lunghezza dell'ID di sessione).