sikkerhet - JWT-token signaturvalidering javascript


Jeg laget en JavaScript-klient som kobler til en API ved hjelp av JWT-tokens. På serversiden er det ingen problemer, jeg kan lage token, signere den og senere verifisere signaturen og dermed sikre at ingen har tuklet med tokenet.

Men hvordan gjør jeg dette på klientsiden. Jeg kan bare dekode JWT-tokenet og se header, payload og signatur. Men hvordan verifiserer jeg signaturen på klientsiden? Finnes det biblioteker for dette, hvordan overfører jeg den offentlige nøkkelen til klienten?

Hvis jeg ikke verifiserer signaturen, hvordan kan jeg vite at tokenet ikke er tuklet med?

Svar #1

hvis jeg ikke validerer signaturen på klientsiden, hvordan kan jeg være sikker på at tokenet faktisk kommer fra serveren? Kanskje det er noen i midten som endrer tokenet

Signaturvalidering forhindrer ikke et Man In The Middle-angrep. En angriper kan sniffe kanalen for å fange opp legitimasjon eller endre meldinger selv ved bruk av gyldige tokens

Bruk en SSL/TLS-kanal (https)

Hvis jeg ikke verifiserer signaturen, hvordan kan jeg vite at tokenet ikke er tuklet med?

Et token levert av en TLS-trusted server er sannsynligvis gyldig. (det kan ha blitt endret i lokal lagring). Du kan validere signaturen. Denne operasjonen gjøres vanligvis på serversiden (se @sakuto svar), men du kan gjøre det i nettleseren uten problemer

Men hvordan verifiserer jeg signaturen på kundestedet?

Dette er trinnene

  1. Last ned den offentlige nøkkelen fra en pålitelig server
  2. ekstraher signaturen fra JWT og dekod den (base64url)
  3. verifiser den digitale signaturen ved å bruke et kryptografisk bibliotek

Jeg foreslår å bruke Webcrypto. Se et eksempel på RSA-importnøkkel og validering her: https://github.com/diafygi/webcrypto-examples/blob/master/README.md#rsassa-pkcs1-v1_5

Svar #2

Du utfører vanligvis ikke verifisering på klientsiden, og lagrer heller ikke viktig data på tokenet. Hver kontroll og tillatelse sjekkes på server-siden. Dette betyr at selv om brukeren tukler med tokenet sitt, vil han ikke kunne passere serverkontrollen, og kun muligens se en ekstra opsjon på fronten.