Mitä JWT sisältää ja miksi dekoodaaminen ei ole tarkistamista
JSON Web Token (JWT) on kolme tekstipalaa, jotka on yhdistetty pisteillä: otsikko, sisältö ja allekirjoitus. Kaksi ensimmäistä on vain koodattu, ei salattu, joten kuka tahansa tokenin haltija voi lukea ne. Allekirjoituksen avulla palvelin voi tarkistaa, että luotettava taho on myöntänyt tokenin eikä kukaan ole muuttanut sitä. Tokenin dekoodaaminen kertoo, mitä se väittää. Vasta tarkistaminen kertoo, voiko siihen luottaa.
JWT-dekooderiToken vanhentunut vai voimassa?Tee se ilmaiseksiKolme osaa
Token näyttää tältä: header.payload.signature. Jwt.io-sivuston tunnetun esimerkkitokenin ensimmäinen osa on:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Kumpikin kahdesta ensimmäisestä osasta on JSON muutettuna base64url-muotoon, eli tekstiksi, joka sopii turvallisesti URL-osoitteisiin. Ensimmäinen osa dekoodautuu muotoon:
{"alg":"HS256","typ":"JWT"}
Saman esimerkin sisältö dekoodautuu muotoon:
{"sub":"1234567890","name":"John Doe","iat":1516239022}
Sisältö sisältää väitteet (claims) käyttäjästä tai istunnosta. Allekirjoitus lasketaan kahdesta ensimmäisestä osasta ja avaimesta, joten yhden merkin muuttaminen tekee siitä epäkelvon. Base64url-koodauksen voi purkaa ilman avainta, joten älä koskaan laita salasanaa, yksityistä avainta tai henkilötietoja sisältöön.
Rekisteröidyt väitteet
RFC 7519, JWT:n standardi, varaa muutaman lyhyen väitteen nimen:
iss(issuer): kuka tokenin loi.sub(subject): kenestä token kertoo, yleensä käyttäjätunnus.aud(audience): palvelu, jolle token on tarkoitettu.exp(expiration time): hetki, jonka jälkeen token on voimaton.nbf(not before): aikaisin hetki, jolloin token on voimassa.iat(issued at): milloin token luotiin.
Ajat ovat sekunteja kuluneena ajasta 1.1.1970 UTC, eli Unix-aikaa. Esimerkissä ei ole exp-kenttää, joten standardin mukaan se ei vanhene koskaan. Oikeassa tokenissa sellainen pitäisi olla. Muut nimet, kuten role tai email, kuuluvat sovellukselle.
Dekoodaaminen ei ole tarkistamista
Dekoodaus jakaa tokenin pisteiden kohdalta, purkaa base64url-koodauksen ja lukee JSON:n. Se näyttää, mitä token väittää, ja näyttää saman väärennetylle tokenille, koska kuka tahansa voi kirjoittaa mitä tahansa väitteitä millä tahansa allekirjoituksella.
Tarkistaminen laskee allekirjoituksen uudelleen oikealla avaimella ja vertaa sitä. Se tarkistaa myös, että nykyhetki on nbf:n ja exp:n välissä ja että iss ja aud ovat palvelun odottamia arvoja. Sovellus, joka lukee role-väitteen tarkistamatta tokenia, luottaa kuka tahansa tokenin kirjoittajaan. Tämä on yleinen virhe.
HS256, RS256 ja ES256
alg-arvo kertoo menetelmän. Kolme on yleisimmät:
- HS256 on HMAC-menetelmä SHA-256:lla. Yksi jaettu salaisuus sekä allekirjoittaa että tarkistaa, joten salaisuus täytyy pitää siinä palvelimessa, joka myöntää tokenit.
- RS256 on RSA-allekirjoitus SHA-256:lla. Myöntäjä allekirjoittaa yksityisellä avaimella, ja kuka tahansa julkisen avaimen haltija voi tarkistaa. Muut palvelut voivat tarkistaa tokeneita, vaikka eivät voi luoda niitä.
- ES256 on ECDSA-allekirjoitus P-256-käyrällä ja SHA-256:lla. Toimii kuten RS256, mutta avaimet ja allekirjoitukset ovat pienempiä.
Käytä HS256:ta, kun yksi palvelu sekä myöntää että tarkistaa tokeninsa. Käytä RS256:ta tai ES256:ta, kun muiden palveluiden täytyy tarkistaa tokeneita, joita ne eivät ole myöntäneet.
Ongelmat, jotka tulevat otsikon luottamisesta
Otsikon kirjoittaa tokenin lähettäjä, joten tarkistajan ei pidä antaa sen päättää sääntöjä.
alg: none. Tokeni ilman allekirjoitusta voi ilmoittaa"alg":"none". Jotkin kirjastot hyväksyivät aiemmin tällaisia tokeneita ja ohittivat tarkistuksen. Aseta sallitut algoritmit omassa koodissasi, älä ota niitä tokenista.- Algoritmin sekoittaminen. Palvelin odottaa RS256:ta ja tallentaa julkisen avaimen. Hyökkääjä lähettää HS256-tokenin, joka on allekirjoitettu tuon julkisen avaimen avulla HMAC-salaisuutena. Tarkistaja, joka hyväksyy minkä tahansa algoritmin otsikon nimeämänä, hyväksyy sen. Sido jokainen avain täsmälleen yhteen algoritmiin.
- Heikot salaisuudet. Hyökkääjällä on otsikko, sisältö ja allekirjoitus, joten hän voi testata ehdokassalaisuuksia ilman palvelinta. Lyhyt salaisuus tai yleinen sana murtuu tällaisella listalla nopeasti. RFC 7518 sanoo, että HS256-avaimen pitää olla vähintään 256 bittiä ja satunnainen.
Tuotantotokenin liittäminen verkkosivulle
Voimassa oleva token toimii kenelle tahansa, joka sen hallussaan pitää, kunnes se vanhenee. Kohtele sitä salasanana. Ennen kuin liität sen sivulle, selvitä, lähetetäänkö sivu sen palvelimelle. Työkalu, joka toimii kokonaan selaimen välilehdessä, ei tarvitse tätä. Voit tarkistaa minkä tahansa sivun seuraamalla sen verkkopyyntöjä selaimen kehittäjätyökaluista.
Tokenia ei yleensä voi peruuttaa ennen sen vanhenemista, ellei palvelin pidä listaa peruutetuista. Jos käytössä oleva token vuotaa, pyydä palvelua peruuttamaan istunto tai vaihtamaan avaimet. Käytä virheenjäljitykseen testiympäristön tokenia aina, kun voit. JWT-dekooderi lukee kolme osaa selaimen välilehdessä, eikä liittämääsi mitään lähetetä minnekään.
Webhookit: sama idea yhteisellä salaisuudella
Useimmat webhook-palveluntarjoajat lähettävät pyynnön rungon HMAC-tiivisteen otsikossa. Tiiviste on laskettu salaisuudella, jonka jaat heidän kanssaan. Vastaanottajasi laskee saman HMAC:n ja vertaa kahta arvoa. Yleiset virheet ovat pieniä. JSON muotoillaan uudelleen ennen tiivistämistä, jolloin tavut muuttuvat. Testisalaisuutta käytetään oikeaa liikennettä vastaan. Tai allekirjoituksia verrataan tavallisella merkkijonovertailulla, joka voi vuotaa ajoitustietoa. Käytä vakioaikaista vertailua.
Webhook-allekirjoituksen tarkistin laskee allekirjoituksen liittämästäsi salaisuudesta ja rungosta GitHubille, Stripelle, Slackille, Shopifylle tai mille tahansa HMAC-järjestelmälle, jotta näet, täsmäävätkö kaksi arvoa.
Pikavastaukset
Onko JWT salattu?
Ei. Tavallinen JWT on allekirjoitettu, ja kuka tahansa voi lukea sen otsikon ja sisällön. Vain allekirjoitus suojaa sitä muuttamiselta.
Mitä tapahtuu, jos muokkaan sisältöä?
Allekirjoitus ei enää täsmää, joten tarkistava palvelin hylkää tokenin. Väitteiden lukeminen ei tarkista allekirjoitusta, joten dekooderi näyttää silti muokatun versiosi.
Käännetty tekoälyn avulla: Englanninkielinen alkuperäisteos.
Kommentit
Ei vielä kommentteja. Ole ensimmäinen.


