Posts

HTTP Dersleri – Ders 4 – İstemci Doğrulama Mekanizmaları

HTTP Dersleri – Ders 1 – Temel kavramlara genel bakış
HTTP Dersleri – Ders 2 – Mimari Yönleri
HTTP Dersleri – Ders 3 – İstemci Kimliği
HTTP Dersleri – Ders 4 – İstemci Doğrulama Mekanizmaları
HTTP Dersleri – Ders 5 – Güvenlik
HTTP Dersleri – Sözlük

Önceki bölümde, web sitelerinin ziyaret eden kullanıcıyı tanımlamak için kullanabilecek farklı yollardan bahsettik.

Fakat tanımlama sadece bir iddiayı temsil eder. Kendinizi tanımlarken, birisi olduğunuzu iddia ediyorsunuz. Fakat bunun kanıtı yok.

Kişisel id’nizi göstermek veya şifrenizi girmek gibi kimlik doğrulama ile iddia ettiğiniz kişi olduğunuza dair bir kanıt gösteriyorsunuz.

Çoğu zaman, web sitelerini hassas kaynaklarını sunmak için bu kanıta ihtiyacı vardır.

HTTP, sunucuların zorluklar çıkarmalarına ve ihtiyaç duydukları kanıtları elde etmelerine olanak tanıyan kendi kimlik doğrulama mekanizmalarına sahiptir. Ne olduklarını ve nasıl çalıştıklarını öğreneceksiniz. Ayrıca, her birinin artılarını ve eksilerini de ele alacağız ve kendi başlarına kullanılabilecek kadar iyi olup olmadığını keşfedeceğiz (spoyler: iyi değiller).

Bu makalede, aşağıdaki konular hakkında bilgi edineceksiniz:

  • HTTP kimlik doğrulaması nasıl çalışır?
  • Temel kimlik doğrulama
  • Özet kimlik doğrulaması

HTTP kimlik doğrulama mekanizmalarına derinlemesine girmeden önce, HTTP kimlik doğrulamasının ne olduğundan bahsedelim.

HTTP kimlik doğrulaması nasıl çalışır?

Kimlik doğrulama, kendinizi Web sunucusuna tanıtmanın bir yoludur. İstenen kaynaklara erişme hakkına sahip olduğunuzu gösteren bir kanıt göstermeniz gerekiyor. Genellikle, sunucu tarafından doğrulanan ve sonra kaynağa erişip erişemeyeceğinize karar veren kullanıcı adı ve parola (anahtar ve gizli) kombinasyonunu kullanarak yapılır.

HTTP, iki kimlik doğrulama protokolü sunar:

  • Temel kimlik doğrulama
  • Özet kimlik doğrulaması

Her biri hakkında daha fazla bilgi edinmeden önce, bazı temel kavramları inceleyelim.

1. HTTP, bir zorlama / yanıt kimlik doğrulama çerçevesi kullanır

Ne anlama geliyor?

Birisi bir istek gönderdiğinde, ona hemen yanıt vermek yerine, sunucu kimlik doğrulama talebi gönderir. Gizli bilgileri (kullanıcı adı ve parola) girerek kimliğini kanıtlamak için kullanıcıyı zorlar.

Bundan sonra, verilen kimlik bilgileri kullanılarak istek tekrar edilir ve doğruysa, kullanıcı beklenen yanıtı alır. Kimlik bilgilerinin yanlış olması durumunda, sunucu zorluğu tekrar gönderir veya yalnızca hata iletisini gönderir.

2. Kimlik doğrulama ile ilgili istek / yanıt başlıkları

Sunucu, WWW-Authenticate yanıt başlığını kullanarak sorunu çözer. Kimlik doğrulama protokolü ve güvenlik bölgesi ile ilgili bilgileri içerir.

İstemci kimlik bilgilerini girdikten sonra istek tekrar gönderilir. Bu sefer kimlik doğrulama algoritması ve kullanıcı adı / şifre kombinasyonu içeren Yetkilendirme başlığı ile.

Kimlik bilgileri doğruysa, sunucu isteğe bağlı bir Kimlik Doğrulama-Bilgisi yanıt başlığında yanıt ve ek bilgi verir.

3. Güvenlik alanları

Güvenlik alanları, farklı erişim kaynaklarını sunucu üzerindeki farklı kaynak gruplarıyla ilişkilendirmenin yolunu sağlar. Bunlara koruma alanları denir.

Bunun etkili olduğu, erişmek istediğiniz kaynağa bağlı olarak farklı kimlik bilgileri girmeniz gerekebilir.

Sunucu, birden çok alandan oluşabilir. Örneğin, yalnızca web sitesi yöneticilerinin erişebileceği web sitesi istatistik bilgileri ve diğer kullanıcıların resimlere erişebilecekleri ve indirebilecekleri web sitesi görüntüleri için bir tane olması gerekir.

/admin/statistics/financials.txt -> Alan = “Yönetici İstatistikleri”

/images/img1.jpg -> Alan = “Resimler”

Financials.txt dosyasına erişmeye çalıştığınızda, sunucu tarafından itiraz edileceksiniz ve yanıt aşağıdaki gibi görünecektir:

HTTP/1.0 401 Unauthorized
WWW-Authenticate: Basic realm="Admin Statistics"

Güvenlik alanlarıyla ilgili daha fazla bilgi: https://tools.ietf.org/html/rfc7235#section-2.2

Basit HTTP kimlik doğrulama örneği

Şimdi noktaları, en basit HTTP kimlik doğrulama örneğine (Temel kimlik doğrulama, aşağıda açıklanmıştır) bakarak bağlayalım:

1. User Agent -> Sunucu

Kullanıcı, sunucudaki bazı resimlere erişim isteğinde bulunur.

GET /gallery/personal/images/image1.jpg HTTP/1.1
Host: www.somedomain.com

2. Sunucu -> User Agent

Sunucu, kimlik doğrulama sorununu kullanıcıya gönderir.

HTTP/1.1 401 Access Denied
WWW-Authenticate: Basic realm="gallery"

3. User Agent -> Sunucu

Kullanıcı kendisini form girişi yoluyla tanımlar.

