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ă:

  1. Clientul este autentificat în aplicație (de exemplu, folosind un login și o parolă)
  2. În cazul autentificării cu succes, serverul trimite token-uri de acces și reîmprospătare către client.
  3. Când accesează în continuare serverul, clientul folosește un token de acces. Serverul verifică validitatea jetonului și oferă clientului acces la resurse
  4. 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.
  5. 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

  1. Manual JWT v0.13.0,  pp.6-7 . auth0.com. Consultat la 11 decembrie 2017. Arhivat din original la 15 iulie 2018.
  2. 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.
  3. 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.
  4. Manual JWT v0.13.0, p. 18  (engleză) . auth0.com. Consultat la 20 decembrie 2017. Arhivat din original la 15 iulie 2018.
  5. Ryan Boyd. Noțiuni introductive cu OAuth 2.0 . - O'Reilly media, 2012. - P.  56 .
  6. Manual JWT v0.13.0, p. 9-11  (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
  7. Justin Richer și Antonio Sanso. OAuth 2 în acțiune. - Manning Publications, 2017. - S. 252-253. — 360 s. — ISBN 9781617293276 .
  8. Manual JWT v0.13.0, p. 9  (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
  9. Manual JWT v0.13.0, p. 10  (engleză) . auth0.com. Preluat la 21 decembrie 2017. Arhivat din original la 15 iulie 2018.
  10. Manual JWT v0.13.0, p. 11-12  (engleză) . auth0.com. Consultat la 20 decembrie 2017. Arhivat din original la 15 iulie 2018.
  11. 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.
  12. 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.
  13. auth0.com. JWT.IO  (engleză) . jwt.io. Consultat la 20 decembrie 2017. Arhivat din original la 25 octombrie 2017.

Link -uri