JSON-verkkotunnus

JSON Web Token ( JWT ) on avoin standardi ( RFC 7519 ) JSON - muotoon perustuvien käyttöoikeuksien luomiseen . Käytetään tyypillisesti tietojen siirtämiseen todennusta varten asiakas-palvelinsovelluksissa. Palvelin luo tunnukset, allekirjoittaa ne salaisella avaimella ja siirtää ne asiakkaalle, joka sitten käyttää tätä merkkiä henkilöllisyytensä vahvistamiseen.

Historia

Vuonna 2011 perustettiin JOSE-ryhmä (JSON Object Signing and Encryption group), jonka tarkoituksena oli yhtenäistää eheyssuojausmekanismi, salaus sekä avainten ja todennusalgoritmien muoto, jotta varmistetaan JSON:ia käyttävien tietoturvapalvelujen yhteentoimivuus. muoto. Vuoteen 2013 mennessä julkisuuteen ilmestyivät epäviralliset linjaukset ja esimerkit tämän ryhmän ideoiden käytöstä, joista tuli myöhemmin RFC -standardeja : JWT, JWS, JWE, JWK ja JWA.

IETF standardoi JWT:n virallisesti toukokuussa 2015. [yksi]

Rakenne

JWT-tunnus koostuu kolmesta osasta: otsikko (otsikko), hyötykuorma (hyötykuorma) ja allekirjoitus- tai salausdata. Kaksi ensimmäistä elementtiä ovat tietyn rakenteen JSON-objekteja. Kolmas elementti lasketaan ensimmäisten perusteella ja riippuu valitusta algoritmista (se voidaan jättää pois, jos käytetään etumerkitöntä JWT:tä). Tokenit voidaan koodata uudelleen kompaktiksi esitykseksi (JWS/JWE Compact Serialization): Base64-URL- koodausalgoritmia sovelletaan otsikkoon ja hyötykuormaan , minkä jälkeen allekirjoitus lisätään ja kaikki kolme elementtiä erotetaan pisteillä ("." ).

Esimerkiksi otsikko ja hyötykuorma, jotka näyttävät tältä:

{ "alg" : "HS512" , "typ" : "JWT" ​​​​} { "sub" : "12345" , "name" : "John Gold" , "admin" : true }

Saamme seuraavan kompaktin esityksen (uusirivit on lisätty selvyyden vuoksi):

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJKb2huIEdvbGQiLCJhZG1pbiI6dHJ1ZX0K. LIHjWCBORSWMEibq-tnT8ue_deUqZx1K0XxCOXZRrBI

Otsikko

Otsikko sisältää tarvittavat tiedot itse tunnuksen kuvaamiseksi.

Tässä on vain yksi pakollinen avain:

Valinnaiset näppäimet:

  • typ: tunnuksen tyyppi ( type ). Käytetään, kun tunnuksia sekoitetaan muihin objekteihin, joissa on JOSE-otsikot. Täytyy olla " JWT ".
  • cty : sisältötyyppi . Jos tunnus sisältää käyttäjäavaimia rekisteröityjen palveluavaimien lisäksi, tämän avaimen ei pitäisi olla läsnä. Muuten pitäisi olla " JWT " ​​[2]

Hyötykuorma

Tämä osio sisältää käyttäjätietoja (esimerkiksi käyttäjänimen ja käyttöoikeustason), ja joitain palveluavaimia voidaan myös käyttää. Kaikki ne ovat valinnaisia:

  • iss: Kirjainkoolla erottuva merkkijono tai URI , joka on tunnuksen luovan osapuolen ( myöntäjä ) yksilöllinen tunniste.
  • sub: Kirjainkoolla erottuva merkkijono tai URI, joka on sen osapuolen yksilöivä tunniste, josta tämä tunnus sisältää tietoja ( aihe ). Tällä avaimella olevien arvojen on oltava ainutlaatuisia JWT:n luovan osapuolen kontekstissa.
  • aud: Joukko kirjainkokoa erottelevia merkkijonoja tai URI:ita, joka on luettelo tietyn tunnuksen vastaanottajista. Kun vastaanottava puoli vastaanottaa JWT:n annetulla avaimella, sen on tarkistettava itsensä läsnäolo vastaanottajissa - muuten jätä token huomioimatta ( audio ).
  • exp: Unix-aikamuodossa oleva aika , joka määrittää, milloin tunnuksesta tulee virheellinen ( vanheneminen ).
  • nbf: toisin kuin exp-avaimessa, tämä on Unix-aika , joka määrittää, milloin merkki tulee voimaan ( ei ennen ).
  • jti: Merkkijono, joka määrittää tämän tunnuksen yksilöllisen tunnisteen ( JWT ID ). [3]
  • iat: aika Unix -aikamuodossa, joka ilmaisee tunnuksen luomishetken. iat ja nbf eivät välttämättä täsmää, jos merkki on luotu aikaisemmin kuin silloin, kun sen pitäisi tulla voimaan ( myönnetty klo ).