GET /gallery/personal/images/image1.jpg HTTP/1.1
Authorization: Basic Zm9vOmJhcg==

4. Sunucu -> User Agent

Sunucu, kimlik bilgilerini denetler ve 200 OK durum kodunu ve resim verisini gönderir.

HTTP/1.1 200 OK
Content-type: image/jpeg
...<image data>

O kadar da karışık değil, değil mi?

Şimdi aşağıya detaylı inceleme yapalım ve temel kimlik doğrulamaya bakalım.

Temel kimlik doğrulama

En yaygın ve desteklenen kimlik doğrulama protokolüdür. HTTP / 1.0’dan beri var olmuştur ve her büyük istemci onu uygular.

Yukarıdaki örnek, Temel kimlik doğrulamasını kullanarak kimlik doğrulamasının nasıl yapılacağını göstermektedir. Uygulamak ve kullanmak oldukça basit, ancak bazı güvenlik kusurları var.

Güvenlik sorunlarına başlamadan önce, Temel kimlik doğrulamasının kullanıcı adı ve şifre ile nasıl ilgilendiğini görelim.

Temel kimlik doğrulama, kullanıcı adını ve parolasını bir dizede paketler ve bunları iki nokta üst üste (:) kullanarak ayırır. Bundan sonra, bunları Base64 kodlaması kullanarak kodlar. Karmaşık gözükmesine rağmen, karıştırılmış karakter dizisi güvenli değildir ve kolayca çözülür. Base64 kodlamanın amacı şifrelemek değil, HTTP başlıklarında uluslararası karakterlere izin verilmemesi nedeniyle kullanıcı adı ve parolasını uyumlu hale getirmektir.

GET /gallery/personal/images/image1.jpg HTTP/1.1
Authorization: Basic Zm9vOmJhcg==

Bu örnekten “Zm9vOmJhcg ==”, Base64 tarafından kodlanmış “foo: bar” dizesinden başka bir şey değildir.

Bu nedenle, istekleri dinleyen herkes kolayca kimlik bilgilerini çözebilir ve kullanabilir.

Bundan daha da kötüsü, kullanıcı adı ve şifreyi kodlamak yardımcı olmayacaktır. Kötü niyetli bir üçüncü taraf, aynı etkiyi elde etmek için şifreli diziyi yine de gönderebilir.

Ayrıca, istek gövdesini değiştiren ve istek başlıklarını sağlam bırakan proxy’lere veya başka herhangi bir saldırıya karşı koruma yoktur.

Gördüğünüz gibi, Temel kimlik doğrulama mükemmel bir yöntem değildir.

Yine de buna rağmen, korunan kaynaklara kazayla erişilmesini önlemek ve bir miktar kişiselleştirme teklif etmek için kullanılabilir.

Daha güvenli ve kullanışlı hale getirmek için, temel kimlik doğrulama, serinin 5. bölümünde bahsettiğimiz SSL üzerinden HTTPS kullanılarak gerçekleştirilebilir.

Bazıları, sisteminizin güvenliği, transfer mekanizmanızın güvenliği kadardır der.

Digest kimlik doğrulaması

Digest kimlik doğrulaması, basit ama güvensiz Temel kimlik doğrulamaya daha güvenli ve güvenilir bir alternatif olarak yapıldı.

Peki, nasıl işliyor?

Digest kimlik doğrulama, şifre bilgilerini gizlemek ve farklı türlerde kötü amaçlı saldırıları önlemek için nonces kullanımı ile birlikte MD5 şifreleme karma yöntemini kullanır.

Bu biraz karışık gelebilir, ancak basit bir örnekte nasıl çalıştığını gördüğünüzde daha net görülecektir.

1. User Agent -> Server

GET /dir/index.html HTTP/1.0
Host: localhost

İstemci, kimliği doğrulanmamış bir istek gönderir.

2. Server -> User Agent

HTTP/1.0 401 Unauthorized
WWW-Authenticate: Digest realm="shire@middleearth.com",
                        qop="auth,auth-int",
                        nonce="cmFuZG9tbHlnZW5lcmF0ZWRub25jZQ",
                        opaque="c29tZXJhbmRvbW9wYXF1ZXN0cmluZw"
Content-Type: text/html
Content-Length: 153
 
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Error</title>
  </head>
  <body>
    <h1>401 Unauthorized.</h1>
  </body>
</html>

Sunucu, Digest kimlik doğrulamasını kullanarak istemciyi kimlik doğrulaması yapmaya zorlar ve gerekli bilgileri istemciye gönderir.

3. User Agent -> Server

GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Gandalf",
                     realm="shire@middleearth.com",
                     nonce="cmFuZG9tbHlnZW5lcmF0ZWRub25jZQ",
                     uri="/dir/index.html",
                     qop=auth,
                     nc=00000001,
                     cnonce="0a4f113b",
                     response="5a1c3bb349cf6986abf985257d968d86",
                     opaque="c29tZXJhbmRvbW9wYXF1ZXN0cmluZw"

İstemci, yanıt değerini hesaplar ve kullanıcı adı, bölge, URI, nonce, opque, qop, nc ve cnonce ile birlikte gönderir. Bir sürü şey.

Bunları tanımlayalım:

  • nonce ve opaque – istemci tarafından alındığı şekilde döndürülmesi gereken sunucu tarafından tanımlanan dizeler
  • qop (koruma kalitesi) – önceden tanımlanmış değerlerden bir veya daha fazlası (“auth” | “auth-int” | belirteci). Bu değerler özet hesaplamasını etkiler.
  • cnonce – client nonce, qop ayarlanmışsa üretilmelidir. Seçilen düz metin saldırılarından kaçınmak ve ileti bütünlüğünü koruma sağlamak için kullanılır.
  • nc – Qcp ayarlanırsa, nonce sayısı gönderilmelidir. Bu yönergenin amacı, sunucunun, bu sayının kendi kopyasını koruyarak istek tekrarlarını algılamasını sağlamaktır – aynı nc değeri iki kez görüldüyse, istek yeniden yürütülür.

Yanıt özniteliği aşağıdaki şekilde hesaplanır:

