JWT (JSON Web Token) este un standard deschis (RFC 7519) care definește o modalitate compactă și autonomă de a transmite informații în siguranță între părți. Aceste informații pot fi verificate și de încredere, deoarece sunt semnate digital.
JWT este compus din trei părți, separate prin punct (.): Antet (Header), Sarcină utilă (Payload) și Semnătură (Signature). Antetul specifică algoritmul de semnătură, sarcina utilă conține declarații, iar semnătura este folosită pentru a verifica că mesajul nu a fost modificat.
Scenarii comune de utilizare JWT
Autentificare (cel mai frecvent scenariu), schimb de informații (JWT poate transmite informații în siguranță, deoarece pot fi semnate), autorizare (conține informații despre permisiunile utilizatorului) și implementarea single sign-on.
Tipuri de algoritmi de semnătură
JWT acceptă mai mulți algoritmi de semnătură, împărțiți în două categorii principale: algoritmi simetrici bazati pe HMAC (cum ar fi HS256) și algoritmi asimetrici bazati pe RSA/ECDSA (cum ar fi RS256, ES256). Algoritmii simetrici folosesc aceeași cheie pentru semnare și verificare, în timp ce algoritmii asimetrici folosesc o cheie privată pentru semnare și o cheie publică pentru verificare.
Nu stocați informații sensibile (cum ar fi parole) în JWT, deoarece partea de sarcină utilă este doar codificată în Base64, nu criptată. Pentru aplicații care necesită un nivel ridicat de securitate, se recomandă utilizarea unor perioade de expirare scurte și implementarea unei strategii de rotație a tokenurilor.
Ce se întâmplă când JWT expiră?
Când un JWT expiră, serverul va respinge acest token. Metoda recomandată este implementarea unui mecanism de token de reîmprospătare (Refresh Token), prin care clientul poate obține un nou token de acces fără a fi nevoie ca utilizatorul să se autentifice din nou. Tokenurile de reîmprospătare au de obicei o perioadă de valabilitate mai lungă, dar ar trebui stocate cu precauție.
Strict vorbind, JWT este proiectat să fie un token fără stare și nu poate fi revocat cu adevărat. Cu toate acestea, există câteva soluții comune: menținerea unei liste negre a tokenurilor revocate (ceea ce ar putea anula avantajul stateless al JWT), utilizarea unor perioade de expirare scurte în combinație cu tokenuri de reîmprospătare sau încorporarea unui identificator de versiune în token, pe care serverul îl poate folosi pentru a respinge versiunile vechi.
Diferența dintre JWT și sesiune?
JWT este un token autonom care conține toate informațiile necesare, fiind potrivit pentru sisteme distribuite, fără a necesita stocarea stării sesiunii pe server. Sesiunea se bazează pe stocarea pe partea de server, necesitând menținerea stării sesiunii, fiind mai potrivită pentru arhitecturi cu un singur server. JWT este mai prietenos cu extinderea, dar revocarea este complexă; sesiunea este ușor de revocat, dar are o scalabilitate mai slabă.