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.

YerXSS riskiCSRF riskiNot
localStorageYüksek: her script okuyabilirYokKalıcı, sekmeler arası paylaşılır
sessionStorageYüksekYokSekme kapanınca silinir
Bellek (JS değişkeni)Orta: çalınması zor ama XSS anında kullanılabilirYokSayfa yenilenince kaybolur
HttpOnly cookieDüşük: JS okuyamazVar, SameSite ve CSRF token ile önlenirTarayıcı otomatik gönderir

Önerilen akış

  1. Login sonrası sunucu refresh token'ı HttpOnly; Secure; SameSite=Strict; Path=/auth/refresh cookie olarak set eder.
  2. Access token (5-15 dk ömürlü) cevap gövdesinde döner ve bir JS değişkeninde tutulur.
  3. Sayfa yenilenince veya token süresi dolunca /auth/refresh çağrılır.
  4. 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.

  1. Bir URL'yi tarayıcıya yazıp Enter'a bastığınızda neler olur?OrtaTarayıcı & Web API'leriFrontend
  2. Web Worker nedir? Service Worker'dan farkı nedir?ZorTarayıcı & Web API'leriFrontend
  3. IntersectionObserver ne işe yarar? Örnek kullanım verin.OrtaTarayıcı & Web API'leriFrontend
  4. Tarayıcı önbelleği nasıl çalışır? Cache-Control başlıkları nelerdir?OrtaTarayıcı & Web API'leriFrontend
  5. localStorage, sessionStorage, cookie ve IndexedDB arasındaki farklar nelerdir?OrtaTarayıcı & Web API'leriFrontend
  6. script etiketinde async ile defer arasındaki fark nedir?KolayTarayıcı & Web API'leriFrontend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle