JSON Web Token-ek (JWT) biztonságának javítása

#Biztonság#JavaScript#Node#WebFejlesztés
2023. február 19.
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.

https://stacklegend.com/