HTTP doğrulama metodları nelerdir — 1?

Bu flood’da HTTP Authentication (HTTP Doğrulama) metodlarından Basic ve Digest Authentication'ı anlatacağım.

HTTP protokolü, web sayfalarına veya API'lara erişimin sınırlandırılmak istendiği senaryolar için kullanıcının kimliğinin doğrulamasına yardımcı olan ve HTTP Authentication adı verilen mekanizmayı sunmaktadır.

Web sunucu, istemciden erişimi kısıtlanmış bir kaynağa istek geldiğinde Authorization: HTTP Header'ını kontrol eder. Gelen istekte Authorization: başlığı, yani istemciyi doğrulamak için gerekli bilgiler yoksa veya geçersizse istemciye cevap olarak 401 Unauthorized statü kodu ile birlikte WWW-Authenticate: başlığı ile desteklediği doğrulama tipini de gönderir. Bu noktadan sonra istemci ya kullanıcıya sorarak ya da elindeki bilgilerle doğrulama bilgisini yenileyerek sunucuya yaptığı isteği tekrarlar.

HTTP'de ilgili başlığın Authorization olarak seçilmiş olması gariptir çünkü aslında bu mekanizma ile sağlanmak istenen Authentication olarak bilinen kimlik doğrulama işlemidir. Authorization günümüzde genel olarak yetkilendirme için tercih edilmektedir.

Bilinen en eski doğrulama metodu HTTP Basic Authentication'dır. Bu doğrulama yönteminde tarayıcı sunucudan 401 Unauthorized cevabını aldığında kullanıcıya doğrulama için gerekli bilgileri hepimizin bildiği aşağıdaki ekranla sorar ve kullanıcıdan giriş bekler.

HTTP Basic Authentication'da kullanıcı adı ve parola aralarına iki nokta (username:password) konarak birleştirilir. Birleşim sonunda ortaya çıkan metin, özel karakterlerden (?!<>, vb) arındırılmak üzere base64 encoding'den geçirilir ve Authorization: başlığına konmaya hazır hale getirilir. Aşağıdaki ekran görüntüsünde Basic Authentication ile istemciden sunucuya yapılan bir istek gösterilmiştir. Yine aynı şekilde base64 ile gönderilen metin decode edilerek kullanıcı adı ve parola gösterilmiştir.

Anlaşılacağı üzere Basic Authentication'da parola sunucuya gönderildiği için bu yöntemin HTTPS olmadan kullanılması parolanın hattı dinleyenlerin eline geçmesine sebep olacaktır. Dolayısıyla HTTPS olmadan bu yöntem kesinlikle kullanılmamalıdır. Parolanın sürekli olarak karşı tarafa gönderilmesi HTTPS ile iletim güvenliği sağlanmış olsa bile riskli kabul edilmektedir. Ek olarak bu yöntemde istemci tarafından oturumum sonlandırılması tanımlanmamıştır. Dolayısıyla bu yöntem genel olarak güvenli değildir.

HTTP Digest Authentication, Basic Authentication'daki parolanın güvensiz ortamda karşı tarafa gönderilmesi problemini çözmek üzere ortaya çıkmıştır. Burada istemci parolanın kendisini göndermek yerine parolanın Digest'ını (Hash) alarak sunucuya gönderir. Parolanın kendisi ya da Hash'i sunucu tarafında da tutulduğu için sunucu isteğin kimden geldiğini doğrulayabilir. Bu yöntemin iletim katmanı şifrelenmemiş bir ortamda kullanılması durumunda kötü amaçlı kişilerin parolayı öğrenemese bile Hash'ini öğrenebileceği öngörülmüştür.

Bu noktada kötü amaçlı kişilerin Replay Attack adı verilen bu yöntemle HTTP istekleri ile birlikte ağı dinleyerek elde ettikleri Hash'i göndermelerini önlemek için nonce (number used only once) adı verilen ileride de karşımıza çıkacak olan rassal bir sayı kullanılır. Kullanıcı adı ve parolanın Hash'i alındıktan sonra çıkan sonuç nonce değeri ile birleştirilerek bir kez daha Hash'lenir ve sunucuya böyle gönderilir. Sunucu da veri tabanında tuttuğu Hash ile nonce değerini Hash'ler ve sonuçları karşılaştırır.

İstemci ve sunucu kontrolünün sağlanabildiği sistemlerde (örneğin AWS API) Digest Authentication'ın varyantları da kullanılabilir. AWS API buna güzel bir örnektir. AWS'in bu özel kullanımında Authentication'a ek olarak istek bütünlüğü de doğrulanmaktadır.

Son olarak birçok Digest Authentication metodunda Hash değeri güncel zamanı da içerir, belirli bir zaman farkını (örn: 5 dak) aşan istekler Replay olarak değerlendirilerek reddedilir. Bilgisayar saati değiştirilerek AWS API ile bu davranış kolayca test edilebilir.

İlerleyen flood’larda günümüzde daha popüler olarak kullanılan HTTP Authentication mekanizmalarını incelemeye devam edeceğiz.