Mobil Uygulamalarda Güvenli Oturum Yönetimi Nasıl Yapılır?
Mobil uygulamalarda oturum güvenliği; JWT, OAuth 2.0 protokolleri, token şifreleme ve SSL/TLS ile sağlanır. Geliştirme sürecinde OWASP mobil standartları referans alınmalıdır.

İÇİNDEKİLER
%0 okundu
- Mobil ve Web Oturum Yönetimi Arasındaki Mimari Farklar
- Zayıf Oturum Yönetiminin Kurumsal Riskleri ve OWASP Standartları
- Güvenli Oturum Mimarisi: Temel Protokoller ve Standartlar
- Token'ların Mobil Cihazda Güvenli Saklanması
- Oturum Yaşam Döngüsü ve İleri Seviye Güvenlik Politikaları
- Güvenli Oturum Uygulamasında Yapılan Kritik Hatalar
- Mobil Oturum Güvenliğini Sürdürülebilir Kılma: Test ve İzleme Stratejileri
Mobil uygulamalarda oturum güvenliği; JSON Web Token (JWT), OAuth 2.0 ve OpenID Connect protokolleri, donanım destekli yerel şifreleme ve SSL/TLS tabanlı veri iletimi mimarileriyle sağlanır. Geliştirme süreçlerinde OWASP Mobile Application Security (MAS) standartlarının referans alınması, kurumsal veri sızıntılarını ve yetkisiz erişim risklerini minimize eder.
Mobil ekosistemde kullanıcı deneyimini bozmadan kurumsal veri güvenliğini sağlamak, doğru kurgulanmış bir kimlik doğrulama ve yetkilendirme mimarisi gerektirir. "Mobil Uygulamalarda Güvenli Oturum Yönetimi Nasıl Yapılır?" sorusunun yanıtı; istemci tarafında donanım seviyesinde korunan güvenli saklama alanlarından ağ katmanındaki sertifika sabitleme (certificate pinning) mekanizmalarına ve sunucu tarafındaki token rotasyon stratejilerine kadar uzanan çok katmanlı bir savunma modelinde yatar. Bu rehberde, mobil platformlarda güvenli oturum döngüsünün nasıl inşa edileceğini, şifreleme pratiklerini, platform tabanlı API entegrasyonlarını ve karşılaşılan teknik riskleri derinlemesine inceliyoruz.
Mobil ve Web Oturum Yönetimi Arasındaki Mimari Farklar
Geleneksel web uygulamalarında oturum yönetimi ağırlıklı olarak durum bilgisi tutan (stateful) çerezler (cookies) ve oturum kimlikleri (session ID) üzerinden yürütülür. Web tarayıcıları, sunucu tarafından Set-Cookie başlığıyla iletilen oturum bilgilerini otomatik olarak depolar ve sonraki her HTTP isteğinde ilgili etki alanına (domain) geri gönderir. Bu süreçte HttpOnly, Secure ve SameSite bayrakları (flags) gibi yerleşik tarayıcı güvenlik mekanizmaları, oturum çerezlerini Siteler Arası Betik Çalıştırma (XSS) ve Siteler Arası İstek Sahteciliği (CSRF) saldırılarına karşı doğal bir koruma kalkanına alır.
Mobil uygulamalarda ise durum bilgisi tutmayan (stateless) API mimarileri standarttır. Yerel (native) veya çapraz platform (cross-platform) mobil uygulamalar, geleneksel bir web tarayıcısı gibi yerleşik çerez havuzlarını varsayılan olarak yönetmez. Bunun yerine kimlik doğrulama, istemci tarafında tutulan ve her REST veya GraphQL API isteğinin Authorization başlığına (genellikle Bearer formatında) açıkça eklenen belirteçler (token) üzerinden sağlanır. Bu durum, istemcinin yetkilendirme belirteçlerini işletim sistemi düzeyinde nerede ve nasıl sakladığı sorusunu birincil güvenlik parametresi haline getirir.
Mobil ekosistemin bir diğer ayırt edici özelliği, cihazların değişken ağ koşullarına ve uzun süreli arka plan (background) yaşam döngülerine maruz kalmasıdır. Web kullanıcıları sekmeyi kapattığında veya tarayıcıyı sonlandırdığında oturum genellikle sonlandırılabilirken; mobil kullanıcılardan her uygulama açılışında yeniden kullanıcı adı ve parola girmeleri beklenemez. Kullanıcı tutundurma (retention) metriklerini korumak adına oturumların haftalarca, hatta aylarca açık kalması istenir. Bu ticari gereksinim, istemci tarafında saklanan yetkilendirme anahtarlarının fiziksel cihaz hırsızlığına, tersine mühendislik (reverse engineering) süreçlerine ve zararlı yazılımlara karşı en üst düzeyde korunmasını zorunlu kılar.
Mobil işletim sistemleri (iOS ve Android), uygulamaları "kum havuzu" (sandbox) adı verilen izole edilmiş işlem alanlarında çalıştırır. Her uygulamanın dosya sistemi diğer uygulamalardan yalıtılmıştır. Ancak cihazın root edilmesi (Android) veya jailbreak yapılması (iOS) durumunda bu kum havuzu mimarisi tamamen devre dışı kalır. Dolayısıyla web geliştiricilerinin nadiren endişelendiği "cihazın çalışma ortamının bizzat saldırganın kontrolünde olması" durumu, mobil oturum yönetiminin temel varsayımı olmak zorundadır.
Zayıf Oturum Yönetiminin Kurumsal Riskleri ve OWASP Standartları
Açık Web Uygulaması Güvenlik Projesi (OWASP), mobil ekosistemdeki en kritik zayıflıkları "OWASP Mobile Top 10" listesi altında sınıflandırmaktadır. Bu sınıflandırmada yer alan M4: Insecure Authentication (Güvensiz Kimlik Doğrulama) ve M5: Insufficient Cryptography (Yetersiz Kriptografi) başlıkları, doğrudan mobil oturum yönetimi zafiyetlerinden beslenir. İstemci tarafında oturum belirteçlerinin yetersiz şifrelenmesi veya sunucu tarafında geçersiz kılınamayan oturum politikaları, işletmeleri geniş çaplı veri ihlalleriyle karşı karşıya bırakır.
Zayıf oturum mimarilerinin doğurduğu en yaygın tehdit "Token Hijacking" (Belirteç Çalma) saldırılarıdır. Mobil uygulamanın kullandığı yetkilendirme belirteçleri düz metin dosyalarında, log çıktılarında veya paylaşılan depolama alanlarında tutulduğunda; cihazdaki kötü amaçlı başka bir uygulama veya cihazı geçici olarak eline geçiren bir üçüncü şahıs bu belirteci kolayca kopyalayabilir. Kopyalanan belirteç, sunucu tarafında oturum geçersiz kılma (invalidation) mekanizması bulunmuyorsa, süresi dolana kadar saldırgana meşru kullanıcı adına işlem yapma yetkisi tanır.
Bir diğer kritik risk ise "Session Fixation" (Sabit Oturum) ve zayıf oturum sonlandırma politikalarıdır. Kullanıcı şifresini değiştirdiğinde, hesabını askıya aldığında veya mobil uygulamadan "Çıkış Yap" (Logout) butonuna bastığında, eğer bu işlem yalnızca yerel veritabanındaki token'ı silmekle kalıyor ve sunucu tarafındaki oturum durumunu geçersiz kılmıyorsa sistem ciddi bir açık barındırıyor demektir. Eski token'a sahip olan bir saldırgan, kullanıcı çıkış yapmış olsa dahi arka uç API'lerine istek atmaya devam edebilir.
Kurumsal ölçekte bu zafiyetlerin faturası yalnızca teknik aksaklıklarla sınırlı kalmaz. KVKK (Kişisel Verilerin Korunması Kanunu), GDPR (Genel Veri Koruma Tüzüğü) ve finansal regülasyonlar (PCI-DSS) uyarınca, yetkisiz oturum kullanımı sonucu gerçekleşen veri sızıntıları milyonlarca liralık idari para cezalarına ve geri döndürülemez itibar kayıplarına yol açar. İşletmelerin siber güvenlik mimarilerini tasarlarken oturum güvenliğini bir ek özellik değil, yasal ve operasyonel bir zorunluluk olarak konumlandırmaları gerekir.
Güvenli Oturum Mimarisi: Temel Protokoller ve Standartlar
Mobil uygulamalarda ölçeklenebilir ve kurumsal düzeyde güvenli bir oturum yapısı kurmanın temel koşulu, endüstri standardı haline gelmiş protokollerin doğru varyasyonlarını uygulamaktır. Özel (proprietary) kimlik doğrulama algoritmaları geliştirmek yerine, küresel güvenlik denetimlerinden geçmiş OAuth 2.0, OpenID Connect (OIDC) ve JSON Web Token (JWT) standartları benimsenmelidir.
JSON Web Token (JWT) Mimarisi ve Kriptografik İmzalama
JSON Web Token (JWT), taraflar arasında JSON nesnesi formatında güvenli veri iletimi sağlayan açık bir standarttır (RFC 7519). Bir JWT; Başlık (Header), Yük (Payload) ve İmza (Signature) olmak üzere üç ana bileşenden oluşur ve bu parçalar nokta (.) karakteriyle ayrılarak Base64URL formatında kodlanır. Mobil oturum yönetiminde JWT, sunucu tarafında oturum tablosu sorgulamaya gerek kalmadan kullanıcının kimliğini ve yetkilerini doğrulamak için ideal bir mekanizmadır.
// JWT Header (Algoritma ve Token Türü)
{
"alg": "RS256",
"typ": "JWT"
}
// JWT Payload (Oturum Talepleri / Claims)
{
"sub": "usr_94a7b28c",
"name": "Ahmet Yılmaz",
"roles": ["editor", "analyst"],
"iat": 1787884800,
"exp": 1787885700,
"iss": "https://auth.kurum.com"
}JWT kullanımında yapılan en büyük hata, Payload alanının şifreli olduğunu varsaymaktır. Base64URL kodlaması bir şifreleme değil, yalnızca bir formatlama yöntemidir; dolayısıyla token'ı ele geçiren herkes payload içeriğini düz metin olarak okuyabilir. Bu nedenle JWT payload'ı içerisine asla kullanıcı parolası, kredi kartı numarası, T.C. kimlik numarası veya özel API anahtarları gibi gizli veriler eklenmemelidir. Payload yalnızca kullanıcının benzersiz kimliği (sub), token'ın geçerlilik süresi (exp) ve rol bazlı yetkileri gibi operasyonel verileri taşımalıdır.
Kriptografik imza katmanında simetrik algoritmalar (örneğin paylaşılan tek bir gizli anahtar kullanan HMAC-SHA256 / HS256) yerine, asimetrik algoritmalar (RSA-SHA256 / RS256 veya ECDSA-SHA256 / ES256) tercih edilmelidir. Asimetrik mimaride kimlik doğrulama sunucusu (Auth Server) token'ı yalnızca kendisinde bulunan özel anahtarla (private key) imzalar; mobil istemciler ve mikroservis API'leri ise sunucunun kamuya açık anahtarıyla (public key - JWKS) bu imzayı doğrular. Bu yaklaşım, gizli anahtarın dağıtılması riskini tamamen ortadan kaldırır.
OAuth 2.0 ve OpenID Connect (OIDC) Entegrasyonu
OAuth 2.0 (RFC 6749), kimlik bilgilerini paylaşmadan üçüncü taraf veya birinci taraf istemcilerin kaynaklara erişmesini sağlayan bir yetkilendirme çerçevesidir. OpenID Connect (OIDC) ise OAuth 2.0 üzerine inşa edilen ve kimlik doğrulama (authentication) katmanını ekleyen bir protokoldür. OIDC entegrasyonu sayesinde mobil uygulama, kullanıcıya ait bir id_token (kimlik kanıtı) ve arka uç servislerine erişmek için bir access_token (yetki anahtarı) elde eder.
Mobil istemciler, güvenli bir sunucu gibi kaynak kodlarını ve istemci sırlarını (client secret) gizli tutamazlar. Tersine mühendislik araçlarıyla (JADX, Ghidra, Frida) derlenmiş bir APK veya IPA dosyası incelenerek kod içine gömülmüş tüm sabit anahtarlar çıkarılabilir. Bu nedenle mobil uygulamalar OAuth 2.0 terminolojisinde "Genel İstemci" (Public Client) olarak sınıflandırılır. Genel istemciler için standart "Authorization Code Grant" akışının tek başına kullanılması güvensizdir.
PKCE (Proof Key for Code Exchange) ile Yetkilendirme Kodu Koruması
Yetkilendirme Kodu Ele Geçirme (Authorization Code Interception) saldırılarını engellemek amacıyla OAuth 2.0 akışına PKCE uzantısı (RFC 7636) entegre edilmelidir. PKCE, mobil uygulamanın her oturum açma isteği için rastgele dinamik bir kriptografik doğrulama dizisi üretmesini sağlar.
Süreç şu adımlarla işler:
Mobil istemci kriptografik olarak güvenli rastgele bir dizi üretir (
code_verifier).Bu dizinin SHA-256 özeti alınarak Base64URL ile kodlanır ve bir
code_challengeoluşturulur.Uygulama, tarayıcı tabanlı kimlik doğrulama ekranını açarken yetkilendirme sunucusuna
code_challengedeğerini iletir.Kullanıcı kimliğini doğruladıktan sonra sunucu, özel bir URI şeması (Custom URL Scheme) veya Universal Links/App Links aracılığıyla uygulamaya bir
authorization_codedöner.Uygulama, bu kodu ve ilk başta ürettiği ham
code_verifierdeğerini sunucunun token uç noktasına gönderir.Sunucu,
code_verifier'ın özetini alarak ilk adımdakicode_challengeile eşleştiğini doğrular ve ancak bu eşleşme sağlandığındaaccess_tokeniletir.
Bu mekanizma sayesinde, cihazdaki kötü niyetli bir başka uygulama Custom URL Scheme trafiğini dinleyerek yetkilendirme kodunu ele geçirse dahi, elinde orijinal code_verifier bulunmadığı için bu kodu access token'a dönüştüremez.
Token'ların Mobil Cihazda Güvenli Saklanması
Mobil uygulama mimarisinde en sık rastlanan güvenlik zafiyetlerinden biri, sunucudan başarıyla alınan access ve refresh token'ların istemci üzerinde standart depolama alanlarına düz metin olarak yazılmasıdır. Android platformunda SharedPreferences, iOS platformunda ise NSUserDefaults veya plist dosyaları şifrelenmemiş XML/JSON tabanlı dosyalardır. Root/Jailbreak yapılmış cihazlarda bu dosyalara dosya yöneticileriyle doğrudan erişilebilir; ayrıca cihaz yedeklemeleri (iTunes veya ADB backup) sırasında bu veriler üçüncü parti bilgisayarlara sızabilir.
+-------------------------------------------------------------------------+
| MOBİL GÜVENLİ DEPOLAMA KATMANI |
+-------------------------------------------------------------------------+
| iOS Platformu: |
| - Keychain Services API |
| - Donanım Katmanı: Secure Enclave (AES-256) |
| - Erişim Kısıtı: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly |
+-------------------------------------------------------------------------+
| Android Platformu: |
| - EncryptedSharedPreferences / AndroidX Security |
| - Donanım Katmanı: Android KeyStore (TEE / StrongBox) |
| - Kripto Algoritma: MasterKeys AES256_GCM |
+-------------------------------------------------------------------------+iOS Mimarisi: Keychain Services ve Secure Enclave Kullanımı
iOS işletim sisteminde oturum belirteçleri ve kriptografik anahtarlar için tasarlanmış resmi depolama alanı Keychain Services API'sidir. Keychain, verileri SQLite tabanlı şifreli bir veritabanında saklar ve bu veritabanının şifre çözme anahtarları donanım seviyesinde izole edilmiş Secure Enclave işlemcisi tarafından yönetilir.
Keychain'e veri yazarken erişilebilirlik seviyesi (accessibility attribute) doğru yapılandırılmalıdır. Kurumsal standartlara göre en güvenli yapılandırma kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly bayrağıdır:
Bu bayrak, cihaz kilitliyken verilerin şifreli kalmasını ve okunmamasını sağlar.
ThisDeviceOnlyeki, verinin iCloud veya iTunes yedeklemelerine dahil edilmesini engeller; böylece kullanıcı yedeklemesini başka bir cihaza yüklediğinde token yeni cihaza transfer edilmez ve oturumun yeni cihazda yeniden açılması zorunlu kılınır.
Biyometrik doğrulama (Face ID / Touch ID) gerektiren kritik kurumsal uygulamalarda, Keychain öğelerine SecAccessControl nesnesi atanabilir. Bu sayede token okunmak istendiğinde iOS işletim sistemi düzeyinde otomatik olarak biyometrik doğrulama penceresi tetiklenir ve başarılı doğrulama olmadan token bellekten okunamaz.
Android Mimarisi: EncryptedSharedPreferences ve Keystore
Android tarafında güvenli oturum depolaması için Google'ın geliştirdiği AndroidX Security kütüphanesi kapsamında yer alan EncryptedSharedPreferences ve donanım destekli Android KeyStore sistemi kullanılmalıdır.
Bu mimarinin çalışma prensibi çift katmanlı şifrelemeye (Two-Tier Key Encryption) dayanır:
Keyset Şifreleme (Master Key): Android KeyStore içerisinde, cihazın Güvenilir Yürütme Ortamı (TEE - Trusted Execution Environment) veya donanımsal StrongBox çipi tarafından desteklenen bir ana anahtar (Master Key) üretilir. Bu anahtar cihazın normal işletim sistemi belleğine asla çıkarılmaz.
Veri Şifreleme:
EncryptedSharedPreferences, anahtarları AES-256-SIV algoritmasıyla, token değerlerini ise AES-256-GCM algoritmasıyla şifreler. Şifreleme anahtarları yalnızca KeyStore'daki Master Key tarafından çözülebilir.
// Android Güvenli Token Saklama Örneği (Kotlin)
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.setUserAuthenticationRequired(false) // Biyometri gerekiyorsa true yapılabilir
.build()
val securePreferences = EncryptedSharedPreferences.create(
context,
"secure_session_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
// Token'ı şifreli olarak kaydetme
securePreferences.edit()
.putString("access_token", accessToken)
.putString("refresh_token", refreshToken)
.apply()Cihazın yedeklenmesi durumunda güvenlik riskini bertaraf etmek için AndroidManifest.xml dosyasında android:allowBackup="false" tanımlanmalı veya backup_rules.xml üzerinden şifreli tercih dosyaları yedekleme kapsamı dışında bırakılmalıdır.
Mobil uygulamanızın oturum verilerini yayına almadan önce aşağıdaki teknik kriterlere göre doğrulayın: 01 iOS Keychain yapılandırmasında ThisDeviceOnly bayrağının aktif olduğunu ve verilerin iCloud yedeklerine sızmadığını doğrulayın. Android tarafında standart SharedPreferences yerine EncryptedSharedPreferences ve AES-256-GCM standardını kullanın. AndroidManifest.xml dosyasında yerel veri yedekleme izinlerini (allowBackup) kurumsal politikalara göre kısıtlayın. Hassas API anahtarlarını veya token'ları logcat/console çıktılarına yazdıran tüm kod bloklarını üretim (release) derlemesinde temizleyin. Veri İletişimi ve Ağ Güvenliği (In-Transit Security) Mobil cihazlar gün boyunca kafelerdeki şifresiz Wi-Fi ağları, hücresel baz istasyonları ve kurumsal vekil sunucular (proxy) arasında sürekli geçiş yapar. Bu dinamik ortam, ağ trafiğinin dinlenmesi ve manipüle edilmesi riskini (Man-in-the-Middle - MitM) en üst düzeye çıkarır. Oturum belirteçlerinin ağ üzerinden iletimi sırasında şifrelenmesi ve doğrulanması, istemci güvenliği kadar kritiktir. SSL/TLS Yapılandırması ve Kriptografik Standartlar Tüm mobil istemci-sunucu iletişimi istisnasız olarak HTTPS (TLS 1.2 veya tercihen TLS 1.3) üzerinden yürütülmelidir. Mobil platformların ağ güvenlik yapılandırmaları (iOS App Transport Security - ATS ve Android Network Security Config) düz metin HTTP trafiğini varsayılan olarak engeller. Geliştiriciler yerel testler veya üçüncü parti API'ler için bu kalkanları gevşetmemeli; üretim ortamlarında zayıf şifreleme süitlerini (RC4, 3DES, CBC modu şifreler) sunucu tarafında devre dışı bırakmalıdır. Ağ katmanında PFS (Perfect Forward Secrecy) destekleyen ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) anahtar değişim algoritmaları zorunlu tutulmalıdır. PFS sayesinde, sunucunun özel anahtarı gelecekte ele geçirilse dahi, geçmişe dönük kaydedilmiş ağ trafiğindeki oturum token'larının şifresi çözülemez. Certificate Pinning ile Ortadaki Adam (MitM) Saldırılarını Önleme Standart bir TLS el sıkışmasında mobil işletim sistemi, sunucunun sunduğu sertifikayı cihazda yerleşik olarak bulunan güvenilir Kök Sertifika Otoriteleri (Root CA) havuzunu kontrol ederek doğrular. Ancak bir saldırgan (veya kurumsal bir proxy aracı) kullanıcının cihazına kendi kök sertifikasını yükleyebilirse (örneğin Charles Proxy, Burp Suite gibi araçlarla veya zararlı profil yükleterek), istemci ile sunucu arasındaki tüm şifreli trafiği çözebilir ve Authorization başlığındaki token'ları ele geçirebilir. Bu tehdidi bertaraf etmek için "Certificate Pinning" (Sertifika Sabitleme) veya "Public Key Pinning" (Kamuya Açık Anahtar Sabitleme) yöntemi uygulanır. Sertifika sabitleme uygulandığında mobil uygulama, işletim sisteminin Root CA havuzuna güvenmek yerine, yalnızca içerisine önceden gömülmüş olan belirli bir X.509 sertifikasını veya bu sertifikanın kamuya açık anahtarının (SubjectPublicKeyInfo - SPKI) SHA-256 özetini kabul eder. <!-- Android res/xml/network_security_config.xml Örneği --> <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">api.kurum.com</domain> <pin-set expiration="2027-01-01"> <!-- Birincil Sertifika SPKI Özeti --> <pin digest="SHA-256">k20Uax...anahtar1_ozeti...</pin> <!-- Yedek / Rotasyon Sertifikası SPKI Özeti --> <pin digest="SHA-256">m89Jio...anahtar2_ozeti...</pin> </pin-set> </domain-config> </network-security-config> Sertifika sabitleme mimarisinde dikkat edilmesi gereken kritik operasyonel risk, sertifika süresi dolduğunda veya sertifika zorunlu olarak yenilendiğinde uygulamanın sunucuya erişemez hale gelmesidir (Hard Brick riski). Bu riski önlemek için: Public Key (SPKI) Doğrudan yaprak sertifikayı (Leaf Certificate) sabitlemek yerine, sertifikanın Public Key (SPKI) değeri sabitlenmelidir. Böylece sertifika yenilense dahi aynı anahtar çifti kullanıldığı sürece uygulama kesintiye uğramaz. Yedek Pin (Backup Pin) Yapılandırma içerisine mutlaka geçerlilik süresi daha uzun olan en az bir adet Yedek Pin (Backup Pin) eklenmelidir. Mobil oturum yönetiminde güvenlik ile kullanıcı deneyimi arasındaki hassas denge, akıllı bir belirteç yaşam döngüsü (token lifecycle) tasarımıyla kurulur. Bir kullanıcının aylarca oturumunun açık kalmasını sağlarken aynı zamanda çalınan bir token'ın yaratacağı zararı sıfırlamak, dinamik rotasyon ve sunucu tarafı oturum kontrol mekanizmalarıyla mümkündür. Stateless mimarilerde en yaygın yaklaşım çift token modelidir: Access Token: Kısa ömürlüdür (Önerilen süre: 5 ila 15 dakika). API isteklerinde yetkilendirme amacıyla kullanılır. Süresi dolduğunda API sunucusu Refresh Token: Uzun ömürlüdür (Önerilen süre: 7 ila 30 gün). Yalnızca yeni bir access token almak amacıyla kimlik doğrulama sunucusuna iletilir. Saldırganların ele geçirdiği bir refresh token ile süresiz oturum açmasını engellemek için Refresh Token Rotation (RTR) zorunlu kılınmalıdır. Bu modelde istemci her yeni access token talep ettiğinde, sunucu eski refresh token'ı geçersiz kılar ve yeni bir access token ile birlikte yepyeni bir refresh token üretip istemciye teslim eder. Eğer bir saldırgan önceden kullanılmış eski bir refresh token'ı (örneğin Token A) sunucuya sunarsa, sunucu bunun bir belirteç sızıntısı olduğunu anlar. Bu durumda güvenlik mekanizması devreye girer: İlgili kullanıcıya ve cihaza ait tüm aktif oturum ailesi (Token B dahil) anında iptal edilir (Automatic Reuse Detection). Meşru kullanıcı bir sonraki istekte oturum açma ekranına yönlendirilir. Tamamen durum bilgisi tutmayan (stateless) JWT yapılarında, token istemciye verildikten sonra süresi dolana kadar sunucu tarafından iptal edilmesi zordur. Bu kısıtlamayı aşmak için hibrit bir mimari kurulmalıdır: Kimlik doğrulama sunucusunda her aktif cihaz/oturum için bir Oturum sonlandırma, şifre sıfırlama veya uzaktan cihaz iptali tetiklendiğinde; sunucu tarafındaki Redis gibi yüksek performanslı önbellek mekanizmalarında ilgili API Gateway katmanında gelen her istekteki JWT'nin imza doğrulaması yapıldıktan sonra, payload'daki Bankacılık, e-ticaret ve sağlık gibi yüksek regülasyonlu sektörlerde kullanıcı belirli bir süre (örneğin 5 dakika) işlem yapmadığında oturumun geçici olarak kilitlenmesi gerekir. Bu senaryoda token'ları bellekten tamamen silmek yerine "Kademeli Yetkilendirme" (Step-Up Authentication) mimarisi uygulanır: Uygulama arka plana geçtiğinde veya hareketsizlik süresi dolduğunda oturum yerel olarak kilitlenir. Kullanıcı uygulamayı açtığında yerel biyometrik doğrulama (Face ID / Android BiometricPrompt) istenir. Biyometrik onay başarıyla tamamlandığında şifreli kasadaki token'lar okunarak API çağrılarına devam edilir. Parola değiştirme, para transferi veya hassas veri görüntüleme gibi kritik işlemlerde ise sunucu tarafında kısa ömürlü ikincil bir doğrulama token'ı (Step-Up Token) talep edilir. Bir mobil uygulamada güvenli oturum açma, sürdürme ve sonlandırma adımları: Kullanıcı kimlik bilgileri PKCE destekli OAuth 2.0 akışıyla sunucuya iletilir; sunucu kısa ömürlü access token ve uzun ömürlü refresh token üretir. Belirteçler iOS Keychain veya Android EncryptedSharedPreferences içerisine yazılır; tüm ağ istekleri TLS 1.3 ve Certificate Pinning korumasıyla gönderilir. Access token süresi dolduğunda (401 yanıtı) arka planda refresh token ile yeni bir token çifti talep edilir ve eski refresh token iptal edilir. Kullanıcı çıkış yaptığında istemcideki tüm yerel anahtarlar temizlenir ve sunucudaki oturum kaydı kara listeye (blacklist) alınarak geçersiz kılınır. Mobil oturum mimarisi tasarlayan ekipler, geliştirme hızını artırmak veya test süreçlerini kolaylaştırmak amacıyla genellikle farkında olmadan ciddi güvenlik açıkları yaratırlar. Bu anti-desenlerin (anti-patterns) tespit edilmesi, uygulamanın güvenlik dayanıklılığını artırır. Birinci yaygın hata, Sabit Gizli Anahtarların (Hardcoded Secrets) Uygulama Koduna Gömülmesidir. OAuth 2.0 istemci sırları (client secret), JWT imzalama anahtarları veya şifreleme parolaları kaynak kod içerisine sabit değişken olarak yazıldığında, tersine mühendislik araçlarıyla saniyeler içinde açığa çıkarılabilir. Genel mobil istemcilerde istemci sırrı kullanılmamalı, PKCE akışına geçilmelidir. İkinci kritik hata, Root/Jailbreak Tespiti ve RASP Mekanizmalarının İhmal Edilmesidir. Güvenlik kum havuzu kırılmış bir cihazda işletim sisteminin sunduğu Keychain veya Keystore korumaları saldırganlar tarafından kanca atma (hooking - Frida, Xposed) teknikleriyle manipüle edilebilir. Uygulama başlatılırken ortam bütünlüğü denetlenmeli (Play Integrity API / DeviceCheck) ve riskli ortamlarda oturum açılması engellenmelidir. Üçüncü hata ise Süresi Hiç Dolmayan Access Token'ların Kullanılmasıdır. Geliştiriciler refresh token akışını yönetmenin karmaşıklığından kaçınmak için access token geçerlilik sürelerini 1 yıl gibi gerçek dışı seviyelere çekebilmektedir. Süresi dolmayan bir token, çalındığı andan itibaren sisteme kalıcı bir arka kapı (backdoor) açar. Mobil uygulamalarda oturum güvenliği mimarisini kurmak başlangıç adımıdır; bu güvenliğin sürdürülebilir olması ise sürekli denetim ve izleme süreçlerine bağlıdır. Mobil işletim sistemleri her yıl köklü güncellemeler almakta, yeni API'ler sunulurken eski kriptografik yöntemler kullanımdan kaldırılmaktadır (deprecated). Dolayısıyla oturum mimarisi canlı bir sistem olarak yönetilmelidir. Statik Uygulama Güvenlik Testleri (SAST) ve Dinamik Uygulama Güvenlik Testleri (DAST), CI/CD dağıtım boru hatlarına (pipeline) entegre edilmelidir. SAST araçları (örneğin MobSF - Mobile Security Framework), kod tabanında unutulmuş sabit anahtarları, güvensiz depolama fonksiyonlarını ve yetersiz şifreleme algoritmalarını derleme aşamasında yakalar. DAST araçları ise uygulamanın çalışma zamanındaki (runtime) ağ trafiğini ve bellek durumunu analiz ederek yetkisiz oturum sızıntılarını raporlar. Düzenli aralıklarla bağımsız siber güvenlik uzmanları tarafından Mobil Sızma Testleri (Penetration Testing) yaptırılmalıdır. Bu testlerde OWASP MASVS (Mobile Application Security Verification Standard) L2 seviyesi hedeflenmeli; tersine mühendislik dayanıklılığı, bellek manipülasyonu, token sızdırma senaryoları ve API yetki aşımı (BOLA/IDOR) zafiyetleri simüle edilmelidir. İzleme ve telemetri tarafında ise anormal oturum aktiviteleri merkezi Güvenlik Bilgisi ve Olay Yönetimi (SIEM) sistemlerine aktarılmalıdır. Aynı kullanıcı kimliğiyle çok kısa sürede coğrafi olarak imkansız farklı konumlardan (Impossible Travel) istek atılması veya bir refresh token'ın birden fazla cihaz tarafından aynı anda sunulması gibi şüpheli durumlar, otomatik oturum sonlandırma ve hesap dondurma mekanizmalarını tetiklemelidir. Belirteçler iOS platformunda donanım seviyesinde korunan Keychain Services üzerinde, Android platformunda ise Android KeyStore tarafından yönetilen EncryptedSharedPreferences içerisinde şifreli olarak saklanmalıdır. Standart UserDefaults veya SharedPreferences alanları düz metin olduğu için kesinlikle kullanılmamalıdır. Access token, API kaynaklarına doğrudan erişim sağlayan 5 ila 15 dakikalık kısa ömürlü bir yetki anahtarıdır. Refresh token ise yalnızca süresi dolan access token'ı yenilemek için kullanılan, istemci tarafında güvenle saklanan ve her kullanımda rotasyona tabi tutulan uzun ömürlü bir belirteçtir. JWT veriyi şifrelemez, yalnızca içeriğin değiştirilmediğini kriptografik olarak imzalar ve Base64URL ile kodlar. Bu nedenle JWT içerisine hassas veri konulmamalı, imzalama için asimetrik algoritmalar (RS256/ES256) tercih edilmeli ve istemci tarafında donanım tabanlı şifreli kasalarda saklanmalıdır. Certificate Pinning, uygulamanın yalnızca tanımlanmış belirli bir sunucu sertifikası veya açık anahtarla iletişim kurmasını sağlar. Bu sayede cihazına sahte kök sertifika yüklenmiş kullanıcıların veya halka açık ağlardaki saldırganların ağ trafiğini çözüp oturum token'larını ele geçirmesi (MitM) engellenir. Sunucu tarafında her aktif oturum için bir Session ID veya kullanıcı bazlı Token Version değeri tutulmalıdır. Uzaktan çıkış talep edildiğinde ilgili kimlik sunucudaki önbellekte (Redis) kara listeye alınır ve API Gateway bu kimliği taşıyan tüm istekleri anında reddeder. Çıkış işlemi iki adımlı olmalıdır; istemci tarafında Keychain/Keystore içindeki tüm yerel token'lar ve önbellekler temizlenmeli, eş zamanlı olarak kimlik sunucusuna istek atılarak refresh token ve aktif oturum kaydı sunucu veritabanında geçersiz kılınmalıdır. Mobil uygulamalar kaynak kodlarındaki istemci sırrını (client secret) gizleyemeyen genel istemcilerdir. PKCE, her oturum açma isteğinde dinamik olarak üretilen tek kullanımlık kriptografik anahtarlar sayesinde yetkilendirme kodunun başka uygulamalar tarafından çalınmasını engeller. Bu tür cihazlarda kum havuzu koruması devre dışı kaldığından, uygulama başlangıcında Play Integrity API veya DeviceCheck ile cihaz bütünlüğü denetlenmelidir. Yüksek riskli finansal veya kurumsal uygulamalarda root/jailbreak tespit edildiğinde oturum açılışı tamamen engellenmelidir.İstemci Tarafı Token Saklama Güvenlik Kontrol Listesi
Oturum Yaşam Döngüsü ve İleri Seviye Güvenlik Politikaları
Access Token ve Refresh Token Rotasyonu
401 Unauthorized yanıtı döner.[Mobil İstemci] [Auth Sunucusu]
| |
|--- 1. POST /token (Refresh Token A) ------------>|
| | (Token A geçerli mi?)
| | (Token A'yı iptal et)
| | (Token B üret)
|<-- 2. Yanıt: Access Token 2 + Refresh Token B ---|
| |Cihaz Kaybı ve Uzaktan Oturum Sonlandırma (Revocation)
Session ID (sid) veya kullanıcıya ait bir Token Version değeri tutulur. Bu değer JWT payload'ına claim olarak eklenir.sid kara listeye (blacklist) alınır veya kullanıcının geçerli Token Version numarası bir artırılır.sid değerinin kara listede olup olmadığı kontrol edilir.Hareketsizlik ve Biyometrik Doğrulama
Güvenli Oturum Yaşam Döngüsü Süreci
İlk Kimlik Doğrulama ve Token Temini
Güvenli Depolama ve Yetkilendirilmiş İstekler
Otomatik Token Rotasyonu ve Yenileme
Oturumun Sonlandırılması ve Sunucu Tarafı İptal
Güvenli Oturum Uygulamasında Yapılan Kritik Hatalar
Mobil Oturum Güvenliğini Sürdürülebilir Kılma: Test ve İzleme Stratejileri
Sıkça Sorulan Sorular
Mobil uygulamalarda oturum belirteçleri (token) nerede saklanmalıdır?
Access Token ile Refresh Token arasındaki temel fark nedir?
JSON Web Token (JWT) tek başına güvenli bir oturum çözümü müdür?
Certificate Pinning mobil uygulamalarda neden gereklidir?
Cihazı çalınan veya kaybolan bir kullanıcının oturumu nasıl sonlandırılır?
Mobil uygulamada "Çıkış Yap" (Logout) işlemi nasıl kurgulanmalıdır?
PKCE (Proof Key for Code Exchange) neden mobil OAuth akışlarında zorunludur?
Root edilmiş veya Jailbreak yapılmış cihazlarda oturum güvenliği nasıl sağlanır?