[Lv1] Qual è la Struttura di JWT?
Gli intervistatori spesso chiedono come follow-up: "Come appare un JWT? Perché è progettato così?" Comprendere la struttura, il metodo di codifica e il flusso di verifica ti aiuterà a rispondere rapidamente.
1. Panoramica Base
JWT (JSON Web Token) è un formato di token autocontenuto utilizzato per trasmettere informazioni in modo sicuro tra due parti. È composto da tre stringhe unite da .:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Scomponendolo, si tratta di tre segmenti JSON codificati in Base64URL:
- Header: Descrive l'algoritmo e il tipo utilizzati dal token.
- Payload: Contiene le informazioni dell'utente e i claim.
- Signature (Firma): Firmato con una chiave segreta per garantire che il contenuto non sia stato alterato.
2. Header, Payload e Signature nel Dettaglio
2.1 Header
{
"alg": "HS256",
"typ": "JWT"
}
alg: L'algoritmo di firma, ad es.HS256(HMAC + SHA-256),RS256(RSA + SHA-256).typ: Il tipo di token, tipicamenteJWT.
2.2 Payload
{
"sub": "1234567890",
"name": "Jane Doe",
"iat": 1516239022,
"exp": 1516242622,
"role": "admin"
}
- Claim Registrati (ufficialmente riservati, ma non obbligatori):
iss(Issuer): L'entità che ha emesso il tokensub(Subject): Il soggetto (di solito l'ID utente)aud(Audience): Il destinatario previstoexp(Expiration Time): Tempo di scadenza (timestamp Unix, in secondi)nbf(Not Before): Il token non è valido prima di questo momentoiat(Issued At): Il momento in cui il token è stato emessojti(JWT ID): Un identificatore univoco per il token
- Claim Pubblici / Privati: È possibile aggiungere campi personalizzati (ad es.
role,permissions), ma evitare di rendere il payload eccessivamente grande.
2.3 Signature (Firma)
Il processo di generazione della firma:
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
- I primi due segmenti vengono firmati utilizzando una chiave segreta (o chiave privata).
- Quando il server riceve il token, ricalcola la firma. Se corrisponde, conferma che il token non è stato alterato e che è stato emesso da una fonte legittima.
Nota: JWT garantisce solo l'integrità dei dati, non la riservatezza, a meno che non venga applicata una crittografia aggiuntiva.
3. Cos'è la Codifica Base64URL?
JWT utilizza Base64URL invece di Base64, con le seguenti differenze:
+viene sostituito con-, e/viene sostituito con_.- Il padding
=finale viene rimosso.
Questo garantisce che il token possa essere inserito in modo sicuro in URL, Cookie o Header senza problemi causati da caratteri speciali.
4. Panoramica del Flusso di Verifica
- Il client include
Authorization: Bearer <JWT>nell'header della richiesta. - Il server riceve il token e:
- Analizza l'Header e il Payload.
- Recupera l'algoritmo specificato da
alg. - Ricalcola la firma utilizzando il segreto condiviso o la chiave pubblica.
- Confronta le firme e controlla i campi temporali come
expenbf.
- Solo dopo che la verifica ha successo il server può considerare attendibile il contenuto del Payload.
5. Schema di Risposta per il Colloquio
"JWT è composto da tre parti — Header, Payload e Signature — unite da
.. L'Header descrive l'algoritmo e il tipo; il Payload contiene le informazioni dell'utente e campi standard comeiss,subeexp; la Signature firma le prime due parti con una chiave segreta per verificare che il contenuto non sia stato alterato. Il contenuto è JSON codificato in Base64URL, ma non è crittografato — solo codificato. Quindi i dati sensibili non dovrebbero essere inseriti direttamente al suo interno. Quando il server riceve il token, ricalcola la firma per il confronto. Se corrisponde e non è scaduto, il token è considerato valido."