• jwt
  • auth
  • tunnistus
  • identiteetti
  • api
  • openid
  • oauth

Mikä on JSON Web Token (JWT)?

Saavuta selkeä ymmärrys JSON Web Tokenin (JWT) perusteista viidessä minuutissa.

Gao
Gao
Founder

JSON Web Token (JWT) on laajasti käytetty nykyaikaisissa verkkosovelluksissa ja avoimissa standardeissa, kuten OpenID Connect, helpottaen todennusta ja valtuutusta. Vaikka virallinen RFC 7519 toimii olennaisena viitteenä, se voi olla haastavaa aloittelijoille. Tässä artikkelissa keskitymme JWT:n ydinkonsepteihin ja esitämme ne selkeällä kielellä esimerkkien avulla.

Miksi tarvitsemme JWT:a?

Nykyään on melko yleistä käyttää JSONia datan vaihtamiseen kahden osapuolen välillä. Mieti JSON-objektia, joka edustaa käyttäjää:

sub on lyhenne sanasta "subject" ja se on standardiväittämä OpenID Connectissä edustamaan käyttäjätunnistetta (käyttäjä-ID).

Miten voimme taata tämän JSON-objektin eheys? Toisin sanoen, miten voimme varmistaa, että dataa ei ole muokattu siirron aikana? Yleinen ratkaisu on käyttää digitaalisia allekirjoituksia. Esimerkiksi voimme käyttää julkisen avaimen salausta: palvelin allekirjoittaa JSON-objektin omalla yksityisellä avaimellaan ja asiakas voi tarkistaa allekirjoituksen palvelimen julkisella avaimella.

Lyhyesti sanottuna, JWT tarjoaa standardoidun lähestymistavan edustamaan JSON-objektia ja sen allekirjoitusta.

JWT:n muoto

Koska digitaalisia allekirjoituksia voidaan luoda monin algoritmein, on tarpeen määritellä algoritmi, jota käytetään JWT:n allekirjoittamiseen. Tämä toteutetaan rakentamalla JSON-objekti:

alg on lyhenne sanasta "algorithm" ja typ on lyhenne sanasta "type".

Tyypillisesti typ asetetaan isolla JWT:ksi. Esimerkissämme alg on HS256, joka tarkoittaa HMAC-SHA256 (selitämme sen pian) ja osoittaa, että käytämme tätä algoritmia allekirjoituksen luomiseen.

Nyt meillä on kaikki ainekset JWT:lle:

  • Otsikko JSON: Algoritmi ja tyyppi
  • Kuorma JSON: Varsinainen data
  • Allekirjoitus: Allekirjoitus, joka kattaa otsikon ja kuorman

Tiettyjen merkkien, kuten välilyöntien ja rivinvaihtojen, takia ne eivät ole verkonsiirtoystävällisiä. Siksi otsikko ja kuorma on Base64URL-koodattava. Tyypillinen JWT näyttää tältä:

. toimii erotinmerkkinä.

Kootaan kaikki yhteen ja luodaan JWT:

Otsikko

JSON: {"alg":"HS256","typ":"JWT"}

Base64URL-koodattu: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Kuorma

JSON: {"sub":"foo","name":"John Doe"}

Base64URL-koodattu: eyJzdWIiOiJmb28iLCJuYW1lIjoiSm9obiBEb2UifQ

Allekirjoitus

HMAC-SHA256:ssa allekirjoitus luodaan salaisuudella:

Esimerkiksi, salaisuus "some-great-secret" tekee allekirjoituksesta: XM-XSs2Lmp76IcTQ7tVdFcZzN4W_WcoKMNANp925Q9g.

JWT

Lopullinen JWT on:

Tämän pätevän JWT:n voi tarkistaa mikä tahansa osapuoli, jolla on salaisuus hallussa.

Allekirjoitusalgoritmin valinta

Kuten aiemmin mainittiin, digitaalisia allekirjoituksia voidaan luoda eri algoritmein. Käytimme esimerkkinä HS256:a, mutta se ei välttämättä ole tarpeeksi vahva, sillä salaisuus on jaettava osapuolten välillä (esim. asiakas ja palvelin).

