HTTP Das Protokoll, das jeder Webentwickler kennen muss - Teil 2

In meinem vorherigen Artikel haben wir einige Grundlagen von HTTP behandelt, beispielsweise das URL-Schema, Statuscodes und Request / Response-Header. Auf dieser Grundlage werden wir uns mit den feineren Aspekten von HTTP beschäftigen, wie Verbindungsverarbeitung, Authentifizierung und HTTP-Caching. Diese Themen sind ziemlich umfangreich, aber wir werden die wichtigsten Punkte behandeln.


HTTP-Verbindungen

Zwischen Client und Server muss eine Verbindung hergestellt werden, bevor sie miteinander kommunizieren können, und HTTP verwendet das zuverlässige TCP-Transportprotokoll, um diese Verbindung herzustellen. Standardmäßig verwendet der Webdatenverkehr den TCP-Port 80. Ein TCP-Datenstrom wird in IP-Pakete aufgeteilt und stellt sicher, dass diese Pakete immer in der richtigen Reihenfolge ohne Fehler ankommen. HTTP ist ein Protokoll auf Anwendungsebene über TCP (über IP).

HTTPS ist eine sichere Version von HTTP, die eine zusätzliche Schicht zwischen HTTP und TCP einfügt, die als TLS oder SSL (Transport Layer Security bzw. Secure Sockets Layer) bezeichnet wird. HTTPS kommuniziert standardmäßig über Port 443, und wir werden uns HTTPS später in diesem Artikel ansehen.

Eine HTTP-Verbindung wird durch gekennzeichnet und . Auf einem Client wird eine HTTP-Anwendung mit einem gekennzeichnet Tupel Das Herstellen einer Verbindung zwischen zwei Endpunkten ist ein mehrstufiger Prozess und umfasst Folgendes:

  • IP-Adresse vom Hostnamen über DNS auflösen
  • Stellen Sie eine Verbindung mit dem Server her
  • eine Anfrage senden
  • warte auf eine antwort
  • Verbindung schließen

Der Server ist dafür verantwortlich, immer mit den richtigen Kopfzeilen und Antworten zu antworten.

In HTTP / 1.0 wurden alle Verbindungen nach einer einzelnen Transaktion geschlossen. Wenn also ein Client drei separate Images vom selben Server anfordern wollte, stellte er drei separate Verbindungen zum Remote-Host her. Wie Sie dem obigen Diagramm entnehmen können, kann dies zu erheblichen Netzwerkverzögerungen führen, was zu einer suboptimalen Benutzererfahrung führt.

Um Verzögerungen beim Verbindungsaufbau zu reduzieren, wurde HTTP / 1.1 eingeführt dauerhafte Verbindungen, langlebige Verbindungen, die geöffnet bleiben, bis der Client sie schließt. Persistente Verbindungen sind standardmäßig in HTTP / 1.1. Für das Herstellen einer einzelnen Transaktionsverbindung muss der Client das festlegen Verbindung: schließen Anforderungsheader Dadurch wird der Server angewiesen, die Verbindung nach dem Senden der Antwort zu schließen.

Browser / Clients verwenden neben persistenten Verbindungen auch eine Technik namens Parallelverbindungen, Netzwerkverzögerungen zu minimieren. Das jahrhundertealte Konzept der parallelen Verbindungen beinhaltet das Erstellen eines Pools von Verbindungen (im Allgemeinen auf sechs Verbindungen begrenzt). Wenn der Client sechs Assets von einer Website herunterladen muss, stellt er sechs parallele Verbindungen her, um diese Assets herunterzuladen. Dies führt zu einer schnelleren Bearbeitung. Dies ist eine enorme Verbesserung gegenüber seriellen Verbindungen, bei denen der Client ein Asset nur nach Abschluss des Downloads für ein vorheriges Asset herunterlädt.

Parallele Verbindungen in Kombination mit dauerhaften Verbindungen sind heutzutage die Antwort auf die Minimierung von Netzwerkverzögerungen und die Schaffung eines reibungslosen Betriebs auf dem Client. Eine ausführliche Behandlung von HTTP-Verbindungen finden Sie im Abschnitt Verbindungen der HTTP-Spezifikation.

Serverseitige Verbindungsbehandlung

Der Server wartet meistens auf eingehende Verbindungen und verarbeitet sie, wenn er eine Anfrage erhält. Die Operationen beinhalten:

  • Einrichten eines Sockets zum Starten von Port 80 (oder einem anderen Port)
  • Empfangen der Anfrage und Analysieren der Nachricht
  • Bearbeitung der Antwort
  • Antwortheader setzen
  • Senden der Antwort an den Client
  • Verbindung schließen, wenn a Verbindung: schließen Anforderungsheader wurde gefunden

