Login ve Oturum Mimarisi: Güvenlik Perspektifi
Güvenli login ve oturum yönetimi nasıl tasarlanır? AES şifreleme, JWT, refresh token yenileme, CSRF, OTP ve session koruması ile eksiksiz çözüm.
1. Genel Mimari Bakış Token'lar UI tarafında kesinlikle saklanmaz (LocalStorage / SessionStorage kullanılmaz).
-
Sadece sunucu tarafında, AES-256-GCM ile şifrelenmiş bir session store (tercihen Redis) tutulur.
-
Kullanıcı tarafına yalnızca HttpOnly + Secure + SameSite=Strict cookie gönderilir.
-
Tüm iletişim HTTPS üzerinden yapılır ve HSTS (HTTP Strict Transport Security) aktif olmalıdır.
-
Session şifreleme anahtarları, KMS (Key Management Service) veya HSM (Hardware Security Module) üzerinden yönetilmelidir. Anahtarlar periyodik olarak rotasyona tabi tutulmalıdır.
2. Token ve Session Birlikte Neden Kullanılır ?
|
Amaç |
Neden |
|
Güvenlik |
UI token'lara erişemez → XSS riski minimize edilir. |
|
Performans |
UI sade cookie taşır, token kontrolü sunucuda yapılır. |
|
Otomasyon |
Token süresi %80 dolduğunda otomatik yenileme yapılır. |
3. Login Akışı
-
[UI] → POST /api/auth/login
-
[API] → Kimlik doğrulama (kullanıcı + şifre)
-
JWT (RS256 imzalı access token) + Refresh token üretilir.
-
Token’lar, AES-256-GCM ile sunucu tarafında şifrelenir.
-
Session store (Redis) içine yazılır.
-
Kullanıcıya sadece HttpOnly + Secure cookie döndürülür (__Host- prefix ile).
-
Redis key’ler otomatik olarak TTL (örneğin 24 saat) ile expire olacak şekilde ayarlanır.
4. Token Yaşam Döngüsü ve Yenileme
-
Access Token: 24 saat geçerlidir (idle-based timeout).
-
Refresh Token: 7 gün geçerlidir. Her yenilemede rotasyon uygulanır.
-
Eski refresh token anında geçersiz kılınır (token reuse engellenir).
-
Token süresi %80’e ulaştığında, arka planda güvenli yenileme isteği gönderilir.
-
Bu yenileme isteği mutlaka:
-
Session doğrulaması yapmalı.
-
Replay saldırılarını önlemek için nonce veya jti kontrolü içermelidir.
5. OTP (Tek Kullanımlık Şifre) Akışı
-
Yeni cihaz, şüpheli IP, yüksek yetkili hesap veya olağandışı davranış tespitinde zorunludur.
-
Risk temelli bir sistem tarafından tetiklenir.
-
OTP doğrulanmadan token oluşturulmaz.
-
Ek güvenlik önlemleri:
-
OTP deneme limiti (örneğin 5 hatalı girişte hesap kilidi)
-
OTP gönderim aralığı (örneğin 30 saniyede bir)
-
OTP log’larında masking (örneğin ****1234)
6. Logout / Oturum Sonlandırma
-
Kullanıcının session’ı Redis’ten silinir.
-
Token, revocation list veya blocklist içine eklenir.
-
Cookie temizlenir.
-
Bu işlem loglanır: IP, kullanıcı ID, zaman bilgisiyle.
7. Session Güvenliği
-
Her session, cihaz fingerprint’i (IP, User Agent, platform) ile ilişkilendirilir.
-
IP veya cihaz değişirse oturum sonlandırılır.
-
Session şifrelemesi AES-GCM ile yapılmalı; IV + salt kombinasyonu kullanılmalıdır.
-
Redis session anahtarları rastgele UUID (örneğin session:{uuidv4()}) şeklinde tutulmalıdır.
8. Token Güvenliği
-
JWT, RS256 (asimetrik anahtar) ile imzalanır.
-
Alanlar: iss, sub, aud, exp, iat, jti
-
Refresh token’lar:
-
Benzersiz jti içerir.
-
fingerprint (IP, cihaz bilgisi) ile eşleştirilir.
-
Revocation list ile sürekli kontrol edilir.
-
Gereksiz claim’ler kaldırılmalı → JWT payload’ı minimal tutulmalı.
9. CSRF Koruması
-
SameSite=Strict cookie policy.
-
Tüm state-changing isteklerde CSRF token zorunluluğu.
-
CSRF token çerez ile değil, DOM’a gömülü hidden input olarak iletilmeli.
-
Origin ve Referer header kontrolü aktif olmalı.
10. Header ve Protokol Koruması
|
hEADER |
AMAÇ |
|
Strict-Transport-Security |
HTTPS zorunluluğu |
|
Content-Security-Policy |
XSS ve inline script engeli |
|
X-Frame-Options |
Clickjacking önleme |
|
X-Content-Type-Options |
MIME-sniffing engelleme |
|
Referrer-Policy |
Gizlilik koruması |
|
Permissions-Policy |
Kamera, mikrofon erişim kısıtlaması |
Ek olarak:
-
Rate limiting (örneğin IP başına 10 istek / dakika)
-
Brute force koruması (örneğin 5 hatalı girişte lockout)
-
CORS yapılandırması: Access-Control-Allow-Origin asla * olmamalı eğer Allow-Credentials=true ise.
11. Test / Denetim Senaryoları
-
XSS: UI tarafından token erişim testi.
-
CSRF: CSRF token’sız istek testi.
-
Refresh Reuse: Eski refresh token ile yenileme denemesi.
-
Session Fixation: Aynı session ID farklı IP testleri.
-
OTP: Şüpheli IP senaryosunda OTP isteği kontrolü.
-
TTL Testleri: Redis session otomatik siliniyor mu?
-
Cookie Güvenliği: HttpOnly, Secure, SameSite flag’leri aktif mi?
12. Threat Modeling Tablosu
|
Tehdit |
Önlem |
|
XSS |
HttpOnly cookie + CSP |
|
CSRF |
SameSite + CSRF token |
|
Token çalma |
Server-side session + AES şifreleme |
|
Refresh token reuse |
Rotasyon + revocation kontrolü |
|
Session hijacking |
IP + fingerprint bağlantısı |
|
Token replay |
jti + nonce + revocation list |
|
Brute force |
Rate limit + lockout mekanizması |
14. Uyumluluk (GDPR / KVKK)
-
Session ID ve token’lar kişisel veri sayılabilir → AES şifreleme zorunludur.
-
Loglar IP, zaman ve kullanıcı ID içerir; ancak anonim hale getirilmelidir.
-
Çerez politikalarında amaç, saklama süresi ve kullanım açıklanmalıdır.
-
Kullanıcı, talep ettiğinde tüm session verileri silinebilmelidir.
15. Loglama ve Denetim
-
Her login, refresh, logout olayı loglanmalıdır.
-
Log formatı: {user_id, ip, user_agent, event_type, timestamp}
-
PII veriler maskeleme uygulanarak saklanmalıdır.
-
Log’lar WORM (Write Once Read Many) yapısında arşivlenmeli.
-
SIEM (Security Information and Event Management) entegrasyonu önerilir.
16. SSS (Sık Sorulan Sorular)
S: Cookie kullanmak güvenli mi?
C: Evet, HttpOnly + Secure + SameSite=Strict flag’leriyle kullanıldığı sürece XSS ve dinleme saldırılarına karşı güvenlidir.
S: Neden token’lar client tarafında değil de server-side saklanıyor?
C: LocalStorage gibi yapılar XSS’e açıktır. Server-side session store ise şifreli, yönetilebilir ve gerektiğinde iptal edilebilir.
S: Refresh token sızarsa ne olur?
C: Rotasyon sistemi sayesinde eski token anında geçersiz olur. Ayrıca fingerprint kontrolü ve IP farklılığı algılama sayesinde reuse tespit edilir.
S: Bu mimari Zero Trust mı?
C: Evet. Sunucular kimseye güvenmez, her istekte token doğrulama yapılır, minimum yetki uygulanır ve segmentasyon sağlanır.
ADİL ALATAŞ