Cos'è jwt?

JWT (JSON Web Token)

Un JWT (JSON Web Token) è uno standard industriale RFC 7519 che definisce un metodo compatto e autonomo per trasmettere informazioni in modo sicuro tra le parti come un oggetto JSON. Queste informazioni possono essere verificate e attendibili perché sono firmate digitalmente. I JWT possono essere firmati usando un algoritmo segreto (con l'algoritmo HMAC) o usando una coppia di chiavi pubblica/privata usando RSA o ECDSA.

I JWT sono comunemente usati per l'autenticazione e l'autorizzazione. In generale, quando un utente effettua il login, il server genera un JWT e lo restituisce al client. Il client quindi memorizza il JWT (solitamente in un cookie o nello storage locale) e lo include in ogni richiesta successiva al server. Il server quindi verifica il JWT per autenticare l'utente e autorizzarlo ad accedere alle risorse richieste.

Componenti di un JWT:

Un JWT è composto da tre parti, separate da punti (.):

  1. Header (Intestazione): L'header specifica l'algoritmo di hashing utilizzato per firmare il token, come HS256 (HMAC SHA256) o RS256 (RSA SHA256). Contiene anche il tipo di token, che è sempre "JWT".

  2. Payload (Carico utile): Il payload contiene le claims (affermazioni). Le claims sono affermazioni su un'entità (solitamente l'utente) e dati aggiuntivi. Esistono tre tipi di claims:

    • Registered claims: Insieme predefinito di chiavi suggerite ma non obbligatorie, come iss (issuer), sub (subject), aud (audience), exp (expiration time), nbf (not before), iat (issued at) e jti (JWT ID).
    • Public claims: Definite pubblicamente. Si consiglia di registrare queste claims nello IANA JSON Web Token Registry per evitare collisioni di nomi.
    • Private claims: Claims definite per condividere informazioni tra le parti che si sono accordate su di esse.
  3. Signature (Firma): La firma viene creata prendendo l'header codificato Base64Url, il payload codificato Base64Url, un segreto e l'algoritmo specificato nell'header, quindi firmando tutto questo. La firma viene utilizzata per verificare che il messaggio non sia stato modificato lungo il percorso e che il mittente del JWT sia chi dice di essere.

Esempio di JWT (struttura):

header.payload.signature

Vantaggi dei JWT:

  • Autonomi: Il JWT contiene tutte le informazioni necessarie sull'utente, evitando la necessità di effettuare query multiple al database per ogni richiesta.
  • Scalabili: Poiché lo stato dell'utente è contenuto nel JWT, il server non deve mantenere sessioni, facilitando la scalabilità orizzontale.
  • Sicuri: I JWT firmati digitalmente garantiscono l'integrità dei dati e l'autenticità del mittente.
  • Portabili: I JWT possono essere facilmente utilizzati in diverse applicazioni e piattaforme.

Considerazioni sulla sicurezza:

  • Mantenere segreto il segreto: Quando si utilizzano algoritmi simmetrici come HS256, il segreto utilizzato per firmare il JWT deve essere mantenuto strettamente confidenziale. La compromissione del segreto comprometterebbe la sicurezza di tutti i JWT firmati con esso.
  • Impostare una scadenza: È fondamentale impostare una data di scadenza (exp claim) per i JWT per limitare la finestra di vulnerabilità in caso di compromissione del token. Token con durata illimitata sono una pratica di sicurezza inaccettabile.
  • Non memorizzare informazioni sensibili nel payload: Sebbene il payload sia codificato in Base64Url, non è crittografato. Evitare di memorizzare informazioni sensibili come password o numeri di carta di credito nel payload.
  • Utilizzare HTTPS: Assicurarsi che tutte le comunicazioni che coinvolgono i JWT vengano eseguite tramite HTTPS per proteggere i token dall'intercettazione.

Concetti importanti:

  • Claims: Le Claims sono asserzioni su un'entità, utilizzate per trasmettere informazioni nel JWT.
  • JSON Web Signature (JWS): JWS è uno standard per la rappresentazione dei contenuti firmati digitalmente usando JSON. JWT utilizza JWS per firmare il token.
  • JSON Web Encryption (JWE): JWE è uno standard per la rappresentazione dei contenuti crittografati usando JSON. JWE può essere usato per crittografare il JWT, rendendolo più sicuro.
  • Algoritmi di firma: Comprendere i diversi Algoritmi%20di%20firma disponibili per JWT (es., HS256, RS256, ES256) e scegliere quello appropriato in base alle esigenze di sicurezza e alle capacità del sistema.
  • Refresh token: Un Refresh%20token è un token di lunga durata utilizzato per ottenere nuovi JWT. Questo consente di mantenere la sicurezza richiedendo all'utente di autenticarsi meno frequentemente, pur utilizzando JWT di breve durata per l'accesso alle risorse.

I JWT sono uno strumento potente per l'autenticazione e l'autorizzazione, ma è importante comprendere le implicazioni di sicurezza e utilizzarli correttamente per evitare vulnerabilità.