How-To Guides

JWT Kimlik Doğrulamayı Nasıl Güvence Altına Alırsınız: Modern Web Uygulamaları İçin En İyi Uygulamalar

JSON Web Tokens (JWT), modern web ve mobil uygulamalarda durum bilgisi gerektirmeyen kimlik doğrulama için standart haline geldi. Taraflar arasında iddiaları iletmek için özlü ve kendi kendine yeterli bir yol sunar. Ancak bu kolaylık genellikle yanlış bir güvenlik hissi yaratır. Geliştiricilerin JWT'yi, token çalınması, yeniden oynatma saldırıları ve algoritma kafa karışıklığı gibi potansiyel saldırı vektörlerini tam olarak anlamadan uyguluyorlar. Bu kılavuzda, temel uygulamaların ötesine geçerek kimlik doğrulama katmanınızı korumak için gerekli kritik güvenlik önlemlerini keşfedeceğiz.

1. JWT'leri Asla LocalStorage'da Saklamayın

JWT uygulamasındaki en yaygın hata, tokenları tarayıcının localStorage veya sessionStorage'inde saklamaktır. Erişilebilir olsalar da, bu depolama mekanizmaları Çapraz Site Komut Dosyası (XSS) saldırılarına karşı hassastır. Bir saldırgan uygulamanıza kötü amaçlı JavaScript enjekte ederse, tokenı localStorage'dan kolayca okuyabilir ve kullanıcıyı taklit edebilir.

Çözüm: JWT'leri httpOnly, Secure ve SameSite=Strict özelliklerine sahip çerezlerde saklayın. Bu, tokenın yalnızca aynı etki alanına yapılan isteklerle gönderilmesini ve istemci tarafı JavaScript tarafından erişilememesini sağlar. Bu, XSS tabanlı token çalınmasını etkili bir şekilde azaltır.

2. Kısa Ömürlü Erişim Tokenları Uygulayın

Uzun ömürlü erişim tokenları zamanlanmış bir bombadır. Bir erişim tokenı çalınırsa, saldırgan onu istismar etmek için uzun bir pencereye sahip olur. Bir erişim tokenının ömrünü kısa tutarak (örneğin 5 ila 15 dakika), çalınmayla ilişkili riski en aza indirirsiniz.

Çözüm: Yenileme Tokenı stratejisi kullanın. Erişim tokenları kısa ömürlü olmalı, yenileme tokenları ise daha uzun ömürlü olabilir (örneğin 7 gün). Yenileme tokenı güvenli bir çerezde saklanır ve erişim tokenı süresi dolduğunda, istemci kullanıcının yeniden giriş yapmasını gerektirmeden yeni bir erişim tokenı almak için yenileme tokenını kullanır.

Örnek: Node.js/Express'te Token Süresini Ayarlama

const jwt = require('jsonwebtoken');

// Kısa ömürlü erişim tokenı
const accessToken = jwt.sign(
  { userId: user.id, role: user.role },
  process.env.ACCESS_TOKEN_SECRET,
  { expiresIn: '15m' }
);

// Uzun ömürlü yenileme tokenı (bunu veritabanında ve çerezde güvenli bir şekilde saklayın)
const refreshToken = jwt.sign(
  { userId: user.id },
  process.env.REFRESH_TOKEN_SECRET,
  { expiresIn: '7d' }
);

3. Güçlü İmzalama Algoritmaları Kullanın

JWT'ler bütünlüğü sağlamak için kriptografik imzaya dayanır. Geliştiriciler, RS256 veya ES256 gibi asimetrik algoritmaları veya karmaşık gizli anahtarlarla HS256 gibi güçlü simetrik algoritmaları kullandıklarından emin olmalıdır. Doğrulamayı tamamen devre dışı bırakan none algoritmasından kaçının ve saldırganın tokenları sahte hale getirmek için algoritmayı RS256'dan HS256'ya değiştirdiği algoritma kafa karışıklığı saldırılarına karşı dikkatli olun.

Çözüm: Doğrulama mantığınızda izin verilen algoritmaları açıkça tanımlayın. İstemci tarafından gönderilen alg başlığına asla güvenmeyin.

Örnek: Güvenli JWT Doğrulama

// jsonwebtoken kullanarak Node.js'de
const verified = jwt.verify(token, publicKey, {
  algorithms: ['RS256'] // Yalnızca RS256'yı açıkça izin verin
});

4. Token İptali Uygulayın

JWT'lerin başlıca eleştirilerinden biri, durum bilgisi gerektirmemeleri ve bu nedenle iptalinin zor olmasıdır. Ancak güvenlik açısından kritik uygulamalar için, özellikle bir kullanıcı çıkış yaptığında veya hesabı ele geçirildiğinde, tokenları iptal edebilmelisiniz.

Çözüm: İptal edilen token kimliklerinin (JTI - JWT ID) bir kara listesini tutun. Bir kullanıcı çıkış yaptığında veya bir güvenlik olayı yaşandığında, tokenın JTI'sini, süresi tokenın kalan ömrüne eşit olacak şekilde hızlı erişimli bir depolama sistemi olan Redis'e ekleyin. İstek doğrulaması sırasında JTI'yi bu kara listeyle doğrulayın.

Sonuç

JWT kimlik doğrulamayı güvence altına almak, yalnızca bir tokenı imzalamaktan ibaret değildir; güvenli depolama, kısa ömürler, sağlam imzalama uygulamaları ve iptal mekanizmalarını içeren bütünsel bir yaklaşım gerektirir. Bu en iyi uygulamaları takip ederek, uygulamanızın saldırı yüzeyini önemli ölçüde azaltabilir ve kullanıcılarınız için daha güvenli bir deneyim sağlayabilirsiniz. Unutmayın, güvenlik sürekli bir süreçtir; bu nedenle kimlik doğrulama akışınızı düzenli olarak denetleyin ve en son kriptografik standartlarla güncel kalın.

Share: