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.