Natürlich ist dies keine erschöpfende Liste von Vorgängen. Die meisten Anwendungen / Websites müssen wissen, wer eine Anfrage stellt, um individuellere Antworten zu erstellen. Dies ist das Reich von Identifizierung und Authentifizierung.


Identifikation und Authentifizierung

HTTP ist ein Protokoll auf Anwendungsebene über TCP (über IP).

Es ist fast zwingend erforderlich zu wissen, wer eine Verbindung zu einem Server herstellt, um die Nutzung einer App oder Website und die allgemeinen Interaktionsmuster der Benutzer zu verfolgen. Die Voraussetzung der Identifikation ist, die Antwort maßzuschneidern, um eine personalisierte Erfahrung zu bieten. Natürlich muss der Server wissen, wer ein Benutzer ist, um diese Funktionalität bereitzustellen.

Es gibt verschiedene Möglichkeiten, wie ein Server diese Informationen sammeln kann, und die meisten Websites verwenden eine Kombination dieser Ansätze:

  • Kopfzeilen anfordern: Von, Referer, User-Agent - Wir haben diese Header in Teil 1 gesehen.
  • Client-IP - die IP-Adresse des Clients
  • Fat Urls - Speichern des Status des aktuellen Benutzers durch Ändern der URL und Umleiten zu einer anderen URL bei jedem Klick; Jeder Klick sammelt im Wesentlichen den Status.
  • Kekse - der beliebteste und nicht aufdringliche Ansatz.

Cookies ermöglichen es dem Server, beliebige Informationen für ausgehende Antworten über das Internet anzufügen Set-Cookie Antwortheader Ein Cookie wird mit einem oder mehreren gesetzt name = wert durch Semikolon getrennte Paare (;), wie in Set-Cookie: Sitzungs-ID = 12345ABC; username = nettuts.

Ein Server kann die Cookies auch auf ein bestimmtes beschränken Domain und Pfad, und es kann sie zu einem persistenten machen läuft ab Wert. Cookies werden vom Browser automatisch für jede an einen Server gesendete Anforderung gesendet, und der Browser stellt sicher, dass nur die Domain- und Pfad-In der Anfrage werden bestimmte Cookies gesendet. Der Anforderungsheader Cookie: Name = Wert [; name2 = value2] wird verwendet, um diese Cookies an den Server zu senden.

Die beste Möglichkeit, einen Benutzer zu identifizieren, besteht darin, dass er sich zur Anmeldung und Anmeldung anmelden muss. Die Implementierung dieser Funktion erfordert jedoch einige Anstrengungen des Entwicklers sowie des Benutzers.

Techniken wie OAuth vereinfachen diese Art von Funktion, sie erfordern jedoch die Zustimmung des Benutzers, um ordnungsgemäß zu funktionieren. Authentifizierung spielt hier eine große Rolle, und es ist wahrscheinlich die einzige Möglichkeit, den Benutzer zu identifizieren und zu überprüfen.

Authentifizierung

HTTP unterstützt eine rudimentäre Form der Authentifizierung Basisauthentifizierung, sowie die sicherere Digest-Authentifizierung.

Bei der Standardauthentifizierung verweigert der Server die Anforderung des Clients zunächst mit einem WWW-Authentifizierung Antwortheader und a 401 nicht Autorisiert Statuscode. Wenn dieser Header angezeigt wird, zeigt der Browser ein Anmeldedialogfeld an, in dem Sie zur Eingabe eines Benutzernamens und eines Kennworts aufgefordert werden. Diese Informationen werden in einem Base-64-codierten Format im gesendet Authentifizierung Anforderungsheader Der Server kann jetzt die Anforderung überprüfen und den Zugriff zulassen, wenn die Anmeldeinformationen gültig sind. Einige Server senden möglicherweise auch eine Authentifizierungs-Info Header mit zusätzlichen Authentifizierungsdetails.

Eine Folge von Basic-Authentication ist Proxy-Authentifizierung. Anstelle eines Webservers wird die Authentifizierungsaufforderung von einem Zwischenproxy angefordert. Der Proxy sendet eine Proxy-Authentifizierung Header mit einem 407 Nicht autorisiert Statuscode. Im Gegenzug soll der Client die Zugangsdaten über die Proxy-Autorisierung Anforderungsheader.