HA1 = MD5("Gandalf:shire@middleearth.com:Lord Of The Rings")
       = 681028410e804a5b60f69e894701d4b4
 
HA2 = MD5("GET:/dir/index.html")
       = 39aff3a2bab6126f332b942af96d3366
 
Response = MD5( "681028410e804a5b60f69e894701d4b4:
                 cmFuZG9tbHlnZW5lcmF0ZWRub25jZQ:
                 00000001:0a4f113b:auth:
                 39aff3a2bab6126f332b942af96d3366" )
         = 5a1c3bb349cf6986abf985257d968d86

Qop’a bağlı olarak cevabı nasıl hesaplayacağınızı merak ediyorsanız, RFC 2617‘de bulabilirsiniz.

4. Server -> User Agent

HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 2345
... <content data>

Sunucu, karmayı tek başına hesaplar ve ikisini karşılaştırır. Eşleşirlerse, istenen verilerle istemciye hizmet eder.

Gördüğünüz gibi, Digest kimlik doğrulamasının anlaşılması ve uygulanması daha karmaşıktır.

Ayrıca, Temel kimlik doğrulamadan daha güvenlidir; ancak, man-in-the-middle saldırısına karşı halen savunmasızdır. RFC 2617, bazı zayıf yönlerini giderdiği için Temel kimlik doğrulama yerine Digest kimlik doğrulamasının kullanılmasını önerir. Ayrıca, Digest kimlik doğrulamasının modern şifreleme standartlarına göre halen zayıf olduğunu ve gücünün büyük oranda uygulanmasına bağlı olduğunu gizlemez.

Yani Digest kimlik doğrulamasının özeti:

  • Ağ üzerinden düz metin parolalar göndermez
  • Tekrar çalma saldırılarını önler
  • Mesaj müdahalesine karşı korucular

Bazı zayıf yönler:

  • Man-in-the-middle saldırı için güvenlik açığı
  • Güvenlik seçeneklerinin birçoğu gerekli değildir ve böylece ayarlanmazsa Digest kimlik doğrulama işlevi daha az güvenli bir şekilde yapılır
  • Şifreleri saklarken güçlü şifre karma algoritmalarının kullanılmasını engeller

Bu gerçekler nedeniyle, Digest kimlik doğrulama hala büyük bir itici güç kazanamadı. Temel kimlik doğrulaması çok basit ve Digest kimlik doğrulamasından daha güvenli SSL ile birleştirildi.

Sonuç

Bu sonuç, HTTP serisinin bu kısmı içindir.

HTTP’nin varsayılan olarak sunduğu farklı kimlik doğrulama mekanizmalarına geçtik ve avantajları ve dezavantajları hakkında konuştuk.

Bu kavramlar sizin için artık ekrandaki harflerden ibaret değildir umarım, bir sonraki seferinde ne olduklarını ve ne zaman uygulayacaklarını bilirsiniz.

Bu mekanizmalarla çözülmeyen güvenlik risklerinin bulunduğunun farkındasınız ve bu yüzden HTTPS ve SSL / TLS gibi kavramlar var. Güvenlik riskleri ve bunları serimizin bir sonraki bölümünde nasıl çözeceğimiz hakkında daha fazla konuşuruz.

Bu bölümdeki kavramlardan bazılarını belirsiz buluyorsanız, HTTP serisinin 1. bölümü 2. bölümüne ve 3. bölümüne bakın.

Sonraki Ders: HTTP Dersleri – Ders 5 – Güvenlik

Referanslar;

Orijinal Yazı: https://www.code-maze.com/http-series-part-4/

HTTP Dersleri – Ders 2 – Mimari Yönleri

HTTP Dersleri – Ders 1 – Temel kavramlara genel bakış
HTTP Dersleri – Ders 2 – Mimari Yönleri
HTTP Dersleri – Ders 3 – İstemci Kimliği
HTTP Dersleri – Ders 4 – İstemci Doğrulama Mekanizmaları
HTTP Dersleri – Ders 5 – Güvenlik
HTTP Dersleri – Sözlük

Serinin ilk yazısında, HTTP’nin temel kavramlarından bahsettik. Artık üzerine inşa etmek için bir temelimiz var, HTTP’nin mimari yönlerinden bazıları hakkında konuşabiliriz. HTTP’ye sadece veri göndermek ve almaktan daha fazla şey var.

HTTP kendiliğinden bir uygulama protokolü olarak işlev göremez. Farklı servisler sağlayan ve World Wide Web üzerinden iletişimin mümkün ve verimli olmasını sağlayan bir donanım ve yazılım çözümü biçiminde altyapıya ihtiyaç duyuyor.

Bu makalede, aşağıdakiler hakkında bilgi edineceksiniz:

  • Web Sunucuları
  • Proxy Sunucuları
  • Caching
  • Ağ geçitleri, Tüneller ve Relaysler
  • Web Tarayıcılar

Bunlar İnternet hayatımızın ayrılmaz bir parçasıdır ve bunların her birinin amacı nedir ve nasıl çalıştığını tam olarak öğreneceksiniz. Bu bilgi, ilk makaledeki noktaları birbirine bağlamanıza ve HTTP iletişim akışını daha da iyi anlamanıza yardımcı olacaktır.

Haydi başlayalım.

Web Sunucuları

İlk makalede açıklandığı gibi, bir Web sunucusunun temel işlevi, kaynakları depolamak ve istekleri alır almaz bunları sunmaktır. Web sunucusuna bir Web istemcisi (başka bir deyişle Web tarayıcısı) kullanarak erişirsiniz ve bunun karşılığında istenen kaynağı alır veya varolanların durumunu değiştirirsiniz. Web sunucularına, Web tarayıcılarını kullanarak otomatik olarak da erişilebilir; bu konuda daha sonra bahsedeceğiz.

En popüler Web sunucularından bazıları ve muhtemelen duyduğunuz olanlar Apache HTTP Sunucusu, Nginx, IIS, Glassfish’tir …

Web sunucuları çok basit ve kullanımı kolay olandan sofistike ve karmaşık yazılım parçaları arasında değişenlik gösterebilir. Modern Web sunucuları, çok farklı görevleri yerine getirebilirler. Web sunucusunun yapabileceği temel görevler:

  • Bağlantı kurma – müşteri bağlantısını kabul etme veya kapatma
  • Alma isteği – bir HTTP istek mesajını okuma
  • İşlem isteği – istek mesajını yorumlayın ve harekete geçin
  • Erişim kaynağı – mesajda belirtilen kaynağa erişin
  • Yanıt oluştur – HTTP yanıt mesajını yarat
  • Yanıt gönder – cevabı istemciye geri gönderin.
  • İşlemi kaydet – tamamlanan işlemi hakkında bir günlük dosyasına yaz

Web sunucusunun temel akışını birkaç farklı aşamada anlatacağım. Bu aşamalar, Web sunucusu akışının çok basitleştirilmiş bir sürümünü temsil eder.

Aşama 1: Bağlantı kurma

Web istemcisi Web sunucusuna erişmek istediğinde, yeni bir TCP bağlantısı açmaya çalışır. Diğer taraftan, sunucu istemcinin IP adresini bulur. Bundan sonra, bu istemciye TCP bağlantısını açmaya veya kapatmaya karar vermek sunucuya kalmış.

Sunucu bağlantıyı kabul ederse, onu mevcut bağlantıların listesine ekler ve o bağlantıdaki verileri izler.

İstemci yetkili değilse veya kara listeye alınmışsa (kötü niyetli) bağlantıyı da kapatabilir.

Sunucu ayrıca “ters DNS” kullanarak istemcinin ana bilgisayar adını belirlemeyi deneyebilir. Bu bilgiler, iletileri günlüğe kaydederken yardımcı olabilir ancak ana makine ad aramaları biraz zaman alabilir ve işlemleri yavaşlatabilir.

Aşama 2: İsteklerin Alınması / İşlenmesi

Gelen istekleri ayrıştırırken, Web sunucuları, bilgi isteği satırından, üstbilgilerinden ve gövdesinden (varsa) bilgi ayrıştırır. Dikkat edilmesi gereken bir husus, bağlantıyı istediğiniz zaman duraklatabilmesidir ve bu durumda, sunucunun verileri geri kalan kısmı alana kadar geçici olarak depolaması gerekir.

Üst düzey Web sunucuları, birçok eş zamanlı bağlantı açabilmelidir. Bu, aynı istemciden gelen birden çok eşzamanlı bağlantıyı içerir. Tipik bir web sayfası sunucudan birçok farklı kaynak isteyebilir.

Aşama 3: Kaynağa erişme

Web sunucuları öncelikli olarak kaynak sağlayıcıları olduklarından, kaynakları eşlemek ve erişmek için birden çok yolları vardır.

En basit yolu, kaynağı eşlemek için Web sunucusunun dosya sistemindeki dosyayı bulmak için istek URI’sini kullanmaktır. Genellikle, kaynaklar docroot adı verilen sunucu üzerindeki özel bir klasöre yerleştirilir. Örneğin, Windows sunucusundaki docroot, F:\WebResources\ üzerinde bulunabilir. Bir GET isteği, /images/codemazeblog.txt dosyasındaki dosyaya erişmek istiyorsa, sunucu bunu F:\WebResources\images\codemazeblog.txt dosyasına çevirir ve bu dosyayı yanıt mesajında ​​döndürür. Web sunucusunda birden fazla web sitesi barındırıldığında, her biri ayrı bir docroot’a sahip olabilir.

Bir Web sunucusu, bir dosya yerine bir dizin için bir istek alırsa, birkaç yolu ile çözebilir. Bir hata mesajı döndürebilir, dizin yerine varsayılan dizin dosyasını döndürür veya dizini tarar ve içeriği HTML dosyasına döndürebilir.

Sunucu ayrıca, istek URI’sini dinamik kaynağa – dinamik sonuç üreten bir yazılım uygulaması – eşleştirir. Web sunucularını karmaşık yazılım çözümlerine bağlamak ve dinamik içeriği sunmak için kullanılan uygulama sunucuları denilen bir sunucu sınıfı vardır.

Aşama 4: Yanıt üretme ve gönderme

Sunucu, sunması gereken kaynağını belirledikten sonra yanıt mesajını oluşturur. Yanıt mesajında durum kodu, yanıt başlıkları ve gerekirse yanıt gövdesi bulunur.

Yanıt içinde gövde varsa, mesaj genellikle gövdenin boyutunu açıklayan Content-Length üstbilgisini ve döndürülen kaynağın MIME türünü açıklayan Content-Type üstbilgisini içerir.

Yanıt üretildikten sonra, sunucu yanıt göndermek için ihtiyaç duyduğu istemciyi seçer. Sürekli olmayan bağlantılar için, sunucunun tüm yanıt mesajı gönderildiğinde bağlantıyı kapatması gerekir.

Aşama 4: Günlüğe kaydetme

İşlem tamamlandığında, sunucu tüm işlem bilgilerini dosyaya kaydeder. Birçok sunucu, özelleştirilmiş günlükleme sağlar.

Proxy Sunucuları

Proxy sunucuları (proxies) aracı sunuculardır. Genellikle Web sunucusu ile Web istemcisi arasında bulunurlar. Proxy sunucularının nitelikleri gereği hem Web istemcisi hem de Web sunucusu gibi davranmaları gerekir.

Ama neden Proxy sunucularına ihtiyacımız var? Neden sadece Web istemcileri ve Web sunucuları arasında doğrudan iletişim kurmuyoruz? Bu çok daha basit ve daha hızlı değil mi?

Basit olabilir, ama daha hızlı? Daha hızlı değil gerçekten. Ama buna geleceğiz.

Proxy sunucuların hangi vekil için kullanıldığını açıklamadan önce, birşeyden bahsetmem lazım. Anlatacağım şey ters proxy kavramı veya ileri proxy ile ters proxy arasındaki farktır.

Yönlendirmeli proxy, bir Web sunucusundan kaynak isteyen istemci için bir vekil görevi görür. İstemciyi güvenlik duvarından filtreleyerek veya istemciyle ilgili bilgileri gizleyerek korur. Ters proxy tam tersi şekilde çalışır. Genellikle güvenlik duvarının arkasına yerleştirilir ve Web sunucularını korur. Tüm istemcilerin bildiği gibi, gerçek Web sunucusuyla konuşurlar ve ters proxy’nin arkasındaki ağdan habersiz kalırlar.

Proxy Sunucu

Proxy Sunucu

Ters Proxy Sunucu

Ters Proxy Sunucu

Proksiler çok faydalıdır ve uygulamaları oldukça geniştir. Şimdi, proxy sunucuların bazı yollarını inceleyelim.

  • Sıkıştırma – İçeriğin sıkıştırılması iletişim hızını doğrudan arttırır. Bu kadar basit.
  • İzleme ve filtreleme – İlkokuldaki çocuklara yetişkinlere yönelik web sitelerine erişimi reddetmek ister misiniz? Proxy sizin için doğru çözüm.
  • Güvenlik – Proksiler, tüm ağa tek bir giriş noktası olarak hizmet edebilir. Kötü amaçlı uygulamaları tespit edebilir ve uygulama düzeyindeki protokolleri kısıtlayabilirler.
  • Anonimlik – Daha geniş bir anonimlik elde etmek için istekler proxy tarafından değiştirilebilir. Hassas bilgileri isteğinden çıkarabilir ve sadece önemli şeyleri bırakabilir. Sunucuya daha az bilgi gönderirken kullanıcı deneyimi de düşebilir, ancak bazen anonimlik daha önemli faktördür.
  • Erişim kontrolü – Oldukça basit, birçok sunucunun erişim denetimini tek bir proxy sunucu üzerinde merkezileştirebilirsiniz.
  • Önbelleğe alma – Popüler içeriği önbelleğe almak için proxy sunucusunu kullanabilirsiniz ve böylece yükleme hızlarını önemli ölçüde düşürebilirsiniz.
  • Yük dengeleme – “Pik trafiği” çok alan bir hizmetiniz varsa, iş yükünü daha fazla hesaplama kaynağına veya Web sunucularına dağıtmak için bir proxy kullanabilirsiniz. Zirve gerçekleştiğinde tek sunucunun aşırı yüklenmesini önlemek için yük dengeleyicileri trafiği yönlendirir.
  • Transcoding – İleti gövdesinin içeriğini değiştirme, proxy’nin sorumluluğu da olabilir

Görebildiğiniz gibi, vekiller çok yönlü ve esnek olabilir.

Caching

Web önbellekleri, istenen verilerin kopyalarını otomatik olarak üreten ve bunları yerel olarak saklayan aygıtlardır.

Bunu yaparak şunları yapabilirsiniz:

  • Trafiği azaltır
  • Ağ darboğazlarını ortadan kaldırır
  • Sunucu aşırı yüklenmesini önler
  • Uzun mesafelerde tepki gecikmesini azaltır

Dolayısıyla, Web ön belleklerinin hem kullanıcı deneyimini hem de Web sunucusu performansını iyileştirdiğini söyleyebilirsiniz. Ve elbette, potansiyel olarak daha çok para kazanabilirsiniz.

Önbellekten sunulan isteklerin bir kısmına Hız Oranı denir. 0’dan 1’e değişebilir, burada 0,% 0’dır ve 1,% 100 istekte bulunur. İdeal amaç elbette% 100 elde etmektir, ancak gerçek sayı genellikle% 40’a yakındır.

İşte temel Web önbellek iş akışının görünüşü:

İşte temel Web önbellek iş akışının görünüşü

Ağ geçitleri, Tüneller ve Relay

Zamanla, HTTP olgunlaştıkça insanlar onu kullanmanın birçok farklı yolunu buldular. HTTP, farklı uygulamalar ve protokolleri bağlamak için bir çerçeve olarak kullanışlı hale geldi.

Nasıl olduğunu görelim.

Ağ geçitleri

Ağ geçitleri, HTTP’nin bir kaynak almanın bir yolunu özetleyerek farklı protokoller ve uygulamalarla iletişim kurmasını sağlayabilecek donanım parçaları anlamına gelir. Bunlara protokol dönüştürücüleri denir ve çoklu protokollerin kullanılması nedeniyle yönlendiricilerden veya anahtarlardan çok daha karmaşıktır.

Örneğin, bir HTTP isteği göndererek dosyayı FTP üzerinden almak için bir ağ geçidi kullanabilirsiniz. Veya SSL üzerinden şifreli bir mesaj alabilir ve HTTP (Client-Side Security Accelerator Ağ Geçitleri) haline getirebilir veya HTTP’yi daha güvenli HTTP mesajlarına (Sunucu Taraflı Güvenlik Ağ Geçitleri) dönüştürebilirsiniz.

Tüneller

Tüneller CONNECT istek yöntemini kullanır. Tüneller, HTTP üzerinden HTTP olmayan verileri göndermeyi mümkün kılar. CONNECT yöntemi, tünelin hedef sunucuya bir bağlantı açmasını ve verileri istemci ile sunucu arasında geçirmeyi ister.

CONNECT istek örneği;

CONNECT api.github.com:443 HTTP/1.0
User-Agent: Chrome/58.0.3029.110
Accept: text/html,application/xhtml+xml,application/xml

CONNECT yanıtı;

HTTP/1.0 200 Connection Established
Proxy-agent: Netscape-Proxy/1.1

CONNECT yanıtının normal bir HTTP yanıtının aksine Content-Type’ı belirtmesi gerekmez.

Bağlantı kurulduktan sonra, veriler doğrudan istemci ve sunucu arasında gönderilebilir.

Relay

Relay’ler, HTTP dünyasının kanunlarına aykırıdır ve HTTP yasalarına uymak zorunda değildirler. Bunlar, istek mesajlarındaki asgari bilgileri kullanarak bir bağlantı kurabildikleri sürece almış oldukları bilgiyi ileten vekillerin dumb-down versiyonlarıdır.

Tek amacı, olabildiğince az sorunla bir vekil uygulama ihtiyacını karşılamaktır. Bu aynı zamanda potansiyel olarak belaya da yol açabilir, ancak kullanımı çok kullanışlıdır ve Relay’ler kullanılırken dikkate alması gereken bir yarar oranı kesinlikle vardır.

Örümcekler (Web Crawler)

Arama Motorları - Web Crawler)

