Token web JSON
JSON Web Token ( JWT ) este un standard deschis ( RFC 7519 ) pentru crearea de jetoane de acces bazate pe formatul JSON . Utilizat de obicei pentru a transfera date pentru autentificare în aplicațiile client-server. Token-urile sunt create de server, semnate cu o cheie secretă și transferate clientului, care apoi folosește acest token pentru a-și verifica identitatea.
Istorie
În 2011 s-a format grupul JOSE (grup JSON Object Signing and Encryption), al cărui scop a fost standardizarea mecanismului de protecție a integrității, criptarea, precum și formatul cheilor și al algoritmilor de autentificare pentru a asigura interoperabilitatea serviciilor de securitate folosind JSON. format. Până în 2013, liniile informale și exemplele de utilizare a ideilor acestui grup au apărut în domeniul public, care au devenit ulterior standarde RFC : JWT, JWS, JWE, JWK și JWA.
JWT a fost standardizat oficial de IETF în mai 2015. [unu]
Structura
Jetonul JWT constă din trei părți: antet (antet), încărcătură utilă (sarcină utilă) și date de semnătură sau de criptare. Primele două elemente sunt obiecte JSON cu o anumită structură. Al treilea element se calculează pe baza primilor și depinde de algoritmul ales (poate fi omis dacă se folosește un JWT nesemnat). Tokenurile pot fi re-codificate într-o reprezentare compactă (JWS/JWE Compact Serialization): algoritmul de codificare Base64-URL este aplicat antetului și încărcăturii utile , după care se adaugă o semnătură și toate cele trei elemente sunt separate prin puncte ("." ).
De exemplu, pentru un antet și o sarcină utilă care arată astfel:
{
"alg" : "HS512" ,
"typ" : "JWT"
}
{
"sub" : "12345" ,
"name" : "John Gold" ,
"admin" : true
}
Obținem următoarea reprezentare compactă (liniile noi sunt adăugate pentru claritate):
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJKb2huIEdvbGQiLCJhZG1pbiI6dHJ1ZX0K.
LIHjWCBORSWMEibq-tnT8ue_deUqZx1K0XxCOXZRrBI
Titlu
Antetul conține informațiile necesare pentru a descrie simbolul în sine.
Există o singură cheie necesară aici:
- alg: algoritmul utilizat pentru semnare / criptare (în cazul unui JWT nesemnat, se folosește valoarea „ none ”).
Chei opționale:
- tip: tipul jetonului ( tip ). Folosit atunci când jetoanele sunt amestecate cu alte obiecte care au anteturi JOSE. Trebuie să fie „ JWT ”.
- cty: tip de conținut . Dacă jetonul conține chei de utilizator în plus față de cheile de serviciu înregistrate, atunci această cheie nu ar trebui să fie prezentă. În caz contrar, ar trebui să fie „ JWT ” [2]
Sarcină utilă
Această secțiune conține informații despre utilizator (de exemplu, numele utilizatorului și nivelul de acces), iar unele chei de serviciu pot fi, de asemenea, utilizate. Toate sunt optionale:
- iss: Un șir sau URI care ține cont de majuscule și minuscule, care este identificatorul unic al părții care generează simbolul ( emitent ).
- sub: Un șir sau URI care ține cont de majuscule și minuscule, care este identificatorul unic al părții despre care acest token conține informații despre ( subiect ). Valorile cu această cheie trebuie să fie unice în contextul părții care generează JWT.
- aud: o matrice de șiruri de caractere sau URI care țin cont de majuscule și minuscule, care este o listă a destinatarilor simbolului dat. Când partea de primire primește un JWT cu cheia dată, trebuie să verifice prezența ei înșiși în destinatari - în caz contrar, ignorați jetonul ( audiența ).
- exp: O oră în format Unix Time care determină când simbolul va deveni invalid ( expirare ).
- nbf: spre deosebire de cheia exp, acesta este un timp Unix care determină când simbolul devine valid ( nu înainte ).
- jti: Un șir care specifică identificatorul unic pentru acest token ( JWT ID ). [3]
- iat: ora în format Unix Time indicând momentul în care a fost creat jetonul. iat și nbf pot să nu se potrivească, de exemplu, dacă jetonul a fost creat mai devreme decât momentul în care ar trebui să devină valid ( emis la ).
Utilizare în aplicații client-server
Accesați și reîmprospătați jetoanele
- Un token de acces este un token care îi acordă proprietarului acces la resursele serverului securizate. De obicei, are o durată de viață scurtă și poate conține informații suplimentare, cum ar fi adresa IP a părții care solicită simbolul.
- Jetonul de reîmprospătare este un token care permite clienților să solicite noi token-uri de acces după ce durata lor de viață a expirat. Aceste jetoane sunt de obicei emise pentru o perioadă lungă de timp.
Schema de lucru
De regulă, atunci când utilizați jetoane JSON în aplicații client-server, este implementată următoarea schemă:
- Clientul este autentificat în aplicație (de exemplu, folosind un login și o parolă)
- În cazul autentificării cu succes, serverul trimite token-uri de acces și reîmprospătare către client.
- Când accesează în continuare serverul, clientul folosește un token de acces. Serverul verifică validitatea jetonului și oferă clientului acces la resurse
- Dacă jetonul de acces devine invalid, clientul trimite un jeton de reîmprospătare, ca răspuns la care serverul oferă două jetoane reîmprospătate.
- Dacă jetonul de reîmprospătare devine invalid, clientul trebuie să treacă din nou prin procesul de autentificare (clauza 1). [patru]
Beneficii
JWT are o serie de avantaje față de abordarea stocării sesiunilor emise pe server și în cookie -uri pe partea clientului:
- Când utilizați JWT, nu este necesar să fie stocate date suplimentare despre sesiunile emise: tot ce trebuie să facă serverul este să verifice semnătura.
- Este posibil ca serverul să nu fie implicat în crearea de jetoane, dar să ofere acest lucru serviciilor externe.
- Tokenurile JSON pot stoca informații suplimentare utile despre utilizatori. Rezultatul este o performanță mai mare. În cazul cookie-urilor, uneori este necesar să se facă solicitări pentru mai multe informații. Când utilizați JWT, aceste informații pot fi transmise în simbolul în sine. [5]
- JWT face posibilă furnizarea de acces simultan la diferite domenii și servicii. [6] [7]
Posibile atacuri
Eliminarea semnăturii
Indicatorul JSON este format din trei părți, care sunt codificate independent una de cealaltă. Astfel, devine posibilă eliminarea semnăturii din token și modificarea antetului pentru a face JWT nesemnat. Dacă serverul nu verifică semnătura jetonului, atunci un atacator își poate specifica propriile valori în sarcina utilă. Problema este rezolvată prin simpla aruncare a obiectelor nesemnate. [opt]
CSRF
Una dintre metodele de combatere a CSRF este adăugarea antetelor speciale cu informații criptate care confirmă că cererea a fost trimisă de la un server de încredere. Astfel, dacă JWT nu este folosit ca cookie, un atac CSRF devine imposibil. [9]
XSS
Tokenurile JSON pot fi stocate în browser în două moduri: în stocarea DOM sau în cookie -uri . În primul caz, sistemul poate fi susceptibil la un atac XSS , deoarece JavaScript are acces la stocarea DOM și un atacator poate extrage jetonul de acolo pentru utilizare ulterioară în numele utilizatorului. Când utilizați cookie-uri, puteți seta marcajul HttpOnly, care împiedică JavaScript să acceseze magazinul. Astfel, atacatorul nu va putea extrage jetonul și aplicația devine protejată de XSS. [zece]
JWS
Tokenurile JSON semnate sunt descrise de specificația JWS ( RFC 7515 ).
Algoritmi de semnătură acceptați
Semnătura antetului și a sarcinii utile este realizată de următorii algoritmi:
Algoritmul necesar pentru suportul tuturor implementărilor:
Algoritmi recomandați:
Sunt acceptate și variații ale algoritmilor recomandați folosind SHA-384 și respectiv SHA-512:
- HS384, HS512
- RS384 , RS512
- ES384 , ES512
Abrevierile cu caractere cursive sunt nume folosite în jetoanele JSON așa cum este descris de specificația JWA ( RFC 7518 ) [11]
Structura antetului
În cazul unui JWT semnat, chei suplimentare pot fi adăugate la antet:
- jku: URI la setul de chei publice în format JSON utilizat pentru a semna acest token ( JSON Web Key Set URL ).
- jwk: cheia folosită pentru a semna acest token ( cheie web JSON ).
- kid: identificatorul unic pentru cheie de utilizat atunci când este specificat un set de chei (ID cheie).
- x5u : URI-ul pentru setul de certificate X.509 . Primul certificat din set trebuie să fie cel folosit pentru a semna acest simbol ( URL X.509) .
- x5c: matrice de certificate X.509 în format JSON utilizată pentru a semna acest token ( lanț de certificate X.509) .
- x5t: certificat X.509 SHA-1 amprentă digitală .
- crit: O matrice de șiruri de caractere cu numele cheilor de antet date care urmează să fie analizate de parserul JWT. Dacă toate cheile trebuie procesate, atunci nu este folosită ( critic ). [12]
Implementări
Implementările JWT există în următoarele limbaje și cadre de programare: Clojure , .NET , Go , Haskell , Python , Java , JavaScript , Lua , Perl , PHP , Ruby , Rust , Scala , D , Erlang , Common Lisp și Elixir . [13]
Note
- ↑ Manual JWT v0.13.0, pp.6-7 . auth0.com. Consultat la 11 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Bradley, John, Sakimura, Nat, Jones, Michael. Token web JSON (JWT), p. 11 (engleză) . tools.ietf.org. Preluat la 20 decembrie 2017. Arhivat din original la 16 iunie 2019.
- ↑ Bradley, John, Sakimura, Nat, Jones, Michael. Token web JSON (JWT), c. 9-10 (engleză) . tools.ietf.org. Preluat la 20 decembrie 2017. Arhivat din original la 16 iunie 2019.
- ↑ Manual JWT v0.13.0, p. 18 (engleză) . auth0.com. Consultat la 20 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Ryan Boyd. Noțiuni introductive cu OAuth 2.0 . - O'Reilly media, 2012. - P. 56 .
- ↑ Manual JWT v0.13.0, p. 9-11 (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Justin Richer și Antonio Sanso. OAuth 2 în acțiune. - Manning Publications, 2017. - S. 252-253. — 360 s. — ISBN 9781617293276 .
- ↑ Manual JWT v0.13.0, p. 9 (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Manual JWT v0.13.0, p. 10 (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Manual JWT v0.13.0, p. 11-12 (engleză) . auth0.com. Consultat la 20 decembrie 2017. Arhivat din original la 15 iulie 2018.
- ↑ Bradley, John, Sakimura, Nat, Jones, Michael. Token web JSON (JWT), p. 16 (engleză) . tools.ietf.org. Preluat la 20 decembrie 2017. Arhivat din original la 16 iunie 2019.
- ↑ Bradley, John, Sakimura, Nat, Jones, Michael. Semnătura web JSON (JWS), c. 9-14 (engleză) . tools.ietf.org. Consultat la 20 decembrie 2017. Arhivat din original la 12 septembrie 2017.
- ↑ auth0.com. JWT.IO (engleză) . jwt.io. Consultat la 20 decembrie 2017. Arhivat din original la 25 octombrie 2017.
Link -uri