Die Digest-Authentifizierung ähnelt der von Basic und verwendet dieselbe Handshake-Technik wie das WWW-Authentifizierung und Genehmigung Header, aber Digest verwendet eine sicherere Hash-Funktion, um den Benutzernamen und das Kennwort zu verschlüsseln (üblicherweise mit MD5- oder KD-Digest-Funktionen). Obwohl die Digest-Authentifizierung sicherer als Basic sein soll, verwenden Websites aufgrund ihrer Einfachheit normalerweise die Standardauthentifizierung. Zur Verringerung der Sicherheitsbedenken wird Basic Auth in Verbindung mit SSL verwendet.

Sicheres HTTP

Das HTTPS-Protokoll bietet eine sichere Verbindung im Web. Der einfachste Weg, um festzustellen, ob Sie HTTPS verwenden, ist das Überprüfen der Adressleiste des Browsers. Die sichere Komponente von HTTPs beinhaltet das Einfügen einer Verschlüsselungs- / Entschlüsselungsschicht zwischen HTTP und TCP. Dies ist SSL (Secure Sockets Layer) oder das verbesserte Transport Layer Security (TLS)..

SSL verwendet eine leistungsfähige Form der Verschlüsselung unter Verwendung von RSA und der Verschlüsselung mit öffentlichen Schlüsseln. Da sichere Transaktionen im Web so wichtig sind, werden seit einiger Zeit allgegenwärtige, auf Standards basierende Public-Key-Infrastruktur (PKI) angestrebt.

Bestehende Clients / Server müssen die Art und Weise, wie Nachrichten behandelt werden, nicht ändern, da der größte Teil der harten Arbeit in der SSL-Schicht stattfindet. So können Sie Ihre Webanwendung mithilfe der Standardauthentifizierung entwickeln und die Vorteile von SSL automatisch nutzen, indem Sie zu https: // Protokoll. Damit die Webanwendung jedoch über HTTPS funktioniert, müssen Sie ein funktionsfähiges digitales Zertifikat auf dem Server bereitstellen.

Zertifikate

So wie Sie einen Ausweis benötigen, um Ihre Identität zu zeigen, benötigt ein Webserver ein digitales Zertifikat, um sich zu identifizieren. Zertifikate (oder "Zertifikate") werden von einer Zertifizierungsstelle (Certificate Authority, CA) ausgestellt und belegen Ihre Identität im Web. Die CAs sind die Wächter der PKI. Die gebräuchlichste Form von Zertifikaten ist der X.509 v3-Standard, der folgende Informationen enthält:

  • der Zertifikatsaussteller
  • der für das Zertifikat verwendete Algorithmus
  • Name des Betreffs oder der Organisation, für die dieses Zertifikat erstellt wurde
  • die öffentlichen Schlüsselinformationen für das Thema
  • die Zertifizierungsstellen-Signatur unter Verwendung des angegebenen Signaturalgorithmus

Wenn ein Client eine Anforderung über HTTPS stellt, versucht er zunächst, ein Zertifikat auf dem Server zu finden. Wenn das Zertifikat gefunden wird, versucht es, es anhand seiner bekannten Liste von Zertifizierungsstellen zu überprüfen. Wenn es sich nicht um eine der aufgelisteten Zertifizierungsstellen handelt, wird dem Benutzer möglicherweise ein Dialogfeld mit einer Warnung zum Zertifikat der Website angezeigt.

Nach der Überprüfung des Zertifikats ist der SSL-Handshake abgeschlossen und die sichere Übertragung ist wirksam.


HTTP-Caching

Es ist allgemein anerkannt, dass dieselbe Arbeit zweimal zu verschwenden ist. Dies ist der Leitsatz für das Konzept des HTTP-Caching, einer grundlegenden Säule der HTTP-Netzwerkinfrastruktur. Da die meisten Vorgänge über ein Netzwerk erfolgen, spart ein Cache Zeit, Kosten und Bandbreite und sorgt für ein verbessertes Web-Erlebnis.

Caches werden an mehreren Stellen in der Netzwerkinfrastruktur verwendet, vom Browser bis zum Ursprungsserver. Je nach Standort kann ein Cache in folgende Kategorien unterteilt werden:

  • Privatgelände: In einem Browser werden Benutzernamen, Kennwörter, URLs, Browserverlauf und Webinhalt zwischengespeichert. Sie sind im Allgemeinen klein und für einen Benutzer spezifisch.
  • Öffentlichkeit: Wird als Zwischenspeicherung von Proxys zwischen Server und Client bereitgestellt. Diese sind viel größer, weil sie mehreren Benutzern dienen. Eine gängige Praxis ist es, mehrere Caching-Proxies zwischen dem Client und dem Ursprungs-Server zu halten. Dies hilft, häufig aufgerufene Inhalte bereitzustellen, und ermöglicht dennoch eine Reise zum Server für selten benötigte Inhalte.