Yaygın olarak örümcek diye adlandırılan, World Wide Web üzerinde gezinen ve içeriğini dizine alan botlardır. Örümcekler, Arama motorlarının ve diğer birçok web sitesinin temel aracıdır.

Örümcekler tamamen otomatikleştirilmiş bir yazılım parçasıdır ve çalışması için insan etkileşimine gereksinim duymaz. Örümceklerin karmaşıklığı çok çeşitlilik gösterebilir ve bazı örümcekler oldukça karmaşık yazılım parçalarıdır (arama motorlarının yaptığı gibi).

Örümcekler, ziyaret ettikleri web sitesinin kaynaklarını tüketir. Bu nedenle, genel web siteleri, tarayıcılara web sitesinin hangi bölümlerini tarayacaklarını veya hiçbir şey taramayacaklarını söyleyecek bir mekanizmaya sahiptir. Bu, robots.txt (robot hariç tutma standardı) kullanılarak yapılabilir.

Tabii ki, bu sadece bir standart olduğundan, robots.txt, davetsiz örümceklerin web sitesini taramasını engelleyemez. Kötü niyetli robotlardan bazıları e-posta biçerdöverleri, spambotlar ve zararlı yazılımları içerir.

Robots.txt dosyalarının birkaç örneği:

User-agent: *
Disallow: /