Käyttö asiakas-palvelinsovelluksissa

Käytä ja päivitä tunnuksia

  • Käyttöoikeustunnus on tunnus, joka antaa omistajalleen pääsyn suojattuihin palvelinresursseihin. Sillä on yleensä lyhyt käyttöikä ja se voi sisältää lisätietoja, kuten tunnuksen pyytävän osapuolen IP-osoitteen .
  • Refresh token on tunnus, jonka avulla asiakkaat voivat pyytää uusia käyttöoikeuksia, kun niiden käyttöikä on umpeutunut. Nämä rahakkeet myönnetään yleensä pitkäksi ajaksi.

Työsuunnitelma

Yleensä kun käytetään JSON-tunnisteita asiakas-palvelinsovelluksissa, seuraava kaava toteutetaan:

  1. Asiakas tunnistetaan sovelluksessa (esimerkiksi käyttäjätunnuksella ja salasanalla)
  2. Jos todennus onnistuu, palvelin lähettää pääsy- ja päivitysvaltuudet asiakkaalle.
  3. Kun asiakas käyttää edelleen palvelinta, hän käyttää pääsytunnusta. Palvelin tarkistaa tunnuksen kelvollisuuden ja antaa asiakkaalle pääsyn resursseihin
  4. Jos käyttöoikeustunnus ei kelpaa, asiakas lähettää päivitystunnisteen, johon palvelin tarjoaa kaksi päivitettyä merkintää.
  5. Jos päivitystunnus tulee kelpaamattomaksi, asiakkaan on suoritettava todennusprosessi uudelleen (lauseke 1). [neljä]

Edut

JWT:llä on useita etuja verrattuna lähestymistapaan, joka tallentaa myönnetyt istunnot palvelimelle ja evästeisiin asiakaspuolella:

  • JWT:tä käytettäessä ei vaadita lisätietojen tallentamista myönnetyistä istunnoista: palvelimen tarvitsee vain tarkistaa allekirjoitus.
  • Palvelin ei saa olla mukana luomassa tokeneita, mutta antaa sen ulkoisille palveluille.
  • JSON-tunnukset voivat tallentaa lisää hyödyllisiä tietoja käyttäjistä. Tuloksena on parempi suorituskyky. Evästeiden tapauksessa on joskus tarpeen pyytää lisätietoja. Käytettäessä JWT:tä nämä tiedot voidaan välittää itse tunnuksessa. [5]
  • JWT mahdollistaa samanaikaisen pääsyn eri toimialueille ja palveluihin. [6] [7]

Mahdolliset hyökkäykset

Allekirjoituksen poisto

JSON-tunnus koostuu kolmesta osasta, jotka on koodattu toisistaan ​​riippumatta. Siten on mahdollista poistaa allekirjoitus tunnuksesta ja muuttaa otsikkoa niin, että JWT on allekirjoittamaton. Jos palvelin ei tarkista tunnuksen allekirjoitusta, hyökkääjä voi määrittää omat arvonsa hyötykuormaan. Ongelma ratkaistaan ​​yksinkertaisesti hylkäämällä allekirjoittamattomat objektit. [kahdeksan]

CSRF

Yksi tapa torjua CSRF :ää on lisätä erityisiä otsikoita, joissa on salattuja tietoja, jotka vahvistavat, että pyyntö on lähetetty luotetulta palvelimelta. Siten, jos JWT:tä ei käytetä evästeenä, CSRF-hyökkäys tulee mahdottomaksi. [9]

XSS

JSON-tunnukset voidaan tallentaa selaimeen kahdella tavalla: DOM-tallennustilaan tai evästeisiin . Ensimmäisessä tapauksessa järjestelmä voi olla alttiina XSS - hyökkäykselle, koska JavaScriptillä on pääsy DOM-tallennustilaan ja hyökkääjä voi poimia sieltä tunnuksen jatkokäyttöä varten käyttäjän puolesta. Evästeitä käytettäessä voit asettaa HttpOnly-lipun, joka estää JavaScriptiä pääsemästä kauppaan. Näin ollen hyökkääjä ei pysty purkamaan tunnusta ja sovellus suojataan XSS:ltä. [kymmenen]

