JWT Refresh Token'ı Cookie'de Tutmak
Access token kısa, refresh httpOnly

Access token'ı JavaScript'in okuması gereken tek yer Authorization header'ı. Bunu localStorage'a yazmak, bir XSS'in oturumu taşıması demek. Refresh token'ı da oraya koymak, oturumu uzatmayı da çalmaya vermek.
İki parça
Access: bellek, 10-15 dakika, Authorization: Bearer. Refresh: httpOnly, Secure, SameSite=Lax veya Strict, dar path. Refresh endpoint'i cookie'yi okur, yeni access üretir, eski refresh'i döndürür (rotation).
context.Response.Cookies.Append("refresh", token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Lax,
Path = "/api/auth/refresh",
Expires = DateTimeOffset.UtcNow.AddDays(14)
});
Path'i / yapmak her isteğe cookie ekler. Dar path, CSRF yüzeyini küçültmez ama cookie'nin gitmesini sınırlar. SameSite=Lax, top-level GET navigasyonunda gider; refresh'i POST tutuyorum. SPA cross-site ise SameSite=None; Secure zorunlu, CSRF token da ayrı konuşulur.
Rotation
Aynı refresh iki kez gelirse hırsızlık varsayımı: ailedeki tüm token'ları düşür. Bunu log'lamadan 'muhtemelen çift tık' diye geçiştirmek, çalınmış oturumu bağışlamak. Çift tık için client'ın in-flight refresh'i paylaşması daha doğru.
Kaan'ın localStorage yazısıyla çakışmıyorum; o XSS varsayılanını anlatıyor. Bu yazı cookie tarafındaki ikinci yarım. İkisini birden yapmadan 'JWT kullandık' yetmez.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap