Was versteht man unter HTTP Caching?
Der Datenaustausch über das Internet nimmt täglich und inzwischen im bedenklichen Maße zu. Unmengen von Informationen werden zwischen Server- und Clientsystemen transferiert, ausgewertet und angezeigt. Einen großen Teil davon - für beispielsweise eine statische Webseite - müsste man oftmals aber gar nicht mehrfach übertragen. Jedwede Information, die sich in absehbarer Zeit nicht ändert bzw. nicht sekundengenau aktualisiert werden muss, kann grundsätzlich und auf unterschiedliche Weise zwischengespeichert werden. Dies kann auf dem Clientsystem im Browser oder auch in einem Proxy-Server in der Informationskette vorgenommen werden.
Wenn also eine Bilddatei zu einem Newsbeitrag mit an den Empfänger übertragen wird, so könnte diese zur späteren Anzeige im Browser vorgehalten werden. Eine mehrfache Anzeige auf der Webseite würde dann ungleich schneller erfolgen, da der Browser die „unveränderte“ Datei sofort zur Verfügung hat und diese nicht erneut über das Internet vom Informationsserver angefordert werden muss. Dieses Verfahren ist seit geraumer Zeit bereits üblich und ausreichend im HTTP-Standard als HTTP-Caching definiert.
Daten-Zwischenspeicherung in der Praxis
Die Zwischenspeicherung von Daten und Informationen unterliegt einem festen Schema. Der Datenfluss beginnt dabei mit dem beispielsweisen Aufruf einer Webseite über den Webbrowser. Als Antwort auf die Anfrage erhält der Browser eine bzw. mehrere Antworten vom Server mit entsprechenden Parametern. Beim Übertragen einer Bilddatei wie beispielsweise das Webseitenlogo hat der Header die folgende exemplarische Form:
HTTP / 2.0 OK
accept-ranges: bytes
cache-control: max-age=31536000
content-length: 4255
content-type: image/jpeg
date: Thu, 13 Dec 2018 11:53:44 GMT
etag: "109f-57b4155594e55"
last-modified: Thu, 22 Nov 2018 14:03:38 GMT
server: Apache
X-Firefox-Spdy: h2
Anhand dieser Sammlung von Parameter erkennt der Browser nun zuerst einmal eine Bilddatei (content-type: image/jpeg). Die Größe beträgt hier im Beispiel 4.255 Bytes. Im Parameter cache-control: max-age=31536000 wird dem Browser zusätzlich mitgeteilt, dass diese Bilddatei für 1 Jahr (Wert wird in Sekunden angegeben) als aktuell gekennzeichnet ist. Mit den beiden folgenden Parametern date: Thu, 13 Dec 2018 11:53:44 GMT und etag: "109f-57b4155594e55" stehen weitere Kennzeichnungen für das Browser-Caching zur Verfügung. Über date: weiß der Browser jederzeit, wann diese Datei erstmalig angefordert wurde. Mittels dem Parameter etag: wurde der Bilddatei eine eindeutige ID mit auf den Weg gegeben.
Wird diese Bilddatei nun durch einen Seitenrefresh oder einige Tage später sogar erneut aufgerufen, so findet der Browser diese Bilddatei im Browser und kann anhand dieser Parameter entscheiden, ob die Bilddatei noch gültig ist (max-age: und date:) und diese dann sofort aus dem Cache darstellen. Eine erneute Übertragung vom Server fällt damit wirkungsvoll weg. Ist die Bilddatei jedoch bereits veraltet, so muss der Browser diese zwar erneut anfordern, kann die Bilddatei jedoch über die ID aus dem Parameter etag: schnell und eindeutig identifizieren.
Control-Optionen für das HTTP-Caching
Damit ein Client (zumeist der Kundenbrowser) das Zwischenspeichern ordentlich durchführen und steuern kann, werden sogenannte Cache-Direktiven zu jeder Anfrage und Antwort hinzugefügt. Um allen Beteiligten die Möglichkeit der korrekten Bearbeitung einräumen zu können, müssen alle Direktiven zunächst grundsätzlich auch jeweils weitergereicht werden. Grundsätzlich beschreibt HTTP-Caching entsprechende Protokolle für Requests und Responses, die wir im Folgenden als Schnittmenge und auszugsweise kurz beschreiben:
Cache-Request-Direktiven:
-
no-cache beschreibt, dass die zurückgesendete Antwort nicht für eine nachfolgende Antwort eingesetzt werden kann. Es muss zusätzlich beim Server angefragt werden, ob sich die Antwort geändert hat. Liegt ein etag vor, wird jedoch ein zusätzlicher Download unterbunden.
-
no-store verbietet den Caches und Browsern grundsätzlich die Speicherung von Daten. Dies hat zur Folge, dass bei jeder Anfrage grundsätzlich eine neue Antwort und ein Download generiert wird.
-
max-age beschreibt den maximalen Gültigkeitszeitraum (in Sekunden) für die angeforderte Ressource. Ist diese Zeitspanne überschritten und kein anderer Wert definiert (z.B. max-stale), so wird die Ressource neu angefordert.
Die Cache-Response-Direktiven verwenden die o.g. Request-Direktiven und zusätzlich noch folgende erweiterte Direktiven:
-
public ermöglicht auch die Zwischenspeicherung von mit HTTP-Authenticate gekennzeichneten Informationen im Cache, was normalerweise nicht möglich wäre. Die Direktive wird jedoch selten verwendet, da über max-age beispielsweise eine Speicherung bereits ausdrücklich erlaubt wird.
-
private bezeichnet eine mögliche und ausschließliche Speicherung im Cache des bezeichneten Clients, nicht jedoch in möglicherweise zwischengeschalteten Proxy- oder Ressource-Servern.
-
must-revalidate und proxy-revalidate bezeichnen eine zwangsweise Überprüfung und damit einhergehendes Neuladen. Must-revalidate erzwingt dabei eine Prüfung der Ressourcen-Gültigkeit mit einem möglicherweisen Neuladen. Proxy-revalidate bezieht sich hierbei jedoch nur auf zwischengelagerte Cachespeicher, nicht jedoch auf den Client-Browsercache.
Es existieren noch weitere Kontrolloptionen für das HTTP-Caching, die Sonderfälle und spezielle Anforderungen bedienen. Für einen umfassenden Überblick und Quellcode-Beispiele bietet das Mozilla Developer-Netzwerk unter (1) einen optimalen Überblick und ausreichend Ressourcen.
Fazit
Wie so oft gibt es auch beim HTTP-Caching keine optimale Lösung. Vielmehr ist hier eine gezielte Ablaufkontrolle und Einbindung von Sicherheitsaspekten der erste Schritt. In einem Flowchart sollte der Entwickler vorab festlegen, welche Ressourcen sinnvollerweise „cacheable“ sind und dahingehend eine passende Parametrisierung vornehmen. Weiterhin wäre es wichtig, Ressourcen auch eine ID über den ETag-Parameter zuzuweisen. Somit ist im Falle des Nachladens eine sichere Identifikation und schnelle Auffindbarkeit gewährleistet.
Werden Ressourcen mehrfach mit verschiedenen URLs verwendet, sollte dahingehend eine gewisse Konsistenz forciert werden und Ressourcen besser zentral verwaltet werden (siehe CDN-Netzwerke und -Server). Um größere Downloadkapazitäten zu vermeiden, kann eine Prüfung auf Proxy-Speicherung gute Ergebnisse erzielen. Somit können unterschiedliche Nutzerebenen auf Proxyebene schnell mit gleichbleibenden Ressourcen bedient werden. Nicht weniger wichtig ist auch die strikte Vergabe einer sinnvollen Cache-Lebensdauer für Ressource. So können die Browser auf der Clientseite bereits selbst bestimmen, welche und wie oft Ressourcen nachgeladen werden müssen.