JSON Web Token-ek (JWT) biztonságának javítása
A JSON Web Tokenek (JWT) népszerű módszert kínálnak a felhasználók biztonságos hitelesítésére és az információk cseréjére rendszerek között. Azonban, ha nem megfelelően használják őket, biztonsági kockázatot jelenthetnek az alkalmazás számára. Ebben a cikkben az alapvető és fejlett biztonsági intézkedéseket tárgyaljuk, amelyeket a JWT-k használatakor érdemes megtenni.
Alapvető biztonsági intézkedések
Első lépésként mindig érvényes TLS tanúsítvánnyal rendelkező HTTPS-kapcsolatot kell használni a JWT-k biztonságos alkalmazása érdekében. Ez biztosítja, hogy az összes adat, amelyet a kliens és a szerver között továbbítanak, titkosított és biztonságos legyen.
Egy másik fontos szempont a JWT-k biztonságos használatában a kulcs biztonságos tárolása. Ezt a kulcsot használják a token aláírására és annak hitelességének ellenőrzésére. Ha ez illetéktelen kezekbe kerül, a támadók saját JWT-ket generálhatnak, és jogosult felhasználónak álcázhatják magukat.
Továbbá, soha ne tároljunk érzékeny adatokat, például e-mail címet, jelszót vagy bankkártya-adatokat a JWT-kben. Ehelyett csak olyan adatokat tároljunk, amelyek nem érzékenyek és nyilvánosan is megjeleníthetők.
Mindig ellenőrizzük a JWT aláírásának érvényességét és a token lejárati dátumát. Az aláírás biztosítja, hogy a token nem lett manipulálva, míg a lejárati dátum garantálja, hogy a token még érvényes. Ha a token lejárt, vagy az aláírás érvénytelen, a tokent nem szabad elfogadni.
Fejlett biztonsági intézkedések
Az alapvető intézkedések ellenére a JWT-k még mindig biztonsági kockázatot jelentenek, mivel visszavonhatatlanok és fix lejárati dátumuk van. Ennek kezelésére további biztonsági réteget adhatunk a JWT-k használatához.
Ezt úgy érhetjük el, hogy további adatokat illesztünk a JWT-be, egy hash formájában, amely tartalmazza a sót, a kliens IP-címét és a kliens felhasználói ügynök (User-Agent) karakterláncát. Ezt a hasht, amelyet ujjlenyomatként (fingerprint) említünk, a JWT-ben tároljuk, és a verifikáció során hasonlítjuk össze. Ha a kliens IP-címe vagy a User-Agent karakterlánc megváltozik, a token érvénytelen lesz.
Példakód
Az alábbiakban bemutatunk egy egyszerű példát ennek a módszernek az alkalmazására, amely elérhető GitHub-repozitóriumunkban is. Fontos azonban megjegyezni, hogy a logika bemutatása mellett a megvalósítást szükség szerint testre lehet szabni, beleértve egy robusztusabb ujjlenyomat létrehozását.
Minta ujjlenyomat funkció
const createFingerprint = (req) => {
const salt = '3d4bd49fadee0613cec5a145a0173876';
const addr = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
const userAgent = req.get('user-agent');
return crypto
.createHash('sha256')
.update(salt + addr + userAgent)
.digest('hex');
};
Minta API útvonalak ujjlenyomat ellenőrzéssel
const crypto = require('crypto');
const router = require('express').Router();
const jwt = require('jsonwebtoken');
const secret = '6iwMV0Hc6WU0XPMpqugnHsOg3kJqhRTQ';
const userId = 'b427a317';
const expiresIn = '8h';
const createFingerprint = (req) => {
const salt = '3d4bd49fadee0613cec5a145a0173876';
const addr = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
const userAgent = req.get('user-agent');
return crypto
.createHash('sha256')
.update(salt + addr + userAgent)
.digest('hex');
};
router.post('/getToken', function (req, res) {
const fingerprint = createFingerprint(req);
const data = { userId, fingerprint };
const token = jwt.sign(data, secret, { expiresIn });
res.json({ token });
});
router.post('/checkToken', function (req, res) {
const token = req.headers['authorization'];
const fingerprint = createFingerprint(req);
if (!token) return res.sendStatus(401);
try {
const data = jwt.verify(token, secret);
if (!data || String(data.fingerprint) !== String(fingerprint)) {
return res.sendStatus(403);
}
res.json({ data });
} catch (err) {
return res.sendStatus(403);
}
});
module.exports = router;
https://github.com/stacklegend/jwt-improve-security
Következtetés
Összefoglalva, a JWT-k hatékony eszközök a felhasználók biztonságos hitelesítésére és az információk cseréjére rendszerek között. Fontos azonban, hogy alapvető és fejlett biztonsági intézkedéseket is bevezessünk annak érdekében, hogy a JWT-ket ne használhassák fel visszaélésekre.
A Stacklegend vállalatnál olyan IT-megoldásokat szállítunk, amelyek a biztonságot szem előtt tartva működnek vállalati környezetekben. Lépjen kapcsolatba velünk, hogy megtudja, hogyan segíthetünk biztonságos rendszerek építésében és magasabb biztonsági szint elérésében cége számára.
Stacklegend - Mi építjük a digitális jövőt.