JWS

Allekirjoitetut JSON-tunnisteet kuvataan JWS-spesifikaatiossa ( RFC 7515 ).

Tuetut allekirjoitusalgoritmit

Otsikon ja hyötykuorman allekirjoitus suoritetaan seuraavilla algoritmeilla:

Kaikkien toteutusten tukemiseen vaadittava algoritmi:

Suositeltavat algoritmit:

Suositeltujen algoritmien muunnelmia SHA-384:n ja SHA-512:n avulla tuetaan myös:

  • HS384, HS512
  • RS384 , RS512
  • ES384 , ES512

Kursiivilla merkityt lyhenteet ovat nimiä, joita käytetään JSON-tunnisteissa JWA-määrityksen ( RFC 7518 ) [11] mukaisesti.

Otsikkorakenne

Allekirjoitetun JWT:n tapauksessa otsikkoon voidaan lisätä lisäavaimia:

  • jku: URI julkisten avainten joukkoon JSON-muodossa, jota käytetään tämän tunnuksen allekirjoittamiseen ( JSON Web Key Set URL ).
  • jwk: Tämän tunnuksen allekirjoittamiseen käytetty avain ( JSON Web Key ).
  • lapsi: Avaimen yksilöivä tunniste, jota käytetään, kun avainjoukko ( Key ID) on määritetty.
  • x5u : X.509 -varmennejoukon URI . Sarjan ensimmäisen varmenteen on oltava se, jota käytetään tämän tunnuksen allekirjoittamiseen ( X.509 URL) .
  • x5c: JSON-muodossa olevien X.509-varmenteiden joukko, jota käytetään tämän tunnuksen allekirjoittamiseen ( X.509-varmenneketju) .
  • x5t: X.509 - sertifikaatti SHA-1-sormenjälki .
  • crit: Joukko merkkijonoja, joissa on annettujen otsikkoavainten nimet, jotka JWT-jäsentäjä jäsentää. Jos kaikki avaimet on käsiteltävä, sitä ei käytetä ( kriittinen ). [12]

Toteutukset

JWT-toteutuksia on olemassa seuraavilla ohjelmointikielillä ja -kehyksillä: Clojure , .NET , Go , Haskell , Python , Java , JavaScript , Lua , Perl , PHP , Ruby , Rust , Scala , D , Erlang , Common Lisp ja Elixir . [13]

Muistiinpanot

  1. JWT Handbook v0.13.0,  s.6-7 . auth0.com. Haettu 11. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  2. Bradley, John, Sakimura, Nat, Jones, Michael. JSON Web Token (JWT), s. 11  (englanniksi) . tools.ietf.org. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 16. kesäkuuta 2019.
  3. Bradley, John, Sakimura, Nat, Jones, Michael. JSON Web Token (JWT), c. 9-10  (englanniksi) . tools.ietf.org. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 16. kesäkuuta 2019.
  4. JWT Handbook v0.13.0, c. 18  (englanniksi) . auth0.com. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  5. Ryan Boyd. OAuth 2.0:n käytön aloittaminen . - O'Reilly media, 2012. - S.  56 .
  6. JWT Handbook v0.13.0, s. 9-11  (englanniksi) . auth0.com. Haettu 21. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  7. Justin Richer ja Antonio Sanso. OAuth 2 toiminnassa. - Manning Publications, 2017. - S. 252-253. – 360 s. — ISBN 9781617293276 .
  8. JWT Handbook v0.13.0, s. 9  (englanniksi) . auth0.com. Haettu 21. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  9. JWT Handbook v0.13.0, s. 10  (englanniksi) . auth0.com. Haettu 21. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  10. JWT Handbook v0.13.0, s. 11-12  (englanniksi) . auth0.com. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 15. heinäkuuta 2018.
  11. Bradley, John, Sakimura, Nat, Jones, Michael. JSON Web Token (JWT), s. 16  (englanniksi) . tools.ietf.org. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 16. kesäkuuta 2019.
  12. Bradley, John, Sakimura, Nat, Jones, Michael. JSON Web Signature (JWS), c. 9-14  (englanniksi) . tools.ietf.org. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 12. syyskuuta 2017.
  13. auth0.com. JWT.IO  (englanniksi) . jwt.io. Haettu 20. joulukuuta 2017. Arkistoitu alkuperäisestä 25. lokakuuta 2017.

Linkit