REST API'lerde oturum yönetimi için JWT (JSON Web Token) kullanıldığında, access token ve refresh token ayrımı güvenlik açısından kritik bir tasarım kararıdır. Access token kısa ömürlüdür ve her istekte gönderilir; refresh token ise daha uzun süreli olup yeni access token almak için kullanılır. Bu yazıda, bu iki token türünün nasıl çalıştığını, hangi durumlarda tercih edilmesi gerektiğini ve uygularken dikkat edilmesi gereken noktaları adım adım inceleyeceğiz.
Access ve Refresh Token Arasındaki Fark Nedir?
Access token, kullanıcının kimliğini doğrulamak için API isteklerinde Authorization başlığında gönderilen kısa süreli (genellikle 15-30 dakika) bir JWT'dir. Refresh token ise yalnızca access token'ın süresi dolduğunda yeni bir access token almak için kullanılan, daha uzun ömürlü (7-30 gün) bir token'dır. Refresh token'ın asıl amacı, kullanıcıyı sürekli olarak yeniden giriş yapmaya zorlamadan oturumu canlı tutmaktır.
JWT Access Token Nasıl Uygulanır?
Access token oluşturma sürecinde payload'a kullanıcı ID, roller gibi temel bilgiler eklenir. Token'ı imzalamak için HS256 veya RS256 algoritmaları kullanılır. Örneğin, Node.js'te jsonwebtoken kütüphanesi ile aşağıdaki gibi bir token oluşturulabilir:
const jwt = require('jsonwebtoken');
const accessToken = jwt.sign({ userId: 123 }, process.env.ACCESS_SECRET, { expiresIn: '15m' });
Bu token istemciye gönderilir ve istemci her API isteğinde Bearer formatında gönderir. Sunucu tarafında, Axios interceptor gibi bir ara katman ile token otomatik olarak eklenebilir.
Refresh Token Kullanımının Avantajları ve Güvenlik Riskleri
Refresh token sayesinde access token'ın süresi kısa tutulabilir, böylece token çalındığında saldırganın kullanabileceği süre sınırlanır. Refresh token'ı, access token'dan ayıran en önemli özellik yalnızca belirli bir endpoint'te (/auth/refresh) kullanılmasıdır. Ancak refresh token'ın uzun süreli olması, onu daha cazip bir hedef haline getirir. Bu nedenle refresh token'ın güvenli bir şekilde saklanması gerekir. Web uygulamalarında httpOnly çerezler, mobil uygulamalarda ise güvenli depolama (Keychain/Keystore) kullanılmalıdır.
Refresh Token Rotasyonu ve Yeniden Kullanım Tespiti
Refresh token çalındığında saldırganın sonsuza kadar yeni access token üretmesini engellemek için refresh token rotasyonu (rotation) uygulanır. Her yeni access token alındığında eski refresh token geçersiz kılınır ve yeni bir refresh token verilir. Ayrıca, aynı refresh token'ın birden fazla kez kullanılması tespit edilerek tüm oturumlar iptal edilebilir (reuse detection). Bu teknik, güvenlik açısından en iyi uygulamalar arasındadır.
Uygulama Adımları: Access ve Refresh Token ile Oturum Yönetimi
1. Kullanıcı Girişi
Kullanıcı doğrulandıktan sonra hem access hem de refresh token oluşturulur. Refresh token sunucuda bir veritabanında (örneğin Redis) saklanabilir. İstemciye her iki token da döndürülür.
2. API İstekleri
İstemci, access token ile istek yapar. Sunucu token'ı doğrular ve geçerliyse yanıt döner. Token süresi dolduysa 401 hatası alınır.
3. Token Yenileme
401 hatası alan istemci, refresh token ile /auth/refresh endpoint'ine istek atar. Sunucu refresh token'ı doğrular, yeni bir access token (ve isteğe bağlı olarak yeni bir refresh token) oluşturur ve döndürür.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
- Access token'ı çok uzun süreli tutmak: Bu, çalınma durumunda riski artırır. Süreyi 15-30 dakika arasında tutun.
- Refresh token'ı istemci tarafında localStorage'a kaydetmek: XSS saldırılarına karşı savunmasızdır. httpOnly çerezleri tercih edin.
- Refresh token rotasyonu yapmamak: Saldırganın ele geçirdiği bir refresh token ile sürekli yeni token almasına izin verir.
- Token imzalama anahtarlarını zayıf seçmek: Güçlü ve rastgele oluşturulmuş gizli anahtarlar kullanın.
- Logout işleminde token'ı geçersiz kılmamak: Kullanıcı çıkış yaptığında hem access hem de refresh token'ı veritabanından silin veya kara listeye ekleyin.
İstemci Tarafında Token Yönetimi: React Örneği
React uygulamalarında token yönetimi için Zustand veya Redux Toolkit gibi state yönetim araçları kullanılabilir. Token yenileme işlemi genellikle bir axios interceptor içinde yapılır. Aşağıda basit bir örnek verilmiştir:
import axios from 'axios';
const api = axios.create({ baseURL: 'https://api.example.com' });
api.interceptors.response.use(
response => response,
async error => {
if (error.response?.status === 401 && !error.config._retry) {
error.config._retry = true;
const newAccess = await refreshAccessToken();
error.config.headers.Authorization = `Bearer ${newAccess}`;
return api(error.config);
}
return Promise.reject(error);
}
);
export default api;
Bu yapı, token yenileme işlemini otomatikleştirir ve kullanıcı deneyimini iyileştirir.
Alternatif Yaklaşımlar: Firebase ve Supabase
Eğer sıfırdan bir JWT altyapısı kurmak yerine hazır bir çözüm kullanmak isterseniz, Firebase veya Supabase gibi BaaS platformları kimlik doğrulama ve token yönetimini yerleşik olarak sunar. Örneğin, Firebase Authentication access ve refresh token yönetimini otomatik olarak gerçekleştirir. Ancak bu platformların sunduğu esneklik ve kontrol düzeyi sınırlı olabilir.
Özet
JWT access ve refresh token kullanımı, REST API'lerde güvenli ve ölçeklenebilir bir oturum yönetimi sağlar. Access token'ı kısa ömürlü tutmak, refresh token'ı güvenli depolamak ve rotasyon uygulamak temel güvenlik adımlarıdır. Bu makalede anlatılan yöntemleri projenize uyarlayarak daha güvenli bir kimlik doğrulama sistemi oluşturabilirsiniz. Unutmayın, her sistemin ihtiyacı farklıdır; bu nedenle ihtiyaçlarınıza en uygun token stratejisini seçin.
Sık Sorulan Sorular
Access token ve refresh token arasındaki temel fark nedir?
Access token, API isteklerinde kimlik doğrulamak için kullanılan kısa süreli (15-30 dk) bir token'dır. Refresh token ise daha uzun ömürlü (7-30 gün) olup yalnızca yeni access token almak için kullanılır.
Refresh token neden güvenli bir yerde saklanmalıdır?
Refresh token uzun süreli olduğu için çalındığında saldırgan süresiz olarak yeni access token alabilir. Bu nedenle web'de httpOnly çerezler, mobilde güvenli depolama (Keychain/Keystore) kullanılmalıdır.
Refresh token rotasyonu nedir?
Her yeni access token alındığında eski refresh token'ın geçersiz kılıp yeni bir refresh token verilmesidir. Bu, çalınan refresh token'ın kullanılmasını engeller.
JWT access token süresi ne kadar olmalıdır?
Genellikle 15-30 dakika önerilir. Çok kısa süreler kullanıcı deneyimini bozabilir, çok uzun süreler ise güvenlik riski oluşturur.






