Mobil uygulamalarda kullanıcı kimlik doğrulaması söz konusu olduğunda OAuth 2.0, endüstri standardı bir protokoldür. Ancak mobil istemcilerde Authorization Code Flow'un doğrudan kullanımı, istemci sırrının (client secret) güvenliği riski nedeniyle önerilmez. İşte bu noktada Proof Key for Code Exchange (PKCE) devreye girer. PKCE, OAuth 2.0'a eklenen ve mobil uygulamalar için yetkilendirme kodunun ele geçirilmesini önleyen bir güvenlik katmanıdır.
OAuth 2.0 ve PKCE Neden Gereklidir?
Mobil uygulamalar, web uygulamalarına kıyasla daha kırılgan bir güvenlik yüzeyine sahiptir. Uygulama ikili dosyaları tersine mühendislikle incelenebilir, dolayısıyla statik olarak gömülen istemci sırları kolayca ifşa olabilir. PKCE olmadan bir saldırgan, yetkilendirme kodunu ele geçirip token talep edebilir. PKCE, dinamik olarak oluşturulan bir kod doğrulayıcı (code verifier) ve bunun özeti (code challenge) kullanarak bu saldırıyı engeller.
PKCE (okunuşu “pixie”), OAuth 2.0 Authorization Code Flow’un mobil ve tek sayfa uygulamalar için güvenli bir versiyonudur. İstemci sırrı gerektirmez; bunun yerine kriptografik olarak kanıtlanmış bir kod talebi kullanır.
PKCE Nasıl Çalışır?
PKCE akışında şu adımlar izlenir:
- Kod Doğrulayıcı (Code Verifier) Oluşturma: Uygulama, yüksek entropili rastgele bir dize (örneğin 48 bayt) üretir. Bu dize base64url formatında kodlanır.
- Kod Challenge (Code Challenge) Oluşturma: Kod doğrulayıcının SHA-256 özeti alınır ve base64url formatına dönüştürülür. Alternatif olarak “plain” yöntemi de vardır ancak SHA-256 önerilir.
- Yetkilendirme İsteği: Kullanıcı, yetkilendirme sunucusuna yönlendirilir. İstek parametrelerine
code_challengevecode_challenge_method(S256) eklenir. - Yetkilendirme Kodu Alımı: Kullanıcı giriş yaptıktan sonra sunucu, uygulamaya yetkilendirme kodu döner.
- Token İsteği: Uygulama, token endpoint’ine
code_verifier,grant_type=authorization_codeve alınan kodu gönderir. Sunucu, code_verifier ile code_challenge’i karşılaştırır; eşleşirse token verir.
iOS ve Android’de PKCE Uygulaması
iOS (Native veya Swift)
iOS’ta AppAuth kütüphanesi PKCE desteği sunar. Öncelikle CocoaPods veya Swift Package Manager ile AppAuth entegre edilir. Ardından bir OIDAuthState oluşturulur. Aşağıda temel bir örnek bulabilirsiniz:
let serviceConfiguration = OIDServiceConfiguration(authorizationEndpoint: authURL, tokenEndpoint: tokenURL)
let request = OIDAuthorizationRequest(configuration: serviceConfiguration,
clientId: clientID,
scopes: ["openid", "profile"],
redirectURL: redirectURI,
responseType: OIDResponseTypeCode,
additionalParameters: nil)
AppAuth, code_challenge ve code_challenge_method parametrelerini otomatik ekler.
Kullanıcı yetkilendirme tamamlandığında, OIDAuthState token yenileme ve PKCE doğrulamasını yönetir. Güvenlik açısından redirect URI’nin özel URL şeması (custom scheme) veya Universal Link olduğundan emin olun.
Android (Kotlin)
Android’de AppAuth-Android kütüphanesi yaygın olarak kullanılır. build.gradle’e ekleyin:
implementation 'net.openid:appauth:0.11.1'
PKCE etkinleştirmek için AuthorizationRequest.Builder’ın setCodeVerifier ve setCodeVerifierChallenge metodlarını kullanabilirsiniz. Kod doğrulayıcıyı kendiniz üretmek isterseniz:
val codeVerifier = generateRandomString()
val codeChallenge = computeSha256(codeVerifier).encodeBase64UrlSafe()
val authRequest = AuthorizationRequest.Builder(
serviceConfig, clientId, ResponseTypeValues.CODE, redirectUri
)
.setScopes("openid", "profile")
.setCodeVerifier(codeVerifier, codeChallenge, "S256")
.build()
AppAuth, PKCE akışını otomatik olarak destekler, ancak setCodeVerifier ile manuel kontrol de mümkündür. Token isteği sırasında AuthorizationManagementActivity sonucunu dinleyerek token alabilirsiniz.
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
- İstemci sırrını (client secret) mobil uygulamada saklama: PKCE istemci sırrı gerektirmez; yine de bir client secret varsa asla binary’ye gömülmemelidir. Kullanıcının cihazında güvenli depolama (Keychain veya EncryptedSharedPreferences) kullanılmalıdır.
- Kod doğrulayıcıyı yeniden kullanma: Her yetkilendirme isteği için yeni, rastgele bir code_verifier üretilmelidir. Aksi halde tekrar saldırılarına açık olursunuz.
- Redirect URI güvenliği: Özel URL şeması kullanırken başka uygulamaların bu şemayı ele geçirebilme riskini azaltmak için Universal Links (iOS) veya App Links (Android) kullanın.
- Token yenileme (refresh token): Refresh token’ı güvenli bir şekilde saklayın ve sızıntı durumunda iptal mekanizması sağlayın.
Unutmayın: PKCE, client secret'i ortadan kaldırsa da, uygulamanızın güvenliği yalnızca doğru uygulamaya bağlıdır. Kriptografik işlemler için her zaman platformun güvenli rastgele sayı üreticilerini kullanın.
Alternatif Yaklaşımlar ve Entegrasyon
OAuth 2.0 + PKCE, mobil uygulamalarda güvenli kimlik doğrulamanın en yaygın yöntemidir. Bununla birlikte, bazı durumlarda OpenID Connect üzerinde ID Token da kullanılabilir. Ayrıca, API iletişiminde güvenliği artırmak için Mobil Uygulamalarda SSL Pinning yöntemini de değerlendirebilirsiniz. Backend tarafında ise OAuth 2.0 sunucusu ile REST veya gRPC kullanabilirsiniz; gRPC vs REST karşılaştırmamızdan hangisinin sizin için uygun olduğuna karar verebilirsiniz.
Sonuç: PKCE ile Güvenli Kimlik Doğrulama Artık Zorunlu
Mobil uygulamalarda OAuth 2.0 kullanırken PKCE’yi atlamak büyük bir güvenlik açığıdır. iOS ve Android platformları, AppAuth gibi kütüphanelerle bu akışı neredeyse otomatikleştirir. Geliştiricilerin yalnızca code verifier’ı güvenli üretmesi ve redirect URI’leri doğru yapılandırması yeterlidir. Servis Çalışanları ile offline yetenekler eklerken de kimlik doğrulama katmanını PKCE ile güçlendirmeyi unutmayın.
PKCE, mobil güvenlik için bir tercih değil, standart haline gelmiştir. Uygulamanızda henüz uygulamadıysanız, bu rehberdeki adımları izleyerek entegrasyonu tamamlayın.
Sık Sorulan Sorular
PKCE nedir ve neden mobil uygulamalarda kullanılmalıdır?
PKCE (Proof Key for Code Exchange), OAuth 2.0 Authorization Code Flow'un mobil uygulamalar için güvenli hale getirilmiş bir versiyonudur. İstemci sırrı yerine dinamik olarak oluşturulan bir kod doğrulayıcı kullanarak yetkilendirme kodunun ele geçirilmesini önler. Mobil uygulamalarda istemci sırrı güvenli bir şekilde saklanamayacağı için PKCE zorunlu hale gelmiştir.
PKCE olmadan OAuth kullanmak ne kadar riskli?
PKCE kullanılmadığında, bir saldırgan uygulamanın yetkilendirme kodunu ele geçirip token alabilir. Özellikle kötü amaçlı yazılımlar veya man-in-the-middle saldırıları ile bu kod çalınabilir. PKCE, bu tür saldırıları etkili bir şekilde engeller.
iOS ve Android'de PKCE uygulamak için hangi kütüphaneler kullanılır?
iOS'ta AppAuth (Swift veya Objective-C), Android'de AppAuth-Android en yaygın kütüphanelerdir. Her ikisi de PKCE akışını destekler ve code verifier ile code challenge oluşturma işlemlerini otomatikleştirir.
PKCE için code verifier nasıl oluşturulmalı?
Code verifier, en az 43 karakter ve en fazla 128 karakter uzunluğunda, yüksek entropili rastgele bir dize olmalıdır. Genellikle 48 baytlık rastgele veri base64url formatında kodlanır. Her yetkilendirme isteği için yeni bir code verifier üretilmelidir.
PKCE ile birlikte SSL Pinning kullanmak gerekli mi?
PKCE, yetkilendirme kodunun ele geçirilmesini önlese de, ağ trafiğinin dinlenmesini engellemez. Bu nedenle ek bir güvenlik katmanı olarak SSL/TLS ve SSL Pinning kullanılması önerilir. SSL Pinning, sunucu sertifikasını doğrulayarak man-in-the-middle saldırılarını önler.






