Ce este un JWT? Decodare nu înseamnă verificare
Un JSON Web Token (JWT) este format din trei bucăți de text unite prin puncte: un antet, un payload și o semnătură. Primele două sunt doar codificate, nu criptate, deci oricine deține tokenul le poate citi. Semnătura îi permite unui server să verifice că un emitent de încredere a emis tokenul și că nimeni nu l-a modificat. Decodarea unui token îți spune ce conține. Doar verificarea îți spune dacă poți avea încredere în el.
Decodificator JWTToken expirat sau valid?Încearcă gratuitCele trei părți
Un token arată ca header.payload.signature. Prima parte a tokenului exemplu cunoscut de pe jwt.io este:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Fiecare dintre primele două părți este JSON convertit în base64url, o formă de text sigură pentru URL-uri. Prima parte se decodează la:
{"alg":"HS256","typ":"JWT"}
Payload-ul aceluiași exemplu se decodează la:
{"sub":"1234567890","name":"John Doe","iat":1516239022}
Payload-ul conține revendicările, adică afirmații despre utilizator sau sesiune. Semnătura se calculează din primele două părți și dintr-o cheie, deci dacă schimbi un singur caracter, ea nu mai corespunde. Base64url se inversează fără nicio cheie, așa că nu pune niciodată o parolă, o cheie privată sau date personale într-un payload.
Revendicările înregistrate
RFC 7519, standardul pentru JWT, rezervă câteva nume scurte de revendicări:
iss(emitent): cine a creat tokenul.sub(subiect): despre cine este tokenul, de obicei un ID de utilizator.aud(audiență): serviciul căruia îi este destinat tokenul.exp(data expirării): momentul după care tokenul nu mai este valid.nbf(not before, adică nu înainte de): cel mai devreme moment în care tokenul este valid.iat(issued at, adică emis la): când a fost creat tokenul.
Timpul se exprimă în secunde de la 1 ianuarie 1970, ora UTC, numit timp Unix. Exemplul nu are exp, deci conform standardului nu expiră niciodată. Un token real ar trebui să aibă. Alte nume, precum role sau email, aparțin aplicației.
Decodarea nu înseamnă verificare
Decodarea împarte tokenul la puncte, inversează base64url și citește JSON-ul. Îți arată ce pretinde tokenul și face același lucru pentru un token falsificat, pentru că oricine poate scrie orice revendicări cu orice semnătură.
Verificarea recalculează semnătura cu cheia corectă și verifică dacă se potrivește. De asemenea, verifică dacă exp și nbf încadrează momentul actual și dacă iss și aud au valorile pe care le așteaptă serviciul. O aplicație care citește o revendicare role fără să verifice tokenul are încredere în oricine a scris tokenul. Este o greșeală frecventă.
HS256, RS256 și ES256
Valoarea alg numește metoda. Trei sunt frecvente:
- HS256 este HMAC cu SHA-256. Un singur secret comun semnează și verifică, deci secretul trebuie să rămână pe serverul care emite tokenurile.
- RS256 este o semnătură RSA cu SHA-256. Emitentul semnează cu o cheie privată, iar oricine are cheia publică poate verifica. Alte servicii pot verifica tokenuri fără să le poată crea.
- ES256 este o semnătură ECDSA cu curba P-256 și SHA-256. Funcționează ca RS256, cu chei și semnături mai mici.
Folosește HS256 când un singur serviciu emite și verifică tokenurile lui. Folosește RS256 sau ES256 când alte servicii trebuie să verifice tokenuri pe care nu le-au emis ele.
Probleme care vin din încrederea în antet
Antetul este scris de cel care trimite tokenul, deci verificatorul nu trebuie să-l lase să aleagă regulile.
alg: none. Un token fără semnătură poate declara"alg":"none". Unele biblioteci au acceptat odată astfel de tokenuri și au sărit peste verificare. Stabilește algoritmii permiși în propriul cod și nu-i lua niciodată din token.- Confuzia algoritmilor. Un server se așteaptă la RS256 și deține o cheie publică. Un atacator trimite un token HS256 semnat cu acea cheie publică drept secret HMAC. Un verificator care acceptă orice algoritm numit în antet îl acceptă. Leagă fiecare cheie de exact un algoritm.
- Secrete slabe. Atacatorul are antetul, payload-ul și semnătura, deci poate testa offline secrete candidate. Un secret scurt sau un cuvânt comun cade repede în fața unei astfel de liste. RFC 7518 precizează că o cheie HS256 ar trebui să aibă cel puțin 256 de biți și să fie aleatoare.
Lipirea unui token de producție pe un site
Un token valid și neexpirat funcționează pentru oricine îl deține, până expiră. Tratează-l ca pe o parolă. Înainte să lipești unul pe un site, află dacă site-ul îl trimite unui server. Un instrument care rulează în întregime în fila browserului nu are nevoie să o facă. Poți verifica orice pagină urmărind cererile de rețea din uneltele pentru dezvoltatori ale browserului.
Tokenurile de obicei nu pot fi revocate înainte de expirare, decât dacă serverul ține o listă. Dacă un token activ se scurge, cere serviciului să revoce sesiunea sau să-și rotească cheile. Când poți, folosește pentru depanare un token din mediul de test. Decodificator JWT citește cele trei părți în fila browserului tău, iar nimic din ce lipești nu este trimis nicăieri.
Webhookuri: aceeași idee, cu un secret comun
Majoritatea furnizorilor de webhookuri trimit, într-un antet, un HMAC al corpului cererii, calculat cu un secret pe care îl împărtășești cu ei. Receptorul tău calculează același HMAC și compară cele două valori. Erorile frecvente sunt mici. JSON-ul este reformatat înainte de hashing, deci octeții se schimbă. Secretul de test este folosit pe trafic real. Sau semnăturile sunt comparate cu egalitatea obișnuită a șirurilor, ceea ce poate scurge informații despre timp. Folosește o comparație cu timp constant.
Verificator semnătură webhook calculează semnătura din secretul și corpul pe care le lipești, pentru GitHub, Stripe, Slack, Shopify sau orice schemă HMAC, ca să vezi dacă cele două valori se potrivesc.
Răspunsuri rapide
Un JWT este criptat?
Nu. Un JWT standard este semnat, iar oricine îi poate citi antetul și payload-ul. Doar semnătura îl protejează împotriva modificărilor.
Ce se întâmplă dacă editez payload-ul?
Semnătura nu mai corespunde, deci un server care verifică respinge tokenul. Citirea revendicărilor nu verifică semnătura, așa că decodorul tot îți arată versiunea editată.
Tradus din Original în engleză cu ajutorul AI.
Comentarii
Încă nu sunt comentarii. Fii primul.