Cache-Verarbeitung

Unabhängig davon, wo sich ein Cache befindet, ist die Pflege eines Caches ziemlich ähnlich:

  • Erhalten Nachricht anfordern.
  • Parse die URL und die Header.
  • Sieh nach oben eine lokale Kopie; Andernfalls lokal abholen und speichern
  • Mach einen Frischecheck um das Alter des Inhalts im Cache zu bestimmen; fordern Sie die Aktualisierung des Inhalts nur dann an, wenn dies erforderlich ist.
  • Erstellen Sie die Antwort aus dem zwischengespeicherten Körper und aktualisierte Header.
  • Senden die Antwort an den Kunden zurück.
  • Optional, Log die Transaktion.

Natürlich ist der Server dafür verantwortlich, immer mit den richtigen Kopfzeilen und Antworten zu antworten. Wenn sich ein Dokument nicht geändert hat, sollte der Server mit einem antworten 304 Nicht modifiziert. Wenn die zwischengespeicherte Kopie abgelaufen ist, sollte eine neue Antwort mit aktualisierten Antwortheatern generiert und mit a zurückgegeben werden 200 OK. Wenn die Ressource gelöscht wird, sollte sie mit zurückkommen 404 Nicht gefunden. Diese Antworten helfen, den Cache zu optimieren und sicherzustellen, dass veraltete Inhalte nicht zu lange aufbewahrt werden.

Cache-Kontrollheader

Parallele Verbindungen in Kombination mit dauerhaften Verbindungen sind heutzutage die Antwort auf die Minimierung von Netzwerkverzögerungen.

Da wir jetzt ein Gefühl dafür haben, wie ein Cache funktioniert, ist es an der Zeit, die Request- und Response-Header zu betrachten, die die Caching-Infrastruktur ermöglichen. Die Aktualität und Aktualität der Inhalte ist eine der Hauptaufgaben des Cache. Um die zwischengespeicherte Kopie mit dem Server konsistent zu halten, bietet HTTP einige einfache Mechanismen, nämlich Ablauf des Dokuments und Server-Überprüfung.

Ablauf des Dokuments

HTTP ermöglicht es einem Ursprungsserver, eine Verbindung herzustellen Haltbarkeitsdatum zu jedem Dokument mit der Cache-Steuerung und Läuft ab Antwort Überschriften Dadurch können der Client und andere Cache-Server wissen, wie lange ein Dokument gültig und aktuell ist. Der Cache kann die Kopie so lange bereitstellen wie die Alter des Dokuments liegt innerhalb des Ablaufdatums. Wenn ein Dokument abläuft, muss der Cache beim Server nach einer neueren Kopie suchen und seine lokale Kopie entsprechend aktualisieren.

Läuft ab ist ein älterer HTTP / 1.0-Antwortheader, der den Wert als absolutes Datum angibt. Dies ist nur nützlich, wenn die Serveruhren mit dem Client synchron sind. Dies ist eine schreckliche Annahme. Dieser Header ist weniger nützlich als der neuere Cache-Kontrolle: max-age = Header eingeführt in HTTP / 1.1. Hier, Maximalalter ist ein relatives Alter in Sekunden, ab dem Zeitpunkt, an dem die Antwort erstellt wurde. Wenn also ein Dokument nach einem Tag abläuft, sollte der Ablauf-Header lauten Cache-Kontrolle: maximales Alter = 86400.

Server-Überprüfung

Wenn ein zwischengespeichertes Dokument abläuft, muss der Cache beim Server erneut überprüft werden, um zu prüfen, ob sich das Dokument geändert hat. Das nennt man Servervalidierung und dient als Abfragemechanismus für die Faulheit eines Dokuments. Nur weil eine zwischengespeicherte Kopie abgelaufen ist, bedeutet dies nicht, dass der Server tatsächlich neueren Inhalt hat. Eine erneute Validierung ist nur ein Mittel, um sicherzustellen, dass der Cache aktuell bleibt. Aufgrund der Ablaufzeit (wie in einer früheren Serverantwort angegeben) muss sich der Cache nicht für jede einzelne Anforderung beim Server abfragen, wodurch Bandbreite und Zeit gespart und der Netzwerkverkehr reduziert wird.

Die Kombination aus Dokumentablauf und Server-Revalidierung ist ein sehr effektiver Mechanismus, der es verteilten Systemen ermöglicht, Kopien mit einem Ablaufdatum zu verwalten.

