Hjem » Siste artikler » Praktisk innføring i JWT-autentisering: slik sikrer du API-et uten å gjøre alt for komplisert

Praktisk innføring i JWT-autentisering: slik sikrer du API-et uten å gjøre alt for komplisert

Hovedillustrasjon
Hovedillustrasjon. Foto: Саша Алалыкин / Pexels.

Mange går fra en enkel nettside til et mer avansert oppsett med innlogging, brukerprofiler og egne API-er. Da dukker spørsmålet opp: hvordan håndtere autentisering på en trygg og håndterbar måte uten å drukne i kompleksitet?

JSON Web Tokens (JWT) har blitt et populært valg for API-er. Riktig brukt kan det gi en fleksibel og skalerbar løsning, men feil valg i starten kan skape sikkerhetshull og vedlikeholdsproblemer. Denne artikkelen gir en jordnær og praktisk innføring som hjelper deg i gang på en trygg måte.

Hva er JWT, og når gir det mening å bruke det?

Et JWT er i praksis en signert “billett” som forteller hvem brukeren er, og hvilke rettigheter vedkommende har. Serveren kan kontrollere billetten uten å måtte slå opp brukeren i en database for hver eneste forespørsel.

Tokenet består av tre deler: header, payload og signatur. De to første delene er Base64-kodet JSON, mens signaturen sikrer at innholdet ikke er endret. Det er viktig å merke seg at JWT ikke er kryptering, kun signering. Innholdet kan leses av alle som får tak i tokenet.

Typiske bruksområder for JWT i webprosjekter

JWT passer spesielt godt når du har et API som skal brukes av flere klienter, for eksempel en React-frontend, en mobilapp og kanskje et eksternt system. Da er det praktisk å ha en standardisert, stateless måte å autentisere forespørsler på.

Hvis du kun har en klassisk serverrendret nettside uten offentlig API, kan tradisjonelle sesjonskaker ofte være enklere og like trygge. Tenk derfor gjennom om du faktisk trenger JWT, eller om du velger det kun fordi “alle andre” gjør det.

Hvordan ser et enkelt JWT-basert innloggingsløp ut?

Et typisk oppsett for JWT-autentisering mot et API kan oppsummeres slik:

  • Brukeren sender brukernavn og passord til en innloggings-endepunkt (for eksempelPOST /auth/login).
  • Serveren verifiserer legitimasjonen og utsteder et kortvarig access token (JWT) og gjerne et lenger gyldig refresh token.
  • Klienten lagrer token på en trygg måte og sender det med somAuthorization: Bearer <token>i alle videre forespørsler.
  • Serveren verifiserer signaturen og gyldighetsperioden på hvert kall, og gir tilgang eller avviser.

Dette kan kombineres med roller og rettigheter i payload, slik at du kan skille mellom for eksempel “admin” og “vanlig bruker” uten ekstra oppslag hver gang.

Eksempel på JWT-innhold og hva du bør legge inn

Et enkelt payload-felt i et JWT kan se slik ut (forenklet):

  • sub: brukerens unike ID
  • iat: tidspunkt for utstedelse
  • exp: tidspunkt for utløp
  • role: brukerens rolle (for eksempel “user” eller “admin”)

Legg bare inn det du faktisk trenger for å ta beslutninger i API-et. Ikke putt inn sensitive data som e-post, personnummer eller interne systemnøkler. Husk at alle med tokenet kan lese innholdet, selv om de ikke kan endre det uten at signaturen blir ugyldig.

Hvor og hvordan burde token lagres i frontend?

Tematisk illustrasjon
Tematisk illustrasjon. Foto: Tima Miroshnichenko / Pexels.

Her oppstår mange vanlige feil. Et utgangspunkt kan være:

  • Access token: kort gyldighetstid, sendes i Authorization-header i API-kall.
  • Refresh token: lengre gyldighetstid, bør beskyttes bedre og aldri sendes i vanlige API-kall.

Unngå å lagre følsomme token ilocalStoragehvis nettstedet kan være utsatt for XSS. HttpOnly-cookies kan være et tryggere alternativ, men krever at du har kontroll på CORS, same-site og CSRF-beskyttelse. Vurder trusselbildet for prosjektet ditt før du velger lagringsstrategi.

Slik validerer du JWT på serveren

På serversiden bør all verifisering skje i et tydelig mellomlag, for eksempel en middleware som:

  • Leser Authorization-header og henter ut tokenet.
  • Verifiserer signaturen med korrekt hemmelig nøkkel eller offentlig nøkkel.
  • Sjekker at tokenet ikke er utløpt.
  • Plasserer informasjon om bruker (for eksempel id og rolle) på request-objektet.

Da kan resten av koden anta at request allerede er autentisert, og du kan lage enkle hjelpetjenester som for eksempel “krever admin-rolle” uten å repetere verifiseringslogikk i alle endepunkter.

Vanlige feil med JWT og hvordan unngå dem

Noen fallgruver går igjen uavhengig av språk og rammeverk. Her er noen du bør være særlig oppmerksom på:

  • Ingen utløpstid: Token uten exp-felt kan brukes for alltid hvis de lekker. Sørg for at access token har begrenset levetid.
  • For mye informasjon i payload: Jo mer du legger inn, jo større konsekvens hvis token spres. Hold det minimalt.
  • Deler hemmelig nøkkel: Del aldri signeringsnøkkelen i frontend-kode, Git-repoer eller screenshots.
  • Blind tillit til “alg” i header: Konfigurer biblioteket til å forvente en spesifikk algoritme, ikke stol på hva klienten sier.

Når bør du kombinere JWT med andre mekanismer?

I mange situasjoner er JWT bare en del av et større oppsett. Du kan for eksempel kombinere det med:

  • Rate limiting, for å redusere effekten av automatiserte angrep.
  • IP- og geo-sjekker, der risikonivået tilsier det.
  • Ekstra verifikasjon på sensitive operasjoner, som å endre e-post eller passord.

For mer avanserte systemer kan det også være aktuelt med dedikerte identitetsleverandører (IdP) og protokoller som OAuth 2.0 eller OpenID Connect. JWT kan fortsatt være formatet, men du slipper å håndtere all innloggingslogikk selv.

Praktiske tips før du går i gang

Start enkelt, og forbedre etter hvert. Noen konkrete råd før du implementerer første versjon:

  • Bruk et velprøvd bibliotek for JWT i språket ditt, i stedet for å implementere det selv.
  • Skill tydelig mellom access token og refresh token, og gi dem ulike gyldighetsperioder.
  • Test scenarier der token er utløpt, manipulert eller mangler, ikke bare suksessflyten.
  • Dokumenter hvordan frontenden skal håndtere fornyelse, utlogging og lagring.

Hvis du senere må migrere til en mer avansert løsning, har du i det minste etablert gode vaner rundt gyldighetstid, signering og validering. Det gir et langt bedre utgangspunkt enn et tilfeldig satt opp token-system uten tydelige grenser.

0 kommentarer