HTTP ve HTTPS Nasıl Çalışır? İnternetin Omurgasını Anlamak
Tarayıcıya https://google.com yazıp Enter'a basıyorsunuz. Milisaniyeler içinde Google'ın ana sayfası karşınızda. Bu kadar basit görünüyor. Ama bu tek tuş basışında onlarca farklı sistem devreye giriyor.
Bu yazı o milisaniyeler içinde neler olduğunu anlatıyor. Ve bu mekanizmayı anlamak, performans sorunlarını teşhis etmekten güvenlik açıklarını fark etmeye kadar pek çok konuda size somut avantaj sağlar.
HTTP Nedir?
HTTP (HyperText Transfer Protocol), istemci ile sunucu arasındaki iletişimin kurallarını tanımlayan protokoldür. 1991'de Tim Berners-Lee tarafından tasarlandı. Temel fikir basitti: bir istemci bir kaynak ister, sunucu o kaynağı döner.
HTTP stateless bir protokoldür — her istek birbirinden bağımsızdır. Sunucu, önceki istekleri hatırlamaz. Bu tasarım kararı web'i ölçeklenebilir kılar ama aynı zamanda session yönetimini, authentication'ı ve kullanıcı durumunu takip etmeyi uygulama katmanının sorumluluğuna bırakır.
Bir İstek Yolculuğu: Adım Adım
https://example.com/products adresine gittiğinizde neler oluyor?
1. DNS Çözümleme
Tarayıcı önce example.com'un IP adresini bulmak zorunda. Alan adları insanlar için okunabilir kısayollardır — bilgisayarlar IP adresleriyle konuşur.
DNS çözümleme şu sırayla gerçekleşir: önce tarayıcı önbelleği, sonra işletim sistemi önbelleği, sonra router önbelleği, ardından internet servis sağlayıcısının DNS sunucusu ve en son yetkili DNS sunucusu. Çoğu istek ilk birkaç adımda önbellekten çözümlenir.
2. TCP Bağlantısı — Three-Way Handshake
IP adresi bulunduğunda, tarayıcı sunucuyla TCP bağlantısı kurar. TCP güvenilir iletişim protokolüdür — verinin eksiksiz ve sıralı ulaşmasını garanti eder.
Bağlantı üç adımda kurulur:
İstemci → Sunucu: SYN (bağlanmak istiyorum)
Sunucu → İstemci: SYN-ACK (tamam, hazırım)
İstemci → Sunucu: ACK (anlaştık)
Bu el sıkışma her bağlantıda gerçekleşir ve bir round-trip süresi (RTT) kadar zaman alır. Kullanıcı İstanbul'daysa ve sunucu New York'taysa bu gecikme ~120ms'dir. Küçük bir sayı ama ölçekte önemli.
3. TLS Handshake (HTTPS için)
HTTPS kullanılıyorsa TCP'nin üzerine bir de TLS katmanı eklenir. TLS (Transport Layer Security), iletişimi şifreler ve sunucunun kimliğini doğrular.
İstemci → Sunucu: ClientHello (desteklediğim şifreleme yöntemleri)
Sunucu → İstemci: ServerHello + Sertifika
İstemci → Sunucu: Sertifikayı doğrula, session key'i oluştur
Sunucu → İstemci: Hazır
--- Şifrelenmiş iletişim başlar ---
Modern TLS 1.3 bu handshake'i bir round-trip'e indirdi. Eski TLS 1.2 iki round-trip gerektiriyordu.
4. HTTP İsteği
Bağlantı kurulduktan sonra asıl istek gönderilir:
GET /products HTTP/1.1 Host: example.com Accept: text/html,application/xhtml+xml Accept-Language: tr-TR,tr;q=0.9 Accept-Encoding: gzip, deflate, br Connection: keep-alive Cookie: session_id=abc123; theme=dark User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
5. HTTP Yanıtı
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Cache-Control: max-age=3600 ETag: "33a64df551425fcc55e4d42a148795d9f25f89d" Strict-Transport-Security: max-age=31536000; includeSubDomains <!DOCTYPE html> <html>...
HTTP Header'ları: Görünmez Ama Kritik
Header'lar, istek ve yanıt hakkında metadata taşır. Geliştiricilerin çoğu header'lara yüzeysel bakar ama güvenlik, performans ve caching kararlarının büyük bölümü burada alınır.
Cache-Control — tarayıcıya ve CDN'lere bu yanıtın ne kadar süre saklanabileceğini söyler.
Cache-Control: max-age=86400, public # 1 gün, herkes cache'leyebilir Cache-Control: no-store # hiç cache'leme Cache-Control: private, max-age=3600 # sadece tarayıcı cache'leyebilir
ETag — içeriğin parmak izi. Tarayıcı sonraki istekte If-None-Match header'ıyla bu değeri gönderir. İçerik değişmemişse sunucu 304 Not Modified döner ve bant genişliği korunur.
Strict-Transport-Security (HSTS) — tarayıcıya "bu siteye her zaman HTTPS ile bağlan" der. HTTP üzerinden gelen istekleri otomatik HTTPS'e yönlendirir.
CORS — farklı origin'lerden gelen istekleri kontrol eder. Access-Control-Allow-Origin header'ı hangi domain'lerin bu kaynağa erişebileceğini tanımlar.
Access-Control-Allow-Origin: https://app.example.com Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Authorization, Content-Type
HTTP/1.1 vs HTTP/2 vs HTTP/3
HTTP/1.1 (1997) — her istek için ayrı TCP bağlantısı ya da sıralı istekler. Tarayıcılar performans için aynı anda 6 bağlantı açar — bu yüzden eski sitelerde kaynak sayısını azaltmak önemliydi.
HTTP/2 (2015) — tek TCP bağlantısı üzerinde çoklu istek (multiplexing). Header sıkıştırma. Server Push. Aynı anda onlarca kaynağı tek bağlantıda indirebilirsiniz.
HTTP/1.1: HTTP/2:
İstek 1 → İstek 1 →
← Yanıt 1 İstek 2 →
İstek 2 → İstek 3 →
← Yanıt 2 ← Yanıt 2
İstek 3 → ← Yanıt 1
← Yanıt 3 ← Yanıt 3
HTTP/3 (2022) — TCP yerine QUIC protokolü kullanır. UDP tabanlı ama güvenilir. Özellikle paket kayıplarında HTTP/2'den üstün. Mobil ağlar gibi kararsız bağlantılarda fark yaratır.
HTTPS: SSL/TLS'in Önemi
HTTPS, HTTP'nin TLS ile şifrelenmiş versiyonudur. Üç şeyi garanti eder:
Şifreleme — iletişim üçüncü taraflarca okunamaz. Aradaki biri trafiği yakalasa bile şifreli veri görür.
Kimlik doğrulama — sunucu sertifikası, gerçekten example.com ile konuştuğunuzu kanıtlar. DNS spoofing veya man-in-the-middle saldırılarına karşı koruma.
Bütünlük — veri iletim sırasında değiştirilmemiştir. Her mesaj bir MAC (Message Authentication Code) ile korunur.
2018'den itibaren Chrome, HTTP siteleri "Güvenli Değil" olarak işaretliyor. Google, HTTPS kullanımını arama sıralamasında pozitif faktör olarak değerlendiriyor. Artık HTTPS seçenek değil, zorunluluk.
Geliştirici Gözüyle HTTP
Browser DevTools'un Network sekmesi, HTTP'yi görselleştirir. Waterfall görünümü her isteğin ne kadar sürdüğünü, DNS'in ne kadar zaman aldığını, TLS handshake gecikmesini, TTFB (Time to First Byte) değerini gösterir.
Performans sorunlarının büyük bölümü network katmanında yaşar: gereksiz istekler, önbelleğe alınmayan kaynaklar, büyük payload'lar, blocking kaynaklar. HTTP'yi anlamak bu sorunları teşhis etmenin ön koşuludur.
Her web isteği bu mekanizmanın üzerine kuruludur. Framework ne olursa olsun, dil ne olursa olsun — HTTP anlaşılmadan web geliştirme yüzeyde kalır.