SPA'da access token ve refresh token nerede saklanmalıdır? Refresh token rotation nasıl çalışır?
Cevap
Önerilen yaklaşım: access token kısa ömürlü (5-15 dk) olur ve bellekte (JS değişkeni) tutulur; refresh token ise `HttpOnly`, `Secure`, `SameSite` cookie içinde saklanır ve her kullanımda yenilenir (rotation). En güvenli seçenek ise token'ları hiç tarayıcıya vermeyip bir BFF ile session cookie kullanmaktır.
Saklama seçenekleri
| Yer | XSS riski | CSRF riski | Not |
|---|---|---|---|
| localStorage | Yüksek, JS okuyabilir | Yok | Uzun ömürlü token için önerilmez |
| Bellek (değişken) | Düşük ama sıfır değil | Yok | Sayfa yenilenince kaybolur |
| HttpOnly cookie | JS okuyamaz | Var, SameSite ve CSRF token ile önlenir | Refresh token için uygun |
XSS varsa saldırgan token'ı okuyamasa bile kullanıcının adına istek atabilir; yani hiçbir saklama yeri XSS'i tamamen telafi etmez.
Refresh token rotation
- Login sonrası sunucu access token'ı yanıt gövdesinde, refresh token'ı cookie'de döner.
- Access token süresi dolunca frontend
POST /auth/refreshçağırır; cookie otomatik gönderilir. - Sunucu refresh token'ı doğrular, eskisini geçersiz kılar, yeni bir access + refresh çifti üretir.
- Reuse detection: daha önce kullanılmış bir refresh token tekrar gelirse token çalınmış demektir; o token ailesinin tamamı iptal edilir ve kullanıcı yeniden giriş yapmak zorunda kalır.
// Frontend: 401 alınca bir kez refresh edip isteği tekrarla
async function api(url, opts = {}) {
let res = await fetch(url, { ...opts, headers: { Authorization: `Bearer ${accessToken}` } });
if (res.status === 401) {
const r = await fetch("/auth/refresh", { method: "POST", credentials: "include" });
if (!r.ok) return redirectToLogin();
accessToken = (await r.json()).accessToken;
res = await fetch(url, { ...opts, headers: { Authorization: `Bearer ${accessToken}` } });
}
return res;
}Aynı anda birden fazla istek 401 alırsa tek bir refresh promise'i paylaşılmalıdır; aksi halde rotation, ikinci refresh isteğini "reuse" sanıp oturumu kapatır.
İlgili Web Güvenliği soruları
- CORS nedir? Neden CORS hatası alırız?
- XSS ve CSRF saldırıları nedir, nasıl korunulur?
- Authentication ile authorization arasındaki fark nedir?
- Güvenli cookie ayarları nelerdir? Session hijacking nasıl önlenir?
- Content Security Policy (CSP) nedir ve nasıl yapılandırılır?
- OWASP Top 10 nedir? En önemli maddelerini özetleyin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.