PKCE Nedir: Temel Kavramlardan Derinlemesine Anlamaya
Bu makale, kötü niyetli uygulamaların yetkilendirme kodlarını ele geçirmesini önleyerek OAuth 2.0 yetkilendirme kodu akışını nasıl güvenceye aldığını açıklayarak sizi temel kavramlardan kapsamlı bir anlayışa götürür.
Kod Değişim Kanıt Anahtarı (PKCE), Yetkilendirme Kodu akışına bir eklemedir. Başlangıçta mobil uygulamalarda yetkilendirme kodu akışını güvenceye almak için tasarlanmıştır ve şimdi tek sayfalı uygulamalar tarafından kullanılması önerilmektedir. OAuth 2.1 itibariyle, halka açık istemciler ve gizli (özel) istemciler dahil olmak üzere tüm istemci türleri için PKCE zorunlu hale getirilmiştir.
Bu makalede, PKCE'nin neden oluşturulduğunu ve uygulamalarınızı nasıl koruduğunu anlamanıza yardımcı olacağız, böylece PKCE hakkında derin bilgi sahibi olacaksınız.
PKCE Neden Gerekli?
OAuth 2.0 yetkilendirme kodu akışında, kullanıcılar bir uygulama aracılığıyla oturum açmayı talep eder. Kimlik doğrulama sunucusu, kullanıcıları bir kimlik doğrulama sayfasına yönlendirir. Kullanıcı kimliği doğrulandıktan sonra, sunucu uygulamaya bir yetkilendirme kodu döndürür, ardından uygulama bu kodu kullanarak kimlik doğrulama sunucusundan bir erişim jetonu talep eder.
Bu akışın önemli bir güvenlik riski vardır: yetkilendirme kodu kötü niyetli programlar tarafından ele geçirilebilir. Bu, özellikle diğer uygulamaların aynı yeniden yönlendirme URI'si kaydedebileceği ve yetkilendirme kodunu ele geçirebileceği mobil cihazlarda endişe vericidir.
Ele geçirme işlemi aşağıdaki diyagramda gösterilmiştir:
Adım (1): Uygulama, ele geçirilemeyen güvenli bir API aracılığıyla bir yetkilendirme talebi gerçekleştirir. Bu adımda, talep sahibi de bir yeniden yönlendirme URI'si sağlar.
Adım (2): Talep daha sonra OAuth 2.0 yetkilendirme sunucusuna iletilir. OAuth, TLS kullanımı gerektirdiğinden, bu iletişim TLS ile korunur ve ele geçirilemez.
Adım (3): Yetkilendirme sunucusu, yetkilendirme kodunu döndürür.
Adım (4.a): Yetkilendirme kodu, adım (1)'de sağlanan yeniden yönlendirme URI'si aracılığıyla talep sahibine döndürülür. Bu adımda, kötü niyetli bir uygulama kendisini yeniden yönlendirme URI'si için bir işleyici olarak kaydettiyse, kötü niyetli uygulama yetkilendirme kodunu ele geçirebilir. Yetkilendirme koduna sahip olan saldırgan, sırasıyla adım (5.a) ve (6.a) ile bir erişim jetonu talep edebilir ve elde edebilir.
Yukarıda gösterildiği gibi, eğer OAuth 2.0 yetkilendirme kodu akışında yetkilendirme kodu ele geçirilirse, saldırganlar bunu erişim jetonları elde etmek için kullanabilir. Bu nedenle, yetkilendirme kodu ele geçirilmesini önlemek için bir mekanizmaya ihtiyaç duyarız, bu da PKCE'nin oluşturulmasına yol açar.
PKCE Nasıl Çalışır?
Yukarıda da belirtildiği gibi, saldırıya uğramaktan kaçınmak istiyorsak, talebi başlatan uygulamanın yalnızca erişim jetonunu talep edebileceğinden emin olmamız gerekir. İşte PKCE burada devreye girer.
PKCE, "kanıt anahtarı" kavramını tanıtarak bu sorunu çözer.
Yetkilendirme kodu talep edilirken, uygulama önce rastgele bir kod doğrulayıcı oluşturur ve yerel olarak saklar. Daha sonra bu kod doğrulayıcıyı belirli algoritmaları kullanarak bir kod meydan okumasına dönüştürür. Uygulama, yetkilendirme kodu talebi sırasında hem kod meydan okumasını hem de kod meydan okuma yöntemini kimlik doğrulama sunucusuna gönderir.
Kod doğrulayıcı rastgele oluşturulmuş bir dizedir ve kod meydan okuması, dönüştürme yoluyla kod doğrulayıcıdan türetilir. İki dönüştürme yöntemi desteklenir:
plain
:Kod doğrulayıcıyı doğrudan kod meydan okuması olarak kullanır
S256
:Kod doğrulayıcıya SHA-256 karma uygulayıp ardından Base64URL kodlaması uygular. Karma çıktısı tersine çevrilerek kod doğrulayıcı elde edilemeyeceği veplain
yöntemi iletim sırasında ortadaki adam saldırılarına karşı savunmasız olabileceği için güvenlik nedenleriyleS256
kullanılması kesinlikle önerilir.
Kullanıcı kimliği doğrulandıktan sonra, kimlik doğrulama sunucusu uygulamaya yetkilendirme kodunu döndürür. Bir erişim jetonu talep ederken, uygulama hem yetkilendirme kodunu hem de kod doğrulayıcıyı kimlik doğrulama sunucusuna gönderir. Sunucu, "kod doğrulayıcı"yı önceden alınan "kod meydan okuma yöntemi" kullanarak dönüştürür ve sonucun, önceden alınan "kod meydan okuması" ile karşılaştırılmasına göre müşterinin "kod doğrulayıcısını" sahip olunup olunmadığını doğrular.
Adım (1-3): Uygulama, "kod doğrulayıcı" adında bir gizli anahtar oluşturur ve kaydeder ve dönüştürülmüş bir versiyon olan "kod meydan okuması" türetir, bu dönüştürme yöntemiyle birlikte OAuth 2.0 Yetkilendirme Talebinde gönderilir.
Adım (3-6): Kimlik Doğrulama Sunucusu normal şekilde yanıt verir ancak "kod meydan okuması" ve "kod meydan okuma yöntemini" kaydeder.
Adım (7.a): Ardından uygulama, adım (1) 'de oluşturulan "kod doğrulayıcı" gizli anahtarı da dahil ederek token uç noktasına yetkilendirme kodunu normal şekilde gönderir.
Adım (8.a-9.a): Yetkilendirme sunucusu, "kod doğrulayıcıyı" "kod meydan okumasına" dönüştürür ve bunu adım (1-3)'ten "kod meydan okumasıyla" karşılaştırır. Eşleşmezlerse erişim reddedilir.
Bu durumda, kötü niyetli uygulama yetkilendirme kodunu adım (6.b) 'de ele geçirmiş olsa bile erişim jetonunu kullanarak ele geçiremez, çünkü "kod_doğrulayıcı" gizli anahtara sahip değildir ve "kod doğrulayıcı" TLS üzerinden gönderildiğinden ele geçirilemez.
Özet
Bu makalede, PKCE'nin nasıl çalıştığını ve yetkilendirme kodu akışını korumak için neden gerekli olduğunu açıkladık. PKCE, bir kanıt anahtarı mekanizması ekleyerek, kötü niyetli uygulamaların yetkilendirme kodlarını ele geçirip yanlış kullanmasını önler. Umarız bu açıklama, PKCE'yi derinlemesine anlamanızı sağlar.