JWT veya erişim token'ını frontend'de nerede saklamalısınız? localStorage mı, cookie mi?
Cevap
Kısa cevap: Mümkünse oturumu HttpOnly, Secure, SameSite cookie ile yönetin; token JavaScript'ten hiç erişilebilir olmasın. SPA bir API'ye Bearer token göndermek zorundaysa, kısa ömürlü access token'ı bellekte, refresh token'ı HttpOnly cookie'de tutmak yaygın ve dengeli çözümdür.
| Yer | XSS riski | CSRF riski | Not |
|---|---|---|---|
localStorage | Yüksek: her script okuyabilir | Yok | Kalıcı, sekmeler arası paylaşılır |
sessionStorage | Yüksek | Yok | Sekme kapanınca silinir |
| Bellek (JS değişkeni) | Orta: çalınması zor ama XSS anında kullanılabilir | Yok | Sayfa yenilenince kaybolur |
| HttpOnly cookie | Düşük: JS okuyamaz | Var, SameSite ve CSRF token ile önlenir | Tarayıcı otomatik gönderir |
Önerilen akış
- Login sonrası sunucu refresh token'ı
HttpOnly; Secure; SameSite=Strict; Path=/auth/refreshcookie olarak set eder. - Access token (5-15 dk ömürlü) cevap gövdesinde döner ve bir JS değişkeninde tutulur.
- Sayfa yenilenince veya token süresi dolunca
/auth/refreshçağrılır. - Logout'ta cookie silinir, sunucuda refresh token iptal edilir (rotation).
BFF deseni
Daha güvenli bir seçenek: token'ları hiç tarayıcıya vermemek. Backend-for-Frontend sunucusu OAuth token'larını tutar, tarayıcıyla sadece oturum cookie'si üzerinden konuşur.
Önemli not
XSS varsa saldırgan, token'ı okuyamasa bile kullanıcının oturumunda istek atabilir. Yani hiçbir saklama yöntemi XSS'i önlemenin yerini tutmaz; amaç zararı (token'ın dışarı sızması, uzun süreli erişim) sınırlamaktır.
İlgili Tarayıcı & Web API'leri soruları
- Bir URL'yi tarayıcıya yazıp Enter'a bastığınızda neler olur?
- Web Worker nedir? Service Worker'dan farkı nedir?
- IntersectionObserver ne işe yarar? Örnek kullanım verin.
- Tarayıcı önbelleği nasıl çalışır? Cache-Control başlıkları nelerdir?
- localStorage, sessionStorage, cookie ve IndexedDB arasındaki farklar nelerdir?
- script etiketinde async ile defer arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.