Wenn bekannt ist, dass sich der Inhalt häufig ändert, kann die Ablaufzeit reduziert werden, sodass die Systeme häufiger erneut synchronisiert werden.

Der Revalidierungsschritt kann mit zwei Arten von Anforderungsheadern ausgeführt werden: Wenn-modifiziert-seit und Wenn-keine-Übereinstimmung. Ersteres dient zur datumsbasierten Validierung, während letzteres Entity-Tags (ETags) verwendet, einen Hash des Inhalts. Diese Header verwenden Datums- oder ETag-Werte, die aus einer vorherigen Serverantwort abgerufen wurden. Im Falle von Wenn-modifiziert-seit, das Zuletzt bearbeitet Antwortheader wird verwendet; zum Wenn-keine-Übereinstimmung, es ist der ETag Antwortheader.

Cachefähigkeit kontrollieren

Der Gültigkeitszeitraum für ein Dokument sollte vom Server festgelegt werden, der das Dokument generiert. Wenn es sich um eine Zeitungswebsite handelt, sollte die Homepage nach einem Tag (oder manchmal sogar stündlich!) Ablaufen. HTTP liefert die Cache-Steuerung und Läuft ab Antwortheader, um den Ablauf für Dokumente festzulegen. Wie bereits erwähnt, Läuft ab basiert auf absoluten Daten und ist keine zuverlässige Lösung für die Cache-Steuerung.

Das Cache-Steuerung header ist viel nützlicher und hat einige verschiedene Werte, um festzulegen, wie Clients die Antwort zwischenspeichern sollen:

  • Cache-Control: kein Cache: Der Kunde darf das Dokument speichern. Es muss jedoch bei jeder Anforderung mit dem Server erneut validiert werden. Es wird ein HTTP / 1.0-Kompatibilitätsheader aufgerufen Pragma: kein Cache, das funktioniert genauso.
  • Cache-Control: No-StoreDies ist eine stärkere Anweisung an den Client, das Dokument überhaupt nicht zu speichern.
  • Cache-Control: Muss erneut validiert werden: Dies weist den Client an, die Aktualitätsberechnung zu umgehen und immer eine erneute Validierung mit dem Server durchzuführen. Es ist nicht zulässig, die zwischengespeicherte Antwort zu liefern, falls der Server nicht verfügbar ist.
  • Cache-Control: max-age: Damit wird eine relative Ablaufzeit (in Sekunden) ab dem Zeitpunkt festgelegt, zu dem die Antwort generiert wird.

Nebenbei gesagt, wenn der Server keine sendet Cache-Steuerung In den Headern kann der Client seinen eigenen heuristischen Ablaufalgorithmus verwenden, um die Frische zu bestimmen.

Frische vom Client einschränken

Die Zwischenspeicherung ist nicht nur auf den Server beschränkt. Es kann auch vom Client aus angegeben werden. Auf diese Weise kann der Client Einschränkungen auferlegen, was er akzeptieren möchte. Dies ist über dasselbe möglich Cache-Steuerung Header, jedoch mit einigen anderen Werten:

  • Cache-Control: min-fresh =: Das Dokument muss mindestens frisch sein Sekunden.
  • Cache-Control: max-stale oder Cache-Control: max-stale =: Das Dokument kann nicht aus dem Cache geliefert werden, wenn es länger als veraltet ist Sekunden.
  • Cache-Kontrolle: max-age =: Der Cache kann kein Dokument zurückgeben, das länger als gespeichert wurde Sekunden.
  • Cache-Control: kein Cache oder Pragma: kein Cache: Der Client akzeptiert eine zwischengespeicherte Ressource nur, wenn diese erneut validiert wurde.

HTTP-Caching ist eigentlich ein sehr interessantes Thema, und es gibt einige sehr ausgeklügelte Algorithmen zur Verwaltung von zwischengespeicherten Inhalten. Weitere Informationen zu diesem Thema finden Sie im Abschnitt Caching der HTTP-Spezifikation.


Zusammenfassung

Unsere HTTP-Tour begann mit der Gründung von URL-Schemata, Statuscodes und Request / Response-Headern. Aufbauend auf diesen Konzepten untersuchten wir einige der feineren Bereiche von HTTP, wie etwa die Verbindungsverarbeitung, Identifizierung, Authentifizierung und Zwischenspeicherung. Ich hoffe, dass diese Tour Ihnen einen guten Eindruck von der Breite von HTTP gegeben hat und genügend Hinweise, um dieses Protokoll näher kennenzulernen.

Verweise

  • RFC 2616, HTTP-Spezifikation
  • Definitive Anleitung für HTTP