JSON Web Token: erinevus redaktsioonide vahel
Loodud lehekülje "JSON Web Token" tõlkimisel |
Resümee puudub |
||
1. rida: | 1. rida: | ||
⚫ | '''JSON Web Token''' ('''JWT''', hääldatakse /dʒɒt/, või "džot"<ref name="rfc7519">{{Netiviide|autor=Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura|url=https://datatracker.ietf.org/doc/html/rfc7519|pealkiri=JSON Web Token (JWT)|väljaanne=datatracker.ietf.org|aeg=2015. aasta mai|vaadatud=10. jaanuar 2022|keel=Inglise keeles}}</ref>) on väljapakutud [[internetistandard]] andmete loomiseks koos [[Digitaalallkiri|digitaalallkirja]] ja/või [[Šifreerimine|krüpteerimisega]], mis sisaldab [[JSON|JSON]]-i, mis omakorda seab ette teatud arvu [[Väidetepõhine identiteet|väiteid]]. Tõendid allkirjastatakse [[Avaliku võtmega krüptograafia|avaliku ja salajase võtmega]]. |
||
⚫ | Näiteks võib server luua tõendi, millel on väide "sisse logitud administraatorina" ning anda selle [[Klient (infotehnoloogia)|kliendile]]. Klient saab seejärel tõendit kasutada tõestamaks, et on sisse logitud administraatorina. Tõendeid saab allkirjastada ühe osapoole salajase võtmega (tavaliselt serveri omaga) nii, et sama osapool saab hiljem kontrollida tõendi õigsust. Kui teisel osapoolel on sobival ja usaldusväärsel viisil olemas vastav avalik võti, on ka teine osapool võimeline kontrollima tõendi õigsust. Tõendid on loodud kompaktselt<ref>{{Raamatuviide|autor=Jochen Nickel|aasta=2016|pealkiri=Mastering Identity and Access Management with Microsoft Azure|isbn=9781785887888|lehekülg=84|url=https://books.google.com/books?id=Q4dcDgAAQBAJ&pg=PA84|keel=Inglise keeles}}</ref>, [[Internetiaadress|URL]]-i jaoks turvaliselt<ref name="jwtintro">{{Netiviide|keel=Inglise keeles|url=https://jwt.io/introduction/|pealkiri=JWT.IO - JSON Web Tokens Introduction|väljaanne=jwt.io|vaadatud=10. jaanuar 2022}}</ref> ning kasutamiseks eelkõige [[Brauser|veebibrauseri]] [[Ühekordne sisselogimine|ühekordse sisselogimise]] (''single sign-on,'' SSO) kontekstis.<ref>{{Netiviide|autor=Chris Sevilleja|url=https://scotch.io/tutorials/the-anatomy-of-a-json-web-token|pealkiri=The Anatomy of a JSON Web Token|keel=Inglise keeles|vaadatud=10. jaanuar 2022}}</ref><ref>{{Netiviide|url=https://developer.atlassian.com/cloud/jira/platform/understanding-jwt-for-connect-apps/|pealkiri=Understanding JWT for Connect apps|keel=Inglise keeles|väljaanne=developer.atlassian.com|vaadatud=10. jaanuar 2022}}</ref> |
||
⚫ | '''JSON Web Token''' ('''JWT''', hääldatakse /dʒɒt/, või "džot"<ref name="rfc7519">{{Netiviide|autor=Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura|url=https://datatracker.ietf.org/doc/html/rfc7519|pealkiri=JSON Web Token (JWT)|väljaanne=datatracker.ietf.org|aeg=2015. aasta mai|vaadatud=10. jaanuar 2022}}</ref>) on |
||
JWT tugineb teistele JSON-il põhinevatele standarditele: [[JSON-i veebisignatuur|JSON Web Signature]] ja [[JSON-i veebikrüpteerimine|JSON Web Encryption]].<ref name="rfc7519" /><ref>{{Netiviide|keel=Inglise keeles|url=https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41|pealkiri=draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)|väljaanne=tools.ietf.org|vaadatud=10. jaanuar 2022}}</ref><ref>{{Netiviide|keel=Inglise keeles|url=https://tools.ietf.org/html/draft-ietf-jose-json-web-encryption-40|pealkiri=draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)|väljaanne=tools.ietf.org|vaadatud=10. jaanuar 2022}}</ref> |
|||
⚫ | Näiteks võib server luua tõendi, millel on väide "sisse logitud administraatorina" ning anda selle [[Klient (infotehnoloogia)|kliendile]]. Klient saab seejärel tõendit kasutada tõestamaks, et on sisse logitud administraatorina. Tõendeid saab allkirjastada ühe osapoole salajase võtmega (tavaliselt serveri omaga) nii, et |
||
JWT tõendid on Eestis kasutusel riigi autentimisteenuses (TARA), millega on võimalik e-teenusestes autentida kasutades [[ID-kaart]]i, [[mobiil-ID]]-d või [[smart-ID]]-d.<ref>{{Netiviide|url=https://e-gov.github.io/TARA-Doku/|pealkiri=Riigi autentimisteenus (TARA)|väljaanne=Riigi Infosüsteemi Amet (RIA)|vaadatud=10. jaanuar 2022}}</ref><ref>{{Netiviide|https://e-gov.github.io/TARA-Doku/TehnilineKirjeldus|pealkiri=Tehniline kirjeldus|väljaanne=Riigi Infosüsteemi Amet (RIA)|vaadatud=10. jaanuar 2022}}</ref> |
|||
JWT tugineb teistele JSON-il põhinevatele standarditele: [[JSON-i veebisignatuur|JSON Web Signature]] ja [[JSON-i veebikrüpteerimine|JSON Web Encryption]] .<ref name="rfc7519">{{Cite IETF|title=JSON Web Token (JWT)|rfc=7519|last1=Jones|first1=Michael B.|last2=Bradley|first2=Bradley|last3=Sakimura|first3=Sakimura|date=May 2015|publisher=[[Internet Engineering Task Force|IETF]]|doi=10.17487/RFC7519|issn=2070-1721}}<cite class="citation cs1" data-ve-ignore="true" id="CITEREFJonesBradleySakimura2015">Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (May 2015). [https://datatracker.ietf.org/doc/html/rfc7519 ''JSON Web Token (JWT)'']. [[Interneti-tehnoloogia töörühm|IETF]]. [[DOI|doi]]:<span class="cs1-lock-free" title="Freely accessible">[[doi:10.17487/RFC7519|10.17487/RFC7519]]</span>. [[Rahvusvaheline jadaväljaande standardnumber|ISSN]] [//www.worldcat.org/issn/2070-1721 2070-1721]. [[Kommentaarinõue|RFC]] [https://datatracker.ietf.org/doc/html/rfc7519 7519].</cite></ref><ref name=":1">{{Cite web|url=https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41|title=draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)|website=tools.ietf.org|access-date=10. jaanuar 2022}}</ref><ref name=":2">{{Cite web|url=https://tools.ietf.org/html/draft-ietf-jose-json-web-encryption-40|title=draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)|website=tools.ietf.org|access-date=10. jaanuar 2022}}</ref> |
|||
== Struktuur == |
== Struktuur == |
||
{| class="wikitable" |
{| class="wikitable" |
||
!Päis |
|||
| style="width: 24em;" |<syntaxhighlight lang="json">{ |
| style="width: 24em;" |<syntaxhighlight lang="json">{ |
||
"alg": "HS256", |
"alg": "HS256", |
||
17. rida: | 18. rida: | ||
<code>HS256</code> tähendab, et tõend on allkirjastatud algoritmiga HMAC-SHA256. |
<code>HS256</code> tähendab, et tõend on allkirjastatud algoritmiga HMAC-SHA256. |
||
Tavalised algoritmid mida kasutatakse on [[HMAC]] pluss [[SHA|SHA-256]] (HS256) ja [[Digitaalallkiri|RSA allkiri]] pluss SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 tutvustab veel teisigi kasutatavaid algoritme.<ref>{{ |
Tavalised algoritmid mida kasutatakse on [[HMAC]] pluss [[SHA|SHA-256]] (HS256) ja [[Digitaalallkiri|RSA allkiri]] pluss SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 tutvustab veel teisigi kasutatavaid algoritme.<ref>{{Netiviide|url=https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40|pealkiri=draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)|keel=Inglise keeles|väljaanne=tools.ietf.org|vaadatud=10. jaanuar 2022}}</ref> |
||
|- |
|- |
||
!Sisu |
|||
|<syntaxhighlight lang="json">{ |
|<syntaxhighlight lang="json">{ |
||
"loggedInAs": "admin", |
"loggedInAs": "admin", |
||
28. rida: | 29. rida: | ||
Selles näites on standardväli ''Issued At Time'' (väljastatud ajal, <code>iat</code>) ja lisaväli (logitud sisse kui, <code>loggedInAs</code>). |
Selles näites on standardväli ''Issued At Time'' (väljastatud ajal, <code>iat</code>) ja lisaväli (logitud sisse kui, <code>loggedInAs</code>). |
||
|- |
|- |
||
!Allkiri |
|||
|<syntaxhighlight lang="javascript"> |
|<syntaxhighlight lang="javascript"> |
||
HMAC_SHA256( |
HMAC_SHA256( |
||
38. rida: | 39. rida: | ||
|Valideerib tõendi turvaliselt. Allkiri luuakse šifreerides nii päis kui sisu kasutades Base64url kodeeringut (RFC 4648) ja ühendades need kasutades eraldajana punkti. Tulemus läbib seejärel päises kirjeldatud algoritmi, näites HMAC-SHA256. |
|Valideerib tõendi turvaliselt. Allkiri luuakse šifreerides nii päis kui sisu kasutades Base64url kodeeringut (RFC 4648) ja ühendades need kasutades eraldajana punkti. Tulemus läbib seejärel päises kirjeldatud algoritmi, näites HMAC-SHA256. |
||
|} |
|} |
||
Kõik kolm osa kodeeritakse seejärel uuesti kasutades Base64url kodeeringut, ning ühendatakse kokku kasutades eraldajana punkte JWT tõendi loomiseks: |
Kõik kolm osa kodeeritakse seejärel uuesti kasutades Base64url kodeeringut, ning ühendatakse kokku kasutades eraldajana punkte JWT tõendi loomiseks: |
||
<syntaxhighlight lang="javascript"> |
|||
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature) |
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature) |
||
</syntaxhighlight>Saadud JWT tõend ja "secretkey" ehk salajane võti loovad tõendi: |
</syntaxhighlight> |
||
Saadud JWT tõend ja "secretkey" ehk salajane võti loovad tõendi: |
|||
{{Pre|eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI}} |
{{Pre|eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI}} |
||
Saadud tõendi saab hõlpsasti [[HTML]]-i ja [[Hüperteksti edastusprotokoll|HTTP-]]<nowiki/>sse edasi anda.<ref name="jwtintro">{{Cite web|url=https://jwt.io/introduction/|title=JWT.IO - JSON Web Tokens Introduction|website=jwt.io|access-date=20 July 2018}}<cite class="citation web cs1" data-ve-ignore="true">[https://jwt.io/introduction/ "JWT.IO - JSON Web Tokens Introduction"]. ''jwt.io''<span class="reference-accessdate">. Retrieved <span class="nowrap">July 20,</span> 2018</span>.</cite></ref> |
|||
Saadud tõendi saab hõlpsasti [[HTML]]-i ja [[Hüperteksti edastusprotokoll|HTTP]]-sse edasi anda.<ref name="jwtintro" /> |
|||
⚫ | |||
⚫ | Kui kasutaja logib edukalt sisse luuakse ja tagastatakse JWT tõend, mis seejärel salvestatakse lokaalselt (tavaliselt lokaalsesse- või sessioonimällu, kuid kasutada saab ka [[HTTP-küpsis|küpsiseid]]). Võrdluseks luuakse traditsiooniselt sessioon serveris ning kasutajale tagastatakse vaid küpsis, millega kasutajat hiljem ära tunda. Kui tegemist on ilma kasutajata protsessiga võib klient autentida ka otse luues ja ise allkirjastades JWT tõend koos salajase võtmega ja anda see edasi [[OAuth]]-i toetavale teenusele: |
||
== Kasutamine == |
|||
⚫ | Kui kasutaja logib edukalt sisse luuakse ja tagastatakse JWT tõend, mis seejärel salvestatakse lokaalselt (tavaliselt lokaalsesse- või sessioonimällu, kuid kasutada saab ka [[HTTP-küpsis|küpsiseid]]). Võrdluseks luuakse traditsiooniselt sessioon serveris ning kasutajale tagastatakse vaid küpsis, millega kasutajat hiljem ära tunda. Kui tegemist on ilma kasutajata protsessiga võib klient autentida ka otse luues ja ise allkirjastades JWT tõend koos salajase võtmega ja anda see edasi [[OAuth]]-i toetavale teenusele: |
||
<syntaxhighlight lang="mime"> |
<syntaxhighlight lang="mime"> |
||
53. rida: | 57. rida: | ||
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb... |
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb... |
||
</syntaxhighlight> |
|||
⚫ | |||
⚫ | |||
<syntaxhighlight lang="json"> |
|||
{ |
{ |
||
"access_token": "eyJhb...", |
"access_token": "eyJhb...", |
||
59. rida: | 67. rida: | ||
"expires_in": 3600 |
"expires_in": 3600 |
||
} |
} |
||
</syntaxhighlight> |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
See on olekuta autentimismehhanism, kuna kasutaja olekut ei salvestata kunagi serveri mällu. Serveris kaitstud marsruudid otsivad päises kehtivat JWT tõendit ning kui see on olemas, antakse kliendile ligipääs kaitstud ressurssidele. Kuna JWT tõendid on iseseisvad, on kõik vajalikud andmed olemas ning andmebaasi ei pea tegema mitmeid päringuid. |
See on olekuta autentimismehhanism, kuna kasutaja olekut ei salvestata kunagi serveri mällu. Serveris kaitstud marsruudid otsivad päises kehtivat JWT tõendit ning kui see on olemas, antakse kliendile ligipääs kaitstud ressurssidele. Kuna JWT tõendid on iseseisvad, on kõik vajalikud andmed olemas ning andmebaasi ei pea tegema mitmeid päringuid. |
||
69. rida: | 80. rida: | ||
! Kirjeldus |
! Kirjeldus |
||
|- |
|- |
||
! colspan=" |
! colspan="3" | Tavalised väited |
||
| Järgmised standardväljad (väited) on väljad, mis tihtipeale leiduvad JWT sisus. |
|||
|- |
|- |
||
| <code>iss</code> |
| <code>iss</code> |
||
86. rida: | 96. rida: | ||
| <code>exp</code> |
| <code>exp</code> |
||
| Aegumisaeg |
| Aegumisaeg |
||
| Määrab aegumisaja, mille möödumisel '''ei''' tohi JWT-d töötlemiseks vastu võtta. Väärtus peab olema NumericDate, täis- või komakohaga arv, mis väljendab sekundeid peale 1. jaanuarit 1970 00:00 [[UTC]]. |
| Määrab aegumisaja, mille möödumisel '''ei''' tohi JWT-d töötlemiseks vastu võtta. Väärtus peab olema NumericDate, täis- või komakohaga arv, mis väljendab sekundeid peale 1. jaanuarit 1970 00:00:00 [[UTC]]. |
||
|- |
|- |
||
| <code>nbf</code> |
| <code>nbf</code> |
||
100. rida: | 110. rida: | ||
| Tõstutundlik unikaalne identifikaator tõendi tuvastamiseks, hoolimata väljastajast. |
| Tõstutundlik unikaalne identifikaator tõendi tuvastamiseks, hoolimata väljastajast. |
||
|- |
|- |
||
! colspan=" |
! colspan="3" | Tavaliselt kasutatavad päiseväljad |
||
| JWT päises kasutatakse tavaliselt järgmisi välju. |
|||
|- |
|- |
||
| <code>typ</code> |
| <code>typ</code> |
||
113. rida: | 122. rida: | ||
| <code>alg</code> |
| <code>alg</code> |
||
| Algoritm |
| Algoritm |
||
| Väljaandja võib enda valikul seada algoritmi, millega tõendil olevat allkirja ära tunda. Mõned algoritmid on ebaturvalised ning neid tuleks vältida.<ref name="auth0">{{ |
| Väljaandja võib enda valikul seada algoritmi, millega tõendil olevat allkirja ära tunda. Mõned algoritmid on ebaturvalised ning neid tuleks vältida.<ref name="auth0">{{Netiviide|autor=Tim McLean|url=https://www.chosenplaintext.ca/2015/03/31/jwt-algorithm-confusion.html|pealkiri=Critical vulnerabilities in JSON Web Token libraries|väljaanne=Auth0|aeg=31. märts 2015|vaadatud=10. jaanuar 2022|keel=Inglise keeles}}</ref> |
||
|- |
|- |
||
| <code>kid</code> |
| <code>kid</code> |
||
137. rida: | 146. rida: | ||
== Haavatavused == |
== Haavatavused == |
||
JWT tõendid võivad sisaldada sessiooni olekut, kuid kui projekti nõuded lubavad sessiooni kehtetuks tunnistamist enne JWT aegumist, ei saa teenused enam usaldada tõendi seatud väiteid tõendit kasutades. Sessiooni valideerimiseks peab seetõttu tõendi väiteid kontrollima andmebaasi abil. See tähendab aga, et tõend ei ole enam olekuta, mistõttu ei ole JWT kasutamisel enam eelist.<ref>{{ |
JWT tõendid võivad sisaldada sessiooni olekut, kuid kui projekti nõuded lubavad sessiooni kehtetuks tunnistamist enne JWT aegumist, ei saa teenused enam usaldada tõendi seatud väiteid tõendit kasutades. Sessiooni valideerimiseks peab seetõttu tõendi väiteid kontrollima andmebaasi abil. See tähendab aga, et tõend ei ole enam olekuta, mistõttu ei ole JWT kasutamisel enam eelist.<ref>{{Netiviide|autor=Sven Slootweg|url=http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/|pealkiri=Stop using JWT for sessions|väljaanne=joepie91 Ramblings|vaadatud=10. jaanuar 2022}}</ref> |
||
Turvakonsultant Tim McLean leidis mõnes JWT teegis haavatavused, mis kasutasid <code>alg</code> välja ebakorrektselt tõendite õigsuse kontrollimisel, tüüpiliselt tehes seda lubades <code>alg=none</code> tõendit. Kuigi nimetatud teekides on need haavatavused tänaseks prandatud, soovitab McLean <code>alg</code> väljast täielikult loobuda, et vältida tulevikus sarnaseid probleeme.<ref name="auth0" /> Uusi <code>alg=none</code> haavatavusi leitakse aga siiamaani.<ref>{{ |
Turvakonsultant Tim McLean leidis mõnes JWT teegis haavatavused, mis kasutasid <code>alg</code> välja ebakorrektselt tõendite õigsuse kontrollimisel, tüüpiliselt tehes seda lubades <code>alg=none</code> tõendit. Kuigi nimetatud teekides on need haavatavused tänaseks prandatud, soovitab McLean <code>alg</code> väljast täielikult loobuda, et vältida tulevikus sarnaseid probleeme.<ref name="auth0" /> Uusi <code>alg=none</code> haavatavusi leitakse aga siiamaani.<ref>{{Netiviide|url=https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=jwt+none|pealkiri=CVE - Search Results|väljaanne=cve.mitre.org|vaadatud=10. jaanuar 2022|keel=Inglise keeles}}</ref> |
||
⚫ | |||
* |
|||
<references /> |
Redaktsioon: 10. jaanuar 2022, kell 19:23
JSON Web Token (JWT, hääldatakse /dʒɒt/, või "džot"[1]) on väljapakutud internetistandard andmete loomiseks koos digitaalallkirja ja/või krüpteerimisega, mis sisaldab JSON-i, mis omakorda seab ette teatud arvu väiteid. Tõendid allkirjastatakse avaliku ja salajase võtmega.
Näiteks võib server luua tõendi, millel on väide "sisse logitud administraatorina" ning anda selle kliendile. Klient saab seejärel tõendit kasutada tõestamaks, et on sisse logitud administraatorina. Tõendeid saab allkirjastada ühe osapoole salajase võtmega (tavaliselt serveri omaga) nii, et sama osapool saab hiljem kontrollida tõendi õigsust. Kui teisel osapoolel on sobival ja usaldusväärsel viisil olemas vastav avalik võti, on ka teine osapool võimeline kontrollima tõendi õigsust. Tõendid on loodud kompaktselt[2], URL-i jaoks turvaliselt[3] ning kasutamiseks eelkõige veebibrauseri ühekordse sisselogimise (single sign-on, SSO) kontekstis.[4][5]
JWT tugineb teistele JSON-il põhinevatele standarditele: JSON Web Signature ja JSON Web Encryption.[1][6][7]
JWT tõendid on Eestis kasutusel riigi autentimisteenuses (TARA), millega on võimalik e-teenusestes autentida kasutades ID-kaarti, mobiil-ID-d või smart-ID-d.[8][9]
Struktuur
Päis | {
"alg": "HS256",
"typ": "JWT"
}
|
Tuvastab algoritmi, mille alusel allkiri luuakse
Tavalised algoritmid mida kasutatakse on HMAC pluss SHA-256 (HS256) ja RSA allkiri pluss SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 tutvustab veel teisigi kasutatavaid algoritme.[10] |
---|---|---|
Sisu | {
"loggedInAs": "admin",
"iat": 1422779638
}
|
Sisaldab väiteid. JWT spetsifikatsioonis on kirjeldatud seitset erinevat nime väidetele, mis on standardväljad ja leiduvad tõendites tihti. Samuti leidub lisavälju, mis tulenevad tõendi eesmärgist.
Selles näites on standardväli Issued At Time (väljastatud ajal, |
Allkiri | HMAC_SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)
|
Valideerib tõendi turvaliselt. Allkiri luuakse šifreerides nii päis kui sisu kasutades Base64url kodeeringut (RFC 4648) ja ühendades need kasutades eraldajana punkti. Tulemus läbib seejärel päises kirjeldatud algoritmi, näites HMAC-SHA256. |
Kõik kolm osa kodeeritakse seejärel uuesti kasutades Base64url kodeeringut, ning ühendatakse kokku kasutades eraldajana punkte JWT tõendi loomiseks:
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
Saadud JWT tõend ja "secretkey" ehk salajane võti loovad tõendi:
Saadud tõendi saab hõlpsasti HTML-i ja HTTP-sse edasi anda.[3]
Kasutamine
Kui kasutaja logib edukalt sisse luuakse ja tagastatakse JWT tõend, mis seejärel salvestatakse lokaalselt (tavaliselt lokaalsesse- või sessioonimällu, kuid kasutada saab ka küpsiseid). Võrdluseks luuakse traditsiooniselt sessioon serveris ning kasutajale tagastatakse vaid küpsis, millega kasutajat hiljem ära tunda. Kui tegemist on ilma kasutajata protsessiga võib klient autentida ka otse luues ja ise allkirjastades JWT tõend koos salajase võtmega ja anda see edasi OAuth-i toetavale teenusele:
POST /oauth2/token?
Content-type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb...
Kui klient annab edasi kehtiva JWT tõendi, loob server uue ligipääsutõendi access_token
, millega saab sooritada kutseid teenusele ja neid kliendile tagasi saata.
{
"access_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 3600
}
Kui klient soovib juurdepääsu kaitstud marsruudile või ressursile, peaks ta saatma JWT tõendi Authorization
päisesse, kasutades Bearer
skeemi.
Authorization: Bearer eyJhbGci ... < jne > ... yu5CSpyHI
See on olekuta autentimismehhanism, kuna kasutaja olekut ei salvestata kunagi serveri mällu. Serveris kaitstud marsruudid otsivad päises kehtivat JWT tõendit ning kui see on olemas, antakse kliendile ligipääs kaitstud ressurssidele. Kuna JWT tõendid on iseseisvad, on kõik vajalikud andmed olemas ning andmebaasi ei pea tegema mitmeid päringuid.
Standardväljad
Kood | Nimi | Kirjeldus |
---|---|---|
Tavalised väited | ||
iss
|
Väljaandja | Tuvastab JWT väljastanud printsipaali. |
sub
|
Teema | Tuvastab JWT teema. |
aud
|
Sihtrühm | Määrab adressaadid, kellele JWT on mõeldud. Iga JWT töötlemiseks mõeldud printsipaal peab tuvastama end sihtrühma väites oleva väärtusega. JWT tuleb vastasel juhul tagasi lükata. |
exp
|
Aegumisaeg | Määrab aegumisaja, mille möödumisel ei tohi JWT-d töötlemiseks vastu võtta. Väärtus peab olema NumericDate, täis- või komakohaga arv, mis väljendab sekundeid peale 1. jaanuarit 1970 00:00:00 UTC. |
nbf
|
Mitte varem kui | Määrab aja, millal hakatakse JWT-d töötlemiseks vastu võtma. Väärtus peab olema NumericDate. |
iat
|
Väljaandmise aeg | Tuvastab aja, millal JWT väljastati. Väärtus peab olema NumericDate. |
jti
|
JWT ID | Tõstutundlik unikaalne identifikaator tõendi tuvastamiseks, hoolimata väljastajast. |
Tavaliselt kasutatavad päiseväljad | ||
typ
|
Tõendi tüüp | Kui see on defineeritud, peab selle väärtus vastama registreeritud IANA meediumitüübile . |
cty
|
Sisu tüüp | Kui kasutatakse pesastatud allkirjastamist või krüpteerimist, on soovitatav määrata selle väärtuseks JWT ; muul juhul tuleks seda välja mitte kasutada.[1]
|
alg
|
Algoritm | Väljaandja võib enda valikul seada algoritmi, millega tõendil olevat allkirja ära tunda. Mõned algoritmid on ebaturvalised ning neid tuleks vältida.[11] |
kid
|
Võtme ID | Vihje, mis näitab, millist võtit klient tõendi allkirja loomiseks kasutas. Server sobitab selle väärtuse failis oleva võtmega, et kontrollida allkirja kehtivust ja tõendi õigsust. |
x5c
|
x.509 sertifikaadiahel | Sertifikaat RFC4945-vormingus, mis vastab salajasele võtmele, mida kasutatakse tõendi allkirja genereerimiseks. Server kasutab seda teavet allkirja kehtivuse ja tõendi õigsuse kontrollimiseks. |
x5u
|
x.509 sertifikaadiahela URL | Internetiaadress, kust server saab hankida sertifikaadiahela, mis vastab tõendi allkirja genereerimiseks kasutatud salajasele võtmele. Server hangib selle teabe ja kasutab seda allkirja õigsuse kontrollimiseks. |
crit
|
Kriitiline | Päiste loend, millest server peab aru saama, et tõend kehtivaks tunnistada. |
Kood | Nimi | Kirjeldus |
Haavatavused
JWT tõendid võivad sisaldada sessiooni olekut, kuid kui projekti nõuded lubavad sessiooni kehtetuks tunnistamist enne JWT aegumist, ei saa teenused enam usaldada tõendi seatud väiteid tõendit kasutades. Sessiooni valideerimiseks peab seetõttu tõendi väiteid kontrollima andmebaasi abil. See tähendab aga, et tõend ei ole enam olekuta, mistõttu ei ole JWT kasutamisel enam eelist.[12]
Turvakonsultant Tim McLean leidis mõnes JWT teegis haavatavused, mis kasutasid alg
välja ebakorrektselt tõendite õigsuse kontrollimisel, tüüpiliselt tehes seda lubades alg=none
tõendit. Kuigi nimetatud teekides on need haavatavused tänaseks prandatud, soovitab McLean alg
väljast täielikult loobuda, et vältida tulevikus sarnaseid probleeme.[11] Uusi alg=none
haavatavusi leitakse aga siiamaani.[13]
Viited
- ↑ 1,0 1,1 1,2 Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (2015. aasta mai). "JSON Web Token (JWT)". datatracker.ietf.org (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: kontrolli kuupäeva väärtust:|aeg=
(juhend)CS1 hooldus: mitu nime: autorite loend (link) CS1 hooldus: tundmatu keel (link) - ↑ Jochen Nickel (2016). Mastering Identity and Access Management with Microsoft Azure (Inglise keeles). Lk 84. ISBN 9781785887888.
{{raamatuviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ 3,0 3,1 "JWT.IO - JSON Web Tokens Introduction". jwt.io (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ Chris Sevilleja. "The Anatomy of a JSON Web Token" (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ "Understanding JWT for Connect apps". developer.atlassian.com (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ "draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)". tools.ietf.org (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ "draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)". tools.ietf.org (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ "Riigi autentimisteenus (TARA)". Riigi Infosüsteemi Amet (RIA). Vaadatud 10. jaanuar 2022.
- ↑ "Tehniline kirjeldus". Riigi Infosüsteemi Amet (RIA).
{{netiviide}}
: eiran teksti "https://e-gov.github.io/TARA-Doku/TehnilineKirjeldus" (juhend); parameeter|vaadatud=
nõuab parameetrit|url=
(juhend); puuduv või tühi|url=
(juhend) - ↑ "draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)". tools.ietf.org (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ 11,0 11,1 Tim McLean (31. märts 2015). "Critical vulnerabilities in JSON Web Token libraries". Auth0 (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link) - ↑ Sven Slootweg. "Stop using JWT for sessions". joepie91 Ramblings. Vaadatud 10. jaanuar 2022.
- ↑ "CVE - Search Results". cve.mitre.org (Inglise keeles). Vaadatud 10. jaanuar 2022.
{{netiviide}}
: CS1 hooldus: tundmatu keel (link)