Mikä on JSON Web Token (JWT)?
Saavuta selkeä ymmärrys JSON Web Tokenin (JWT) perusteista viidessä minuutissa.
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" jatyp
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
jaRS512
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
jaES512
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:
- Jaa JWT kolmeen osaan (otsikko, kuorma ja allekirjoitus) käyttämällä
.
-erotinmerkkiä. - Purkaa otsikko ja kuorma Base64URL:llä.
- 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).