cookie vs sessione vs jwt


12

Sto leggendo sull'autenticazione / autorizzazione nelle applicazioni web. Qualcuno potrebbe confermare / correggere le mie conoscenze attuali?

  • Cookie: nella loro versione iniziale, un file di testo con un ID client univoco e tutte le altre informazioni necessarie sul client (ad es. Ruoli)

  • Sessione: solo un ID client univoco viene inviato in un file (chiamato anche cookie), tutto il resto viene archiviato sul server

  • JWT: tutto è memorizzato nel token (che potrebbe anche essere memorizzato in un file di testo, che è anche chiamato cookie)

Grazie per qualsiasi feedback!

Risposte:


12

Cookie: nella loro versione iniziale, un file di testo con un ID client univoco e tutte le altre informazioni necessarie sul client (ad es. Ruoli)

I cookie sono tuple key-valueoriginariamente indirizzate a conservare i dati relativi all'attività del cliente. Questa conservazione è ciò che conosciamo come stato della sessione o dell'applicazione . Fondamentalmente, sono stati creati per mantenere lo stato delle applicazioni web; più specificamente, lo stato sul lato client. (1)

I cookie vengono generalmente impostati dal server tramite le intestazioni di risposta ( Set-Cookie key=value). Tuttavia, possono essere impostati anche dal client. Ad esempio, da DOM ( document.cookie).

Una cosa importante da sapere sui cookie è che non identificano gli utenti. Piuttosto associano i dati terna - client - server / percorso . (3)

Di solito associamo i cookie ai file perché durante i primi giorni dei browser Web dovevano persistere i cookie in qualche modo, essendo i file il supporto più fattibile. I browser di oggi memorizzano i cookie (tra le altre cose) in archivi locali (DB incorporati).

Sessione: solo un ID client univoco viene inviato in un file (chiamato anche cookie), tutto il resto viene archiviato sul server.

Per sessione, immagino che intendi sessioni server . Come ho commentato, le sessioni possono essere implementate anche sul lato client. La differenza con le sessioni lato client è che i dati vengono archiviati da qualche parte sul lato server. (2) In tali scenari, ciò che otteniamo è un ID di sessione; e lo otteniamo sotto forma di cookie. Senza l'id di sessione, il server non sarebbe in grado di correlare le richieste in entrata con l'attività precedente del client. (3) Ad esempio l'utente autenticato, il carrello, ecc.

In ogni caso, un ID sessione non identifica necessariamente un utente. Associa uno stato specifico dell'applicazione a un client Web. Le sessioni potrebbero contenere o meno i dati dell'utente.

Nelle applicazioni distribuite, la sessione dovrebbe essere serializzabile per ovvi motivi. Se sono archiviati in memoria, l'archiviazione in memoria (componente) deve essere serializzabile. Una soluzione comune è quella di archiviare sessioni in file. O in NoSQL DB come Redis.

Per quanto riguarda la sicurezza. Le sessioni sul lato server sono più sicure rispetto al lato client. I clienti sono più vulnerabili alle minacce perché gli utenti di solito non sono consapevoli delle tante minacce a cui sono esposti. Almeno non l'utente normale.

D'altra parte, attaccare un'infrastruttura sul lato server non è una cosa di sorta.

JWT: tutto è memorizzato nel token (che potrebbe anche essere memorizzato in un file di testo, che è anche chiamato cookie)

Non proprio. JWT archivia i dati principalmente relativi all'autorizzazione e all'emittente del token.

Sebbene utilizzino per contenere l'ID utente (sotto), troviamo JWT che non identificano gli utenti autenticati. Ad esempio, token per le sessioni degli ospiti. Il contenuto principale dei JWT sono i reclami ; articoli da verificare tramite il processo di autorizzazione.

È importante tenere presente che i JWT non sono archivi globali . La sessione o lo stato dell'applicazione deve ancora essere archiviato da qualche parte e gestito in modo indipendente.

Per quanto riguarda i JWT, questi sono spesso memorizzati come cookie, sebbene possano essere memorizzati anche in archivi locali. Inoltre, la comunità OWASP considera sessionStorage il più sicuro per i browser web. Tuttavia, dipende dalla versione del browser .


1: Il World Wide Web è pensato per essere apolide. Se vogliamo creare applicazioni lato server senza stato, le sessioni dovrebbero essere archiviate da qualche parte nel lato client.

2: trasformazione dell'applicazione lato server in un'applicazione con stato .

3: client come applicazione, non come utente.


Id nota che alcuni, come la configurazione predefinita di Ruby on Rails, memorizzano l'intero oggetto "sessione" in un cookie (attualmente crittografato), che può semplicemente contenere qualcosa di simile user_ida un utente che ha effettuato l'accesso.
Fire Lancer

7

Cookie: nella loro versione iniziale, un file di testo con un ID client univoco e tutte le altre informazioni necessarie sul client (ad es. Ruoli)

La tua definizione di cookie non descrive realmente ciò che fanno. Un cookie è una coppia chiave-valore impostata tramite intestazione di risposta HTTP ( Set-Cookie) dal server e memorizzata dai client che li supportano. I cookie vengono restituiti con ogni successiva richiesta ( Cookienell'intestazione) per le richieste che corrispondono allo schema, host, percorso, https mentre il cookie non è scaduto. Puoi archiviare tutto ciò che desideri in un cookie e ti consente di supportare lo stato sul protocollo stateless HTTP.

Un esempio di scambio di cookie è simile al seguente:

inserisci qui la descrizione dell'immagine

Sessione: solo un ID client univoco viene inviato in un file (chiamato anche cookie), tutto il resto viene archiviato sul server

È praticamente giusto. Una sessione è costituita da dati archiviati sul lato server sulla sessione corrente di un utente. Per farlo funzionare in un protocollo senza stato come HTTP, l'utente deve inviare il proprio ID di sessione con ogni richiesta, in modo che il server possa recuperare la sessione corretta per l'utente. L'ID di sessione è in genere memorizzato in un cookie (vedi sopra). Questo non è un cookie diverso rispetto a qualsiasi altro cookie, i dati sono solo l'ID del server per la sessione dell'utente.

JWT: tutto è memorizzato nel token (che potrebbe anche essere memorizzato in un file di testo, che è anche chiamato cookie)

È praticamente vero. Tutto è memorizzato nel token. Il token può essere memorizzato in un cookie (vedi sopra). Questa è un'alternativa alle sessioni del server e funziona perché il token è firmato e verificato dal server, quindi non può essere modificato o forgiato ed è sicuro archiviarlo sul lato client.


Nella mia esperienza, i JWT non vengono normalmente memorizzati nei cookie. Potrebbero esserlo, ma più spesso li ho visti nelle loro stesse intestazioni (o spesso nell'intestazione di autorizzazione) sulla strada per il server e archiviati nella memoria o nella memoria locale o di sessione sul client.
Paul,

1
@Paul per quanto riguarda l'archiviazione locale. Dipende dal cliente. Non tutti i client e non tutte le versioni dei client più utilizzati supportano l'archiviazione Web. Dai un'occhiata qui . Se lo sono, è preferibile rendere i token stagionali . Ma se i nostri clienti non supportano l'archiviazione locale; Httponly cookies + SSL + fingerprint client ci forniscono un'implementazione abbastanza sicura.
Laiv

@Laiv non sono in disaccordo con te; solo che Samuel ha detto che "Il token è memorizzato in un cookie", e stavo solo cercando di osservare che non è sempre così.
Paolo,

@Paul Ho cambiato per leggere "... potrebbe essere memorizzato in un cookie"
Samuel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.