Bu, tüm örümceklere dışarıda kalmalarını söyler.

User-agent: *
Disallow: /somefolder/
Disallow: /notinterestingstuff/
Disallow: /directory/file.html

Bu sadece belirli dizinlere ve tek bir dosyaya atıfta bulunur.

User-agent: Googlebot
Disallow: /private/

Bu durumda olduğu gibi belirli bir örümceği (Google Botu) engelleyebilirsiniz.

World Wide Web’in geniş doğası göz önüne alındığında, şimdiye kadarki en güçlü örümcekler bile tamamını tarayıp endeksleyemez. Bu nedenle, seçim politikasını, en alakalı bölümlerini taramak için kullanıyorlar. Ayrıca, WWW sık sık ve dinamik olarak değişir, bu nedenle örümceklerin web sitelerini tekrar ziyaret etip gerekmediğini hesaplamak için tazelik politikasını kullanmaları gerekir. Örümcekler, sunucuları çok fazla hızlı talep ederek kolayca zorlayabilirler, bu nedenle de bir nazik politika uygulanır. Bilinen örümceklerin çoğu, sunucudaki yükü üretmekten kaçınmak için sunucuları yoklamak için 20 saniyelik aralıklarla 3-4 dakikalık aralıklarla çalışırlar.

Gizemli ve kötü derin web veya karanlık web haberini duymuş olabilirsiniz. Web’in bir parçası değildirler, bilgiyi gizlemek için kasıtlı olarak arama motorları tarafından dizine eklenmiyorlar.

