JWT: Što je to? Definicija i upotreba u web sigurnosti

Zadnje ažuriranje: Rujna 26, 2024

JSON web token , poznatiji kao JWT , otvoreni je standard za siguran prijenos informacija između stranaka. Definiran je prema specifikaciji RFC 7519 i prvenstveno se koristi u kontekstu web sigurnosti za autentifikaciju korisnika i osiguranje integriteta podataka.

Struktura JWT-a

JWT se sastoji od tri dijela kodirana u Base64Url formatu , odvojena točkama:

  • Zaglavlje: Sadrži metapodatke o tokenu, kao što su vrsta i korišteni algoritam potpisa. Na primjer:
{"alg": "HS256", "typ": "JWT"}
  • nosivost: Ovaj odjeljak sadrži tvrdnje, koje su izjave o entitetu (obično korisniku) i dodatne metapodatke. Na primjer:
  • {"sub": "1234567890", "name": "John Doe", "admin": true}
  • Potpis: Koristi se za provjeru integriteta tokena i autentičnosti izdavatelja. Za izračun potpisa, zaglavlje i korisna nosivost, povezani su i potpisani pomoću algoritma kao što je HMAC SHA256.
  • Na primjer, potpis se generira iz:

    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      your-256-bit-secret)

    Vrste tvrdnji u JWT-u

    Zahtjevi se općenito dijele u tri kategorije :

    Registrirani zahtjevi

    To je skup unaprijed definiranih tvrdnji preporučenih za korištenje u JWT-ovima. To uključuje:

    • iSSIzdavatelj tokena.
    • ispodPredmet tokena.
    • AUDCiljna publika tokena.
    • expDatum isteka tokena.
    • nbf: Označava vrijeme u kojem je token važeći.

    Javne pritužbe

    Korisnici mogu definirati tvrdnje po volji, ali moraju izbjegavati kolizije imena. Na primjer:

    • korisničko ime: Korisničko ime autentificirane osobe.
    • UlogaKorisnička uloga (administrator, obični korisnik itd.).

    Privatni zahtjevi

    Prilagođeni zahtjevi stvaraju se za dijeljenje informacija između stranaka na način koji neće ometati registrirane ili javne zahtjeve.

    Kako JWT funkcionira u web sigurnosti?

    Tijek rada JWT- a obično slijedi ove korake:

    ovjera

    Proces započinje kada se korisnik uspješno autentificira, obično putem obrasca za prijavu. Nakon što je korisnik verificiran, poslužitelj generira JWT koji sadrži informacije o korisnikovoj sesiji.

    Generiranje tokena

    Nakon autentifikacije, poslužitelj stvara JWT i šalje ga klijentu kao odgovor. Ovaj token može se pohraniti u localStorage ili kao kolačić u pregledniku.

    Slanje tokena

    Sa svakim sljedećim zahtjevom, klijent šalje JWT poslužitelju, obično putem zaglavlja autorizacije :

    Authorization: Bearer 

    Verifikacija tokena

    Poslužitelj prima token i provjerava ga pomoću tajnog ključa ili certifikata. Ako je token valjan i nije istekao, odobren je pristup zaštićenim resursima.

    Prednosti korištenja JWT-a

    Korištenje JWT-a u web aplikacijama ima nekoliko prednosti:

    Skalabilnost

    JWT-ovi su samostalni , što znači da poslužitelji ne moraju održavati korisničku sesiju u memoriji. To poboljšava skalabilnost, jer više instanci poslužitelja može obrađivati ​​zahtjeve bez potrebe za pristupom bazi podataka radi provjere stanja sesije.

    interoperabilnost

    Kao otvoreni standard, JWT je interoperabilan s različitim programskim jezicima i platformama. To olakšava integraciju u različite sustave i usluge.

    sigurnosti

    Mogućnost potpisivanja JWT-a osigurava da sadržaj nije izmijenjen, a korištenje algoritama za šifriranje dodaje dodatni sloj sigurnosti, pružajući povjerljivost kada je to potrebno.

    Nedostaci korištenja JWT-a

    Unatoč prednostima, postoje i nedostaci implementacije JWT-a :

    Veličina tokena

    JWT-ovi mogu postati veliki, posebno ako sadrže puno informacija u korisnom teretu . To može dovesti do povećanog opterećenja mreže ako se šalju sa svakim zahtjevom.

    Istek i opoziv

    Nakon izdavanja, JWT vrijedi do isteka. Ako je potrebno opozvati korisnika (na primjer, ako je njegov račun kompromitiran), poslužitelj mora implementirati dodatni mehanizam, kao što su popisi opozvanih tokena, budući da se token može nastaviti koristiti do isteka.

    Upravljanje ključem

    Sigurnost JWT- a ovisi o snazi ​​ključa koji se koristi za potpisivanje tokena. Održavanje ovog ključa sigurnim i njegova redovita rotacija ključni su za sigurnost aplikacije.

    Uobičajena upotreba JWT-a

    JWT-ovi se koriste u raznim primjenama i kontekstima, uključujući:

    API autentifikacija

    U aplikacijama koje koriste RESTful API-je, JWT se često koristi za autentifikaciju zahtjeva. Omogućuje API programerima izgradnju arhitekture koja je i sigurna i jednostavna za korištenje.

    Autentifikacija između mikroservisa

    U mikroservisnim arhitekturama, JWT-ovi olakšavaju autentifikaciju između servisa pružajući jednostavan način provjere korisnika bez potrebe za dijeljenjem sesija između servisa.

    SSO (jedinstvena prijava)

    Implementacija JWT-a može olakšati implementaciju SSO rješenja , omogućujući korisnicima jednokratnu autentifikaciju i pristup više aplikacija bez potrebe za ponovnom prijavom.

    Sigurno dijeljenje informacija

    JWT-ovi su također korisni za dijeljenje informacija između različitih strana, osiguravajući integritet i autentičnost prenesenih podataka.

    Kontrola pristupa

    JWT-ovi omogućuju implementaciju finih kontrola pristupa, jer se podaci o ulogama i dozvolama mogu izravno uključiti u token.

    Implementacija JWT-a u projektu

    Izrada JWT-a

    Da biste stvorili J.W.T., možete koristiti razne biblioteke dostupne na više jezika kao što su JavaScript, Piton y JavaPrimjer u Node.js korištenje knjižnice jsonwebtoken To je:

    const jwt = require('jsonwebtoken');
    const token = jwt.sign({ id: user.id }, 'your-256-bit-secret', { expiresIn: '1h' });

    Provjera JWT-a

    Provjera JWT- a se vrši slično, korištenjem iste biblioteke:

    jwt.verify(token, 'your-256-bit-secret', function(err, decoded) {
      if (err) {
        return console.log('Token inválido');
      }
      console.log(decoded); // { id: 123, i Ss: 'your-issuer', ... }
    });

    Obrada isteka tokena

    Za rješavanje isteka tokena, vrijeme isteka (claim exp ) u korisnom teretu mora se provjeriti prije odobravanja pristupa zaštićenim resursima. Ako je token istekao, korisnika treba preusmjeriti da se ponovno prijavi i dobije novi token.

    Korištenje middlewarea

    U mnogim aplikacijama, posebno u kontekstu Node.js s Expressom , middleware se koristi za centralizirano rukovanje JWT verifikacijom . Evo osnovnog primjera:

    const express = require('express');
    const jwt = require('jsonwebtoken');
    const app = express();

    const checkToken = (req, res, next) => {
    const token = req.headers['authorization']?.split(' ')[1];
    if (!token) return res.sendStatus(401); // No autorizado

    jwt.verify(token, 'your-256-bit-secret', (err, decoded) => {
    if (err) return res.sendStatus(403); // Prohibido
    req.user = decoded; // Guardar información del usuario en el request
    next(); // Continuar a la siguiente middleware
    });
    };

    app.get('/protected', checkToken, (req, res) => {
    res.send('Este es un recurso protegido.');
    });

    JSON web token je moćan alat za upravljanje autentifikacijom i autorizacijom u web aplikacijama. Njegova jednostavna struktura i mogućnost provjere i validacije olakšavaju implementaciju sigurnih, skalabilnih i interoperabilnih sustava. Međutim, za maksimiziranje njegove učinkovitosti potrebno je uzeti u obzir najbolje prakse i pravilno upravljanje sigurnošću.