JSON Web Token - JSON Web Token
| Status | Foreslået standard |
|---|---|
| Først udgivet | 28. december 2010 |
| Nyeste version |
RFC 7519 maj 2015 |
| Organisation | IETF |
| Forkortelse | JWT |
JSON Web Token ( JWT , udtalt / dʒ ɒ t / , samme som ordet "jot") er en foreslået internetstandard til oprettelse af data med valgfri signatur og / eller valgfri kryptering, hvis nyttelast har JSON, der hævder et antal krav . Tokens signeres enten ved hjælp af en privat hemmelighed eller en offentlig/privat nøgle .
For eksempel kan en server generere et token, der har påstanden "logget ind som administrator" og give det til en klient. Klienten kunne derefter bruge dette token til at bevise, at den er logget ind som admin. Tokens kan underskrives af en parts private nøgle (normalt serverens), så partiet efterfølgende kan kontrollere, at tokenet er legitimt. Hvis den anden part på en passende og pålidelig måde er i besiddelse af den tilhørende offentlige nøgle, kan de også verificere tokenets legitimitet. De tokens er designet til at være kompakt, URL -sikkert, og anvendelige især i en web-browser single-sign-on (SSO) kontekst. JWT -krav kan typisk bruges til at videregive godkendte brugeres identitet mellem en identitetsudbyder og en tjenesteudbyder eller enhver anden form for krav som krævet af forretningsprocesser.
JWT er afhængig af andre JSON-baserede standarder: JSON Web Signature og JSON Web Encryption .
Struktur
{
"alg": "HS256",
"typ": "JWT"
}
|
Identificerer hvilken algoritme der bruges til at generere signaturen
Typiske anvendte kryptografiske algoritmer er HMAC med SHA-256 (HS256) og RSA-signatur med SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 introducerer mange flere til både godkendelse og kryptering. |
{
"loggedInAs": "admin",
"iat": 1422779638
}
|
Indeholder et sæt krav. JWT -specifikationen definerer syv registrerede kravnavne, som er standardfelterne, der almindeligvis er inkluderet i tokens. Brugerdefinerede krav er normalt også inkluderet, afhængigt af formålet med token.
Dette eksempel har standardkravet Issued At Time ( |
HMAC_SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)
|
Validerer tokenet sikkert. Signaturen beregnes ved at kode overskriften og nyttelasten ved hjælp af Base64url Encoding RFC 4648 og sammenkoble de to sammen med en periodeseparator. Denne streng køres derefter gennem den kryptografiske algoritme, der er angivet i overskriften, i dette tilfælde HMAC-SHA256. Den Base64url Encoding ligner base64 , men bruger forskellige ikke-alfanumeriske tegn og undlader polstring. |
De tre dele er kodet separat ved hjælp af Base64url Encoding RFC 4648 og sammenkædet med perioder til fremstilling af JWT:
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
Ovenstående data og hemmeligheden bag "secretkey" skaber token:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLyMyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJyJySuJyJySuJySuJySuJySuJySuJySjMyJyJyJySjJyJyJyJySjMySjSjJyJjSjJyJyJjSjJsyJy
Dette resulterende token kan let overføres til HTML og HTTP .
Brug
Ved godkendelse, når brugeren logger ind med sine legitimationsoplysninger, returneres et JSON Web Token og skal gemmes lokalt (typisk i lokal eller sessionslagring , men cookies kan også bruges), i stedet for den traditionelle tilgang til at oprette en session på serveren og returnere en cookie. Ved uovervåget processer kan klienten også autentificere direkte ved at generere og underskrive sin egen JWT med en på forhånd delt hemmelighed og videregive den til en OAuth- kompatibel service som sådan:
POST /oauth2/token?
Content-type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=eyJhb...
Hvis klienten passerer en gyldig JWT -påstand, vil serveren generere en access_token, der er gyldig til at foretage opkald til applikationen og videresende den til klienten:
{
"access_token": "eyJhb...",
"token_type": "Bearer",
"expires_in": 3600
}
Når klienten ønsker at få adgang til en beskyttet rute eller ressource, skal brugeragenten sende JWT, typisk i Authorizationoverskriften ved hjælp af Bearerskemaet. Indholdet af overskriften kan se sådan ud:
Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI
Dette er en statsløs godkendelsesmekanisme, da brugerstatus aldrig gemmes i serverhukommelse. Serverens beskyttede ruter søger efter en gyldig JWT i autorisationsoverskriften, og hvis den er til stede, får brugeren adgang til beskyttede ressourcer. Da JWT'er er uafhængige, er alle de nødvendige oplysninger der, hvilket reducerer behovet for at forespørge databasen flere gange.
Standardfelter
| kode | navn | beskrivelse |
|---|---|---|
| Standardkravsfelter | Internetudkast definerer følgende standardfelter ("krav"), der kan bruges inde i et JWT -kravsæt. | |
iss
|
Udsteder | Identificerer hovedstol, der udstedte JWT. |
sub
|
Emne | Identificerer emnet for JWT. |
aud
|
Publikum | Identificerer de modtagere, som JWT er beregnet til. Hver hovedstol, der er beregnet til at behandle JWT, skal identificere sig med en værdi i publikumskravet. Hvis den primære behandling er påstanden ikke identificere sig selv med en værdi i audkravet, når denne påstand er til stede, så JWT må afvises.
|
exp
|
Udløbstid | Identificerer udløbstiden, hvorefter JWT ikke må accepteres til behandling. Værdien skal være en NumericDate: enten et heltal eller decimal, der repræsenterer sekunder efter 1970-01-01 00: 00: 00Z . |
nbf
|
Ikke før | Identificerer det tidspunkt, hvor JWT vil begynde at blive accepteret til behandling. Værdien skal være en NumericDate. |
iat
|
Udstedt kl | Identificerer det tidspunkt, hvor JWT blev udstedt. Værdien skal være en NumericDate. |
jti
|
JWT ID | Kassefølsom unik identifikator for token, selv blandt forskellige udstedere. |
| Almindeligt anvendte overskriftsfelter | Følgende felter bruges normalt i overskriften på en JWT | |
typ
|
Token type | Hvis det findes, anbefales det at indstille dette til JWT.
|
cty
|
Indholdstype | Hvis der bruges indlejret signering eller kryptering, anbefales det at indstille dette til JWT; ellers skal du udelade dette felt.
|
alg
|
Meddelelsesgodkendelse -algoritme | Udstederen kan frit indstille en algoritme til at verificere signaturen på token. Nogle understøttede algoritmer er imidlertid usikre. |
kid
|
Nøgle -id | Et tip, der angiver hvilken nøgle klienten brugte til at generere token signaturen. Serveren vil matche denne værdi til en nøgle i filen for at kontrollere, at signaturen er gyldig og tokenet er autentisk. |
x5c
|
x.509 Certifikatkæde | En certifikatkæde i RFC4945 -format svarende til den private nøgle, der bruges til at generere token -signaturen. Serveren vil bruge disse oplysninger til at kontrollere, at signaturen er gyldig og tokenet er autentisk. |
x5u
|
x.509 Certificate Chain URL | En URL, hvor serveren kan hente en certifikatkæde, der svarer til den private nøgle, der bruges til at generere token signaturen. Serveren henter og bruger disse oplysninger til at kontrollere, at signaturen er autentisk. |
crit
|
Kritisk | En liste over overskrifter, der skal forstås af serveren for at acceptere tokenet som gyldigt |
| kode | navn | beskrivelse |
Implementeringer
JWT -implementeringer findes på mange sprog og rammer, herunder men ikke begrænset til:
Sårbarheder
JSON web tokens kan indeholde sessionstilstand. Men hvis projektkrav tillader sessionens ugyldighed før JWT -udløb, kan tjenester ikke længere stole på token -påstande af token alene. For at validere, at den session, der er gemt i token, ikke tilbagekaldes, skal token -påstande kontrolleres mod et datalagring . Dette gør tokens ikke længere statsløse, hvilket undergraver den primære fordel ved JWT'er.
Sikkerhedskonsulent Tim McLean rapporterede sårbarheder i nogle JWT -biblioteker, der brugte algfeltet til forkert at validere tokens, oftest ved at acceptere et alg=nonetoken. Mens disse sårbarheder blev korrigeret, foreslog McLean alghelt at afskrive feltet for at forhindre lignende implementeringsforvirring. Alligevel alg=nonefindes der stadig nye sårbarheder i naturen, med fire CVE'er indgivet i perioden 2018-2021 med denne årsag.
Med korrekt design kan udviklere løse algoritmesårbarheder ved at tage forholdsregler:
- Lad aldrig JWT -headeren alene køre verifikation
- Kend algoritmerne (undgå afhængigt af
algfeltet alene) - Brug en passende nøglestørrelse
Se også
Referencer
eksterne links
- RFC 7519
- jwt.io - specialiseret websted om JWT med værktøjer og dokumentation, vedligeholdt af Auth0
- Spring Boot JWT Auth - Integrering af JWT -godkendelse med Spring framework
- JWT Security -JWT Security e-Book PDF (polsk)
- Hvorfor har vi brug for JWT i det moderne web - en detaljeret artikel om emnet med nogle historiske overvejelser