Sonuç

Şimdi, HTTP’nin nasıl çalıştığına dair daha iyi bir resme sahip olmalısınız ve isteklere, yanıtlara ve durum kodlarına göre çok daha fazlasını bulacaksınız. HTTP’nin, bir uygulama protokolü olarak potansiyelini elde etmek için kullandığı farklı donanım ve yazılım parçaları içeren bir bütün altyapı vardır.

Bu makalede bahsettiğim her kavram, tüm makaleyi veya bir kitabı bile kapsayacak kadar büyük. Hedefim, sizi nasıl kabaca birbirinden farklı fikirlerle buluşturmaktı, böylece hepsinin nasıl bir araya geldiğini ve ihtiyaç duyulduğunda neye bakacağını biliyorsunuz.

Açıklamaların bazılarını biraz kısa ve belirsiz bulduysanız ve önceki makalelerimi kaçırdıysanız, serinin 1. bölümünü ve HTTP’nin temel kavramları hakkında konuştuğum HTTP referansını ziyaret ettiğinizden emin olun.

Okuduğunuz için teşekkürler ve sunucuların istemcileri tanımlamak için kullanabileceği farklı yolları açıkladığım dizinin 3. bölümüne bakmaya devam edin.

Bu makaleyi kullanışlı buluyorsanız  lütfen bir açıklama bırakın.

Bir sonraki ders: HTTP Dersleri – Ders 3 – İstemci Kimliği

Referanslar;

Orijinal Yazı: https://www.code-maze.com/http-series-part-2/

HTTP Dersleri – Ders 1 – Temel kavramlara genel bakış

HTTP Dersleri – Ders 1 – Temel kavramlara genel bakış
HTTP Dersleri – Ders 2 – Mimari Yönleri
HTTP Dersleri – Ders 3 – İstemci Kimliği
HTTP Dersleri – Ders 4 – İstemci Doğrulama Mekanizmaları
HTTP Dersleri – Ders 5 – Güvenlik
HTTP Dersleri – Sözlük

Bu yazıda size HTTP temellerini sunacağım.

Ama neden HTTP?

Kendinize sorabileceğiniz HTTP hakkında neden okumalıyım?

Bir yazılım geliştiricisi iseniz, nasıl iletişim kurduğunu öğrenerek, daha iyi uygulamaları nasıl yazacağınızı anlayacaksınız. Sistem mimarı veya ağ yöneticisiyseniz, karmaşık ağ mimarileri tasarlama konusunda daha derin bilgi sahibi olursunuz.

Günümüzde çok önemli mimari tarz olan REST, tamamen HTTP özelliklerini kullanmaya dayanıyor; bu nedenle HTTP’yi anlamayı daha da önemli hale getiriyor. Harika RESTFULL uygulamalar yapmak istiyorsanız öncelikle HTTP’yi anlamalısınız.

Yani, World Wide Web ve ağ iletişiminin ardındaki temel kavramları anlama ve öğrenme şansını tepmek mi istiyorsun?

Umarım istemiyorsundur ?