Todellisissa tilanteissa asiakkaat voivat sisältää julkisia sovelluksia, kuten React-sovelluksia, jotka eivät voi säilyttää salaisuutta turvassa. Tämän seurauksena suositeltava lähestymistapa on käyttää julkisen avaimen salausta (asymmetristä salausta) JWT:n allekirjoittamiseen. Aloitetaan suosituimmasta algoritmista: RSA.

RSA

RSA, epäsymmetrinen algoritmi, käyttää avainparia: julkista avainta ja yksityistä avainta. Julkista avainta käytetään allekirjoituksen tarkistamiseen, kun taas yksityistä avainta käytetään allekirjoittamiseen.

Otsikko JSON RSA:n osalta näyttää tältä:

RS256 tarkoittaa RSA-SHA256, mikä tarkoittaa, että allekirjoitus luodaan RSA-algoritmilla ja SHA256-hajautustoiminnolla. Voit myös käyttää RS384 ja RS512 luomaan allekirjoituksia SHA384 ja SHA512 hajautustoiminnoilla vastaavasti.

Allekirjoitus luodaan yksityisellä avaimella:

Jälleen kerran, voimme koota nämä osat luodaksemme JWT:n, ja lopullinen JWT näyttää tältä:

Nyt asiakas voi tarkistaa allekirjoituksen tietämättä yksityistä avainta.

ECDSA

Vaikka RSA on laajasti hyväksytty, se kärsii suuremmista allekirjoituskokoluista, jotka joskus ylittävät yhdistetyn otsikon ja kuorman koon. Elliptinen käyrä digitaalinen allekirjoitusalgoritmi (ECDSA) on toinen epäsymmetrinen algoritmi, joka voi luoda kompaktimpia allekirjoituksia ja on suorituskykyisempi.

Luodaksemme yksityisen avaimen ECDSA:lle, meidän on valittava käyrä. Tämä on artikkelin rajojen ulkopuolella, mutta voit löytää lisää tietoa täältä.

Otsikko JSON ECDSA:n osalta näyttää tältä:

ES256 tarkoittaa ECDSA-SHA256, mikä tarkoittaa, että allekirjoitus luodaan ECDSA-algoritmilla ja SHA256-hajautustoiminnolla. Voit myös käyttää ES384 ja ES512 luodaksesi allekirjoituksia SHA384 ja SHA512 hajautustoiminnoilla vastaavasti.

Allekirjoitus luodaan yksityisellä avaimella:

Lopullinen JWT säilyttää saman rakenteen kuin RSA mutta merkittävästi lyhyemmällä allekirjoituksella:

Tarkista JWT

JWT:n tarkistaminen on yksinkertaista, sillä se on käänteinen prosessi JWT:n luomiselle:

  1. Jaa JWT kolmeen osaan (otsikko, kuorma ja allekirjoitus) käyttämällä . -erotinmerkkiä.
  2. Purkaa otsikko ja kuorma Base64URL:llä.
  3. Tarkista allekirjoitus otsikossa määritellyllä algoritmilla ja julkisella avaimella (asymmetrisille algoritmeille).

On monia kirjastoja, joita on saatavilla auttamaan JWT:n tarkistuksessa, kuten jose Node.js:lle ja verkkoselaimille.

Yhteenveto

Tässä artikkelissa selitimme lyhyesti JWT:n ydinkonseptit sekä yhteenvedon siitä, miten se luodaan ja tarkistetaan. Monet yksityiskohdat jäivät tutkimatta, ja käsittelemme ne tulevissa artikkeleissa.

Logto hyödyntää avoimia standardeja kuten JWT ja OpenID Connect turvaten sovelluksesi ja API:si yksinkertaistetuilla työnkuluilla jokaiselle kehittäjälle. Jos olet kiinnostunut, voit kokeilla sitä ilmaiseksi (ei vaadi luottokorttia).