logo
eng-flag

JWT (JSON Web Token) Notları ve İpuçları

İçindekiler

  1. JWT'ye Giriş
  2. JWT Yapısı
  3. Node.js'de JWT
  4. JWT Oluşturma
  5. JWT Doğrulama
  6. JWT En İyi Uygulamaları
  7. Yaygın Kullanım Alanları
  8. Güvenlik Hususları
  9. Sorun Giderme

JWT'ye Giriş

JSON Web Token (JWT), taraflar arasında güvenli bir şekilde bilgi iletmek için kullanılan kompakt ve kendi kendine yeterli bir JSON nesnesi standardıdır. JWT'ler genellikle kimlik doğrulama ve bilgi değişimi için kullanılır.

JWT'nin Ana Özellikleri:

  • Kompakt: URL, POST parametresi veya HTTP başlığı içinde gönderilebilir
  • Kendi kendine yeterli: Kullanıcı hakkında bilgi içerir ve veritabanına defalarca sorgu yapma gereksinimini ortadan kaldırır
  • Dijital olarak imzalanmış: Bilgiler doğrulanabilir ve güvenilir

JWT Yapısı

Bir JWT genellikle şöyle görünür:

xxxxx.yyyyy.zzzzz

Üç bölümden oluşur ve noktalar (.) ile ayrılır:

  1. Header
  2. Payload
  3. Signature

Header genellikle iki bölümden oluşur: token türü (JWT) ve kullanılan imzalama algoritması (örneğin, HMAC SHA256 veya RSA).

Örnek:

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

Payload, iddiaları (claims) içerir. İddialar, kullanıcı hakkında ve ek meta veriler hakkında açıklamalardır.

Örnek:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

Signature

Signature, JWT'nin göndereninin kim olduğunu doğrulamak ve mesajın yol boyunca değiştirilmediğini garanti etmek için kullanılır.

Node.js'de JWT

Node.js'de JWT'lerle çalışmak için jsonwebtoken paketini kullanacağız.

Kurulum:

npm install jsonwebtoken

JWT Oluşturma

Node.js'de JWT oluşturmanın yolu:

const jwt = require('jsonwebtoken');

const payload = {
  sub: '1234567890',
  name: 'John Doe',
  admin: true
};

const secretKey = 'your-secret-key';

const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });

console.log(token);

Bu, 1 saat sonra süresi dolacak bir token oluşturur.

JWT Doğrulama

Bir JWT'yi doğrulamak için:

const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'; // JWT'niz burada
const secretKey = 'your-secret-key';

try {
  const decoded = jwt.verify(token, secretKey);
  console.log(decoded);
} catch(err) {
  console.error('Geçersiz token:', err.message);
}

JWT En İyi Uygulamaları

  1. Gizli tutun: Gizli anahtarınızı asla paylaşmayın
  2. HTTPS kullanın: Orta adam saldırılarını önlemek için her zaman HTTPS kullanın
  3. Süre sona erme: Token'larınız için makul bir süre sona erme süresi belirleyin
  4. Hassas verileri saklamayın: Payload'da hassas bilgileri saklamaktan kaçının
  5. Güçlü gizli anahtarlar kullanın: Token'ları imzalamak için güçlü ve benzersiz bir gizli anahtar kullanın

Yaygın Kullanım Alanları

1. Kimlik Doğrulama

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

app.post('/login', (req, res) => {
  // Kullanıcı kimlik bilgilerini doğrula
  const user = { id: 1, username: 'john' };
  
  const token = jwt.sign({ userId: user.id }, 'secret-key', { expiresIn: '1h' });
  
  res.json({ token });
});

app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: 'Korunan yol başarıyla erişildi' });
});

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  
  if (!token) return res.sendStatus(401);
  
  jwt.verify(token, 'secret-key', (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor'));

2. Bilgi Değişimi

const jwt = require('jsonwebtoken');

// Sunucu A: Kullanıcı bilgileriyle bir token oluşturma
const userInfo = {
  id: 123,
  name: 'Alice',
  role: 'admin'
};

const token = jwt.sign(userInfo, 'shared-secret-key');

// Bu token'ı Sunucu B'ye gönder

// Sunucu B: Token'ı doğrulama ve kullanma
try {
  const decoded = jwt.verify(token, 'shared-secret-key');
  console.log('Alınan kullanıcı bilgileri:', decoded);
  // Kullanıcı bilgilerini kullanarak işlemler yapın
} catch(err) {
  console.error('Geçersiz token:', err.message);
}

Güvenlik Hususları

  1. Token depolama: Token'ları güvenli bir şekilde saklayın (örneğin, HttpOnly çerezlerinde)
  2. Token iptali: Gerekirse token'ları iptal etmek için bir strateji uygulayın
  3. Yenileme token'ları: Uzun ömürlü oturumlar için yenileme token'ları kullanın
  4. Payload boyutu: Payload'ı küçük tutun, böylece aşırı yük azaltılır
  5. Algoritma seçimi: Üretimde güçlü algoritmalar (örneğin RS256) kullanın

Yenileme token'ları kullanma örneği:

const jwt = require('jsonwebtoken');

function generateTokens(userId) {
  const accessToken = jwt.sign({ userId }, 'access-secret', { expiresIn: '15m' });
  const refreshToken = jwt.sign({ userId }, 'refresh-secret', { expiresIn: '7d' });
  return { accessToken, refreshToken };
}

function refreshAccessToken(refreshToken) {
  try {
    const decoded = jwt.verify(refreshToken, 'refresh-secret');
    const accessToken = jwt.sign({ userId: decoded.userId }, 'access-secret', { expiresIn: '15m' });
    return accessToken;
  } catch(err) {
    throw new Error('Geçersiz yenileme token'ı');
  }
}

// Kullanım
const { accessToken, refreshToken } = generateTokens(123);

// Erişim token'ı süresi dolduğunda, yenileme token'ını kullanarak yeni bir tane alın
const newAccessToken = refreshAccessToken(refreshToken);

Sorun Giderme

  1. "jwt malformed": Token'ın düzgün formatta olduğunu (header.payload.signature) doğrulayın
  2. "invalid signature": Doğru gizli anahtarın kullanıldığını kontrol edin
  3. "jwt expired": Token süresinin dolmuş olduğunu gösterir, yeni bir token oluşturun
  4. "invalid token": Token muhtemelen değiştirilmiş veya yanlış yapılandırılmış

Yaygın hataları işleme örneği:

const jwt = require('jsonwebtoken');

function verifyToken(token) {
  try {
    return jwt.verify(token, 'your-secret-key');
  } catch(err) {
    if (err instanceof jwt.JsonWebTokenError) {
      // JWT geçersiz
      console.error('Geçersiz JWT:', err.message);
    } else if (err instanceof jwt.TokenExpiredError) {
      // JWT süresi dolmuş
      console.error('JWT süresi dolmuş:', err.message);
    } else {
      // Diğer hata
      console.error('JWT doğrulama hatası:', err.message);
    }
    return null;
  }
}

// Kullanım
const result = verifyToken('your-token-here');
if (result) {
  console.log('Token geçerli:', result);
} else {
  console.log('Token doğrulama başarısız');
}

2024 © Tüm hakları saklıdır - buraxta.com