Makalenin odak noktası, HTTP’nin en önemli bölümlerini mümkün olan en basit şekilde açıklamak üzerine olacak. Buradaki düşünce, HTTP ile ilgili tüm yararlı bilgileri tek bir yerde organize etmektir; böylece, ihtiyaç duyduğunuz bilgileri bulmak için kitaplara ve RFC’lere gitme zamanınızı kurtarabilirsiniz.

Bu makalede neler öğreneceksiniz?

  • HTTP tam olarak nedir
  • Kaynaklar
  • Web İstemcisi ve Web Sunucusu arasındaki bilgiler nasıl aktarılır
  • Mesajlar ve bazı mesaj örnekleri
  • MIME türleri
  • Talep Yöntemleri
  • Başlıkları
  • Durum kodları

Daha fazla ado olmadan, içeriye girelim.

HTTP tanımı

HTTP’nin kurucusu Tim Berners-Lee (aynı zamanda World Wide Web’in mucidi olduğu düşünülen adam). HTTP’nin geliştirilmesi için önemli olan diğer isimler arasında da REST mimari stilinin yaratıcısı Roy Fielding var.

Köprü Metni Aktarım Protokolü (Hyper-Text Transfer Protocol), uygulamaların birbirleriyle iletişim kurmak için kullandığı protokoldür. Özünde, HTTP, tüm internetteki medya dosyalarını istemciler ve sunucular arasında iletmekle görevlidir. HTML, görüntüler, metin dosyaları, filmler ve bunlar arasındaki her şeyi içerir ve bunu hızlı, güvenilir bir şekilde yapar.

HTTP, uygulama katmanındaki iletişim için kullanıldığından, uygulama protokolüdür, aktarım protokolü değildir. Burada belleğinizi tazelemek için netmork katmanlarına bakalım;

Kaynaklar

İnternetteki her şey bir kaynaktır ve HTTP kaynaklar ile çalışır. Bu dosyalar, akışlar, hizmetler ve her şeyi içerir. HTML sayfası bir kaynaktır, youtube videonuz bir kaynaktır, günlük sayfanızdaki bir web uygulamasındaki e-tablonuzu bir kaynaktır… olayı anladınız.

Fakat bir kaynaktan diğerini nasıl ayırt edersiniz?

Onlara bir URL vererek (Uniform resource locators).

URL, tarayıcınızın kaynağı bulabileceği benzersiz yere işaret eder.

Web İstemcisi ve Web Sunucusu arasındaki iletiler nasıl değişir

Her içerik parçası, her kaynak Web sunucusunda (HTTP sunucusu) bulunur. Bu sunucular, bu kaynakları sağlamak için bir HTTP isteği beklemektedir.

Ancak nasıl Web sunucusundan bir kaynak isteğinde bulunuyorsunuz?

Elbette bir HTTP istemcisine ihtiyacınız var ?

Bu makaleyi okumak için şu anda bir HTTP istemcisi kullanıyorsunuz. Web tarayıcıları HTTP istemcileridir. Kaynakları bilgisayarınıza almak için HTTP sunucularıyla iletişim kurarlar. En popüler istemcilerden bazıları Google Chrome, Mozilla Firefox, Opera, Apple’ın Safari ve ne yazık ki hala rezil Internet Explorer.

Mesajlar ve bazı mesaj örnekleri

Peki, HTTP mesajı nasıl görünüyor?

Çok fazla konuşmadan, HTTP mesajlarına bazı örnekler verelim:

GET İsteği

GET /repos/CodeMazeBlog/ConsumeRestfulApisExamples HTTP/1.1
Host: api.github.com
Content-Type: application/json
Authorization: Basic dGhhbmtzIEhhcmFsZCBSb21iYXV0LCBtdWNoIGFwcHJlY2lhdGVk
Cache-Control: no-cache

Post İsteği

POST /repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks?access_token=5643f4128a9cf974517346b2158d04c8aa7ad45f HTTP/1.1
Host: api.github.com
Content-Type: application/json
Cache-Control: no-cache
 
{
  "url": "http://www.example.com/example",
  "events": [
    "push"
  ],
  "name": "web",
  "active": true,
  "config": {
    "url": "http://www.example.com/example",
    "content_type": "json"
  }
}

İşte bir GET ve bir POST isteği örneği. Bu isteklerin farklı kısımlarını hızla gözden geçirelim.

Talebin ilk satırı, talep hattı için ayrılmıştır. İstek yöntemi adı, istek URI’si ve HTTP sürümünden oluşur.

Sonraki birkaç satır istek üstbilgilerini temsil etmektedir. İstek başlıkları, istekte bulunan içerik türleri, yanıtta beklenen içerik, yetkilendirme bilgileri vb. Gibi ek bilgi sağlar;

GET isteği için hikaye burada bitiyor. POST isteğinde ayrıca bir gövde olabilir ve gövde mesajı şeklinde ek bilgi taşıyabilirsiniz. Bu durumda, URI’de belirtilen verilen repo için GitHub web kancasının nasıl oluşturulması gerektiği konusunda ek bilgi içeren bir JSON mesajıdır. Bu mesaj, web kağıdının oluşturulması için gereklidir, bu nedenle bu bilgileri GitHub API’sine sunmak için POST isteği kullanıyoruz.

İstek hattı ve istek başlıkları, <CR> <LF> (satır başı ve satır besleme \r \n) tarafından takip edilmeli ve ileti üstbilgileri ile ileti gövdesi arasında yalnızca CRLF içeren tek bir boş satır bulunmalıdır.

HTTP isteği için referans: https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Ve bu isteklere cevap olarak ne alacağız?

Yanıt mesajı

HTTP/1.1 200 OK
Server: GitHub.com
Date: Sun, 18 Jun 2017 13:10:41 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Status: 200 OK
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4996
X-RateLimit-Reset: 1497792723
Cache-Control: private, max-age=60, s-maxage=60
 
[
  {
    "type": "Repository",
    "id": 14437404,
    "name": "web",
    "active": true,
    "events": [
      "push"
    ],
    "config": {
      "content_type": "json",
      "insecure_ssl": "0",
      "url": "http://www.example.com/example"
    },
    "updated_at": "2017-06-18T12:17:15Z",
    "created_at": "2017-06-18T12:03:15Z",
    "url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404",
    "test_url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/test",
    "ping_url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/pings",
    "last_response": {
      "code": 422,
      "status": "misconfigured",
      "message": "Invalid HTTP Response: 404"
    }
  },
]

Yanıt mesajı, ilk satırın yanıt durumu hakkında taşıdığı bilgi hariç, istekle hemen hemen aynı şekilde yapılandırılmıştır. ?

Durum satırı, yanıt başlıkları ve yanıt gövdesi tarafından izlenir.

HTTP yanıtı için referans: https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

MIME türleri

MIME türleri internetteki dosya türlerini tanımlamak için standart bir yol olarak kullanılır. Tarayıcınız bir MIME türleri listesine sahiptir ve web sunucuları için de aynı şey geçerlidir. Bu şekilde, dosyalar işletim sisteminden bağımsız olarak aynı şekilde aktarılabilir.

Aslında multimedya e-postası için geliştirildikleri için MIME, Çok Amaçlı İnternet Posta Uzantısı anlamına gelir. O zamandan beri HTTP ve diğer pek çok protokol için kullanılmak üzere uyarlandılar.

Her MIME türü, bir tür, alt türü ve aşağıdaki biçimde isteğe bağlı parametrelerin bir listesinden oluşur: type / subtype; Isteğe bağlı parametreler.

İşte birkaç örnek:

Content-Type: application/json
Content-Type: text/xml; charset=utf-8
Accept: image/gif

Sık kullanılan MIME türlerinin ve alt türlerinin listesini HTTP referansında bulabilirsiniz.

İstek Yöntemleri

HTTP istek yöntemleri (“eylemler” de denir), kaynak üzerinde gerçekleştirilecek eylemi tanımlar. HTTP, en çok bilinen / kullanılan GET ve POST yöntemleri olan birkaç istek yöntemi tanımlar.

Bir istek yöntemi idempotent veya idempotent olmayabilir. Bu, yöntemin aynı kaynaklarda birkaç kez çağrılmasının güvenli / güvensiz olduğunu açıklayan basit bir terimdir. Başka bir deyişle, bu, yalnızca bilgi alma özelliğine sahip olan GET yönteminin varsayılan olarak idempotent olması gerektiği anlamına gelir. Aynı kaynaktaki GET’in tekrar tekrar çağırılması farklı bir yanıtla sonuçlanmamalıdır. Öte yandan POST yöntemi idempotent bir yöntem değildir.

HTTP / 1.1 öncesinde yalnızca üç yöntem vardı: GET, POST ve HEAD ve HTTP / 1.1’in belirtimi oyuna birkaçını daha getirdi: OPTIONS, PUT, DELETE, TRACE ve CONNECT.

Bu yöntemlerin her birinin ne yaptığını HTTP Referansında daha fazla bulabilirsiniz.

Başlıklar

Başlık alanları, istek veya yanıt mesajının ilk satırından hemen sonra bulabileceği iki nokta üstüste ayrılmış ad-değer alanlarıdır. Bunlar, HTTP mesajlarına daha fazla bağlam sağlarlar ve istemcilerin ve sunucuların, talebin veya yanıtın niteliği hakkında uygun şekilde bilgilendirilmesini sağlarlar.

Toplamda beş tür üstbilgi var:

  • Genel başlıklar: Bu üstbilgiler hem sunucu hem de istemci için yararlıdır. İyi bir örnek, mesajın oluşturulma zamanı ile ilgili bilgileri sağlayan tarih başlık alanını içerir.
  • İstek başlıkları: İstek mesajlarına özgü. Sunucuya ek bilgi sağlamaktadırlar. Örneğin, Kabul Et: * / * başlık alanı sunucuyu, istemcinin herhangi bir ortam türünü almaya istekli olduğunu bildirir.
  • Yanıt başlıkları: Yanıt mesajlarına özgü. İstemciye ilave bilgi sağlarlar. Örneğin, İzin ver: GET, HEAD, PUT üstbilgi alanı, istemciye hangi yöntemlerin istenen kaynak için izin verildiğini bildirir.
  • Varlık üstbilgileri: Bu üstbilgiler varlığın gövdesiyle ilgilidir. Örneğin, Content-Type: text / html header, uygulamanın verilerin HTML belgesi olduğunu bilmesini sağlar.
  • Genişletme üstbilgileri: Bunlar, uygulama geliştiricileri tarafından oluşturulan standart olmayan üstbilgilerdir. HTTP’nin bir parçası değil, ancak tolere edilmeleri gerekir.

Sıkça kullanılan istek ve yanıt başlıklarının listesini HTTP Referansında bulabilirsiniz.

Durum Kodları

Durum kodu, bir isteğin sonucunu gösteren üç basamaklı bir sayıdır. Bunu, insan tarafından okunabilir olan neden açıklaması takip eder.

Bazı örnekler şunları içerir:

  • 200 Başarılı.
  • 404 Bulunamadı
  • 500 Sunucu Hatası

Durum kodları, beş farklı gruptaki aralıklarla sınıflandırılır.

Hem durum kodu sınıflandırması hem de durum kodlarının tümü ve anlamları HTTP Referansında bulunabilir.

Sonuç

Phew, çok fazla bilgi oldu.

HTTP öğrenerek kazandığınız bilgi, doğrudan bazı problemi çözmenize yardımcı olan tür değildir. Ancak size, HTTP’den daha üst düzeydeki neredeyse her problem için uygulayabileceğiniz internet iletişiminin temel ilkesini anlayacaksınız. İster REST API’ler, web uygulaması geliştirme veya ağ olsun, şimdi bu tür sorunları çözerken en azından biraz daha emin olabilirsiniz.

Tabii ki, HTTP konuşmak için oldukça büyük bir konudur ve hala temel konulardan çok daha fazlası var.

HTTP serisinin 2. bölümünde HTTP’nin mimari yönlerini okuyabilirsiniz.

Bu makale size yardımcı oldu mu? Lütfen yorum bırakın ve bana bildirin.

Bir sonraki ders: HTTP Dersleri – Ders 2 – Mimari Yönleri

Referanslar:

Orjinal Yazı: https://www.code-maze.com/http-series-part-1/