How-To Guides

Demir Gibi Sağlam JWT Kimlik Doğrulama: Pratik Bir Kılavuz

JSON Web Token'lar (JWT), modern web uygulamalarında durumdan bağımsız kimlik doğrulamanın standardı haline gelmiştir. Ancak bu kolaylık, kritik güvenlik yapılandırma hatalarına yol açabilir. JWT'ler kendi kendine yeten yapıda olduğu için, bunları doğrulayan herhangi bir sunucu, merkezi bir veritabanına bakmadan yükü (payload) güvenle kabul eder. Bu tasarım tercihi, geliştiricilerin token'ların nasıl oluşturulduğuna, iletildiğine ve doğrulandığına dair titiz olmasını gerektirir. Bu kılavuz, token ele geçirilmesi, algoritma kafa karışıklığı saldırıları ve yetkisiz erişim gibi yaygın güvenlik açıklarını önlemek için temel güvenlik uygulamalarını özetler.

1. Kısa Son Kullanma Tarihleri ve Yenileme Token'ları Kullanın

Geliştiricilerin yaptığı en yaygın hata, 24 saat veya daha uzun gibi uzun son kullanma tarihli JWT'ler yayımlamaktır. Bir token çalınırsa, saldırgan bu geçerlilik süresinin tamamı boyunca erişime sahip olur. Bunun yerine, kısa ömürlü bir erişim token'ı (ör. 15 dakika) ile daha uzun ömürlü bir yenileme token'ı kullanın.

Erişim token'ı anlık API isteklerini işlerken, sunucu tarafında güvenle saklanan yenileme token'ı, yeni erişim token'ları yayımlamak için kullanılır. Bu, saldırganın fırsat penceresini sınırlar. Uzun ömürlü token'lar yayımlamanız gerekiyorsa, Redis gibi dağıtık bir önbellekte ele geçen token'ları kara listeye alma mekanizmanız olduğundan emin olun.

2. HTTPS ve HttpOnly Çerezlerini Zorunlu Kılın

JWT'leri asla URL'de veya sorgu parametreleri olarak iletme, çünkü bunlar sunucu erişim günlüklerinde veya tarayıcı geçmişinde kaydedilebilir. Web uygulamaları için, token'ı bir httpOnly ve Secure çerezinde saklamak en güvenli yaklaşımdır. Bu, İstemci Tarafı Betik (XSS) saldırılarının JavaScript aracılığıyla token'ı okumasını engeller. Çerezlerin daha az pratik olduğu mobil veya yerel uygulamalarda, token'ı güvenli depolamada (iOS Keychain veya Android Keystore gibi) saklayın ve her zaman HTTPS kullanın.

3. Kafa Karışıklığı Saldırılarını Önlemek İçin Algoritmayı Sabitleyin

Önemli bir güvenlik açığı, sunucunun JWT başlığında sağlanan herhangi bir algoritmayı kabul etmesi durumunda ortaya çıkar. Saldırganlar, algoritmayı RS256 (asimetrik)dan HS256 (simetrik)e değiştirebilir ve token'ı, sunucunun yanlışlıkla gizli anahtar olarak kullanabileceği genel anahtarla imzalayabilir. Bunu önlemek için, token başlığındaki algoritmanın beklenen algoritmayla eşleştiğini açıkça doğrulayın.

import jwt from 'jsonwebtoken';

const verifyToken = (token, publicKey) => {
  try {
    // İzin verilen algoritmaları açıkça ayarlayın
    const decoded = jwt.verify(token, publicKey, {
      algorithms: ['RS256'] 
    });
    return decoded;
  } catch (err) {
    // Geçersiz token'ları veya yanlış algoritmaları ele alın
    throw new Error('Token doğrulaması başarısız oldu');
  }
};

4. İmzalama Anahtarlarını Düzenli Olarak Döndürün

İmzalama anahtarınız ele geçirilirse, daha önce yayımlanan tüm token'lar son kullanma tarihlerine kadar geçerli kalmaya devam eder. Bunu azaltmak için anahtar rotasyonu uygulayın. Token'ı hangi anahtarın imzaladığını belirlemek için JWT başlığında Anahtar Kimlikleri (kid) kullanın. Bu, birden fazla genel anahtar dağıtmanıza ve tüm mevcut oturumları geçersiz kılmadan gizli bilgileri döndürmenize olanak tanır. HashiCorp Vault gibi otomatik anahtar yönetim sistemleri, bu süreci güvenle yönetmenize yardımcı olabilir.

5. İddiaları (Claims) Katı Bir Şekilde Doğrulayın

Her zaman iss (yayımcı) ve aud (hedef kitle) iddialarını doğrulayın. Bunu yapmazsanız, aynı imzalama anahtarını paylaşıyorlarsa, Servis A tarafından yayımlanan bir token'ın Servis B'ye erişmek için kullanılması mümkündür. Doğrulama mantığınızın, bu iddiaları belirli uygulama ortamınız için beklenen değerlerle karşılaştırdığından emin olun.

Sonuç

JWT kimlik doğrulamasını güvence altına almak sadece kodlama ve imzalama ile ilgili değildir; token'ın tüm yaşam döngüsünü yönetmekle ilgilidir. Kısa son kullanma tarihleri uygulayarak, güvenli depolama mekanizmaları kullanarak, algoritmaları sabitleyerek ve anahtarları döndürerek saldırı yüzeyini önemli ölçüde azaltırsınız. JWT'yi her zaman bir taşıyıcı kimlik bilgisi olarak ele alın—yanlış ellere geçerse tam erişim sağlar. Kullanıcıların ve paydaşların güvenebileceği sağlam ve güvenli kimlik doğrulama sistemleri oluşturmak için bu uygulamaları benimseyin.

Share: