
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"}
{"sub": "1234567890", "name": "John Doe", "admin": true}
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.