Cross-Origin Resource Sharing (CORS) über Apache HTTP

Was ist CORS?

In der Wikipedia ließt man folgende Erklärung: "Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, um Webbrowsern oder auch anderen Webclients Cross-Origin-Requests zu ermöglichen.[1] Zugriffe dieser Art sind normalerweise durch die Same-Origin-Policy (SOP) untersagt. CORS ist ein Kompromiss zugunsten größerer Flexibilität im Internet unter Berücksichtigung möglichst hoher Sicherheitsmaßnahmen."

CORS ist also eine Möglichkeit, um im Web Client über Domain-Grenzen hinweg verschiedene Web-Applikationen in einer gemeinsamen Oberfläche zu kombinieren. Dabei kann man auf das Tunneln der Kommunikation über spezielle Proxies verzichten und es besteht keine  Notwendigkeit für dedizierte Web Services, z.B. auf Basis von JSONP.

Der Mechanismus CORS wird bereits seit 2004 diskutiert und befindet sich beim W3C aktuell im Status "Recommendation" (als Stable). Mit den aktuelleren Browser-Versionen wird CORS bereits durchgängig unterstützt, womit der Einsatz nun auch für die breite Masse in greifbare Nähe rückt. Der aktuelle Browser-Support kann auf Can I Use nachgeschlagen werden.

Da wir uns häufig in unseren Projekten mit Integrationsszenarien auseinandersetzen, war damit für uns der Zeitpunkt gekommen, in dieses Thema tiefer einzusteigen. Wir vermuteten  hier großes Potential, welches hilft, die Umsetzung von Integrationsprojekten zu vereinfachen.

Grundkonzept

Grundkonzept bei CORS ist es, dass der Server, welcher die Daten bereitstellt, bestimmte HTTP-Header mitschickt, welche dem Browser signalisieren, dass er eine Ausnahme von der SOP (Same-Origin-Policy) machen darf. Für das "Handshaking" schickt der Browser eine Anfrage mit der HTTP-Methode "OPTIONS" ohne Payload und informiert sich über die "Allow"-Header. Wenn die Header zu der Anfrage passen, dann wird der Request ohne Weiteres ausgeführt.

Vorteile

Im direkten Vergleich zum JSONP-Ansatz ergeben sich einige Vorteile:

  • Einfachere Implementierung, da bereits vorhandenen Web-APIs (z.B. REST) direkt genutzt werden können
  • Nutzung beliebiger HTTP Methoden (z.B. POST, PUT, DELETE)
  • Besseres Caching
  • Besseres Error Handling

Nachteile

Nachteil ist aktuell noch, dass ältere Browser CORS nicht komplett unterstützen, so ist beim Internet Explorer mindestens Version 8 die Voraussetzung, wobei der Private Tab im IE8 und IE9 auch noch zu Fehlern führt. Außerdem müssen IE8 und IE9 mit der xdomainrequest Bibliothek nachgerüstet werden, um überhaupt mitspielen zu können.

Zusätzlich könnte man als Nachteil noch eine gewisse Abhängigkeit von der Infrastruktur aufführen, da in jedem Fall sichergestellt werden muss, dass die benötigten HTTP-Header gesetzt bzw. weitergereicht werden.

CORS mit dem Apache HTTP Server und jQuery

Im Apache HTTP Server kann man die Header zum Beispiel so setzen:

# origin must match exactly the URL in browser address bar Header set Access-Control-Allow-Origin "https://www.myserver.com"

# set all headers needed, wildcard does not work! Header set Access-Control-Allow-Headers "Accept,Accept-Charset,Accept-Encoding,Accept-Language,Connection,Content-Type,Cookie,DNT,Host,Keep-Alive,Origin,Referer,User-Agent,X-CSRF-Token,X-Requested-With"

# set allowed methods (GET,PUT,POST,OPTIONS,..) or * for all Header set Access-Control-Allow-Methods "*"

# allow credentials (cookies) Header set Access-Control-Allow-Credentials true

Wenn authentifizierte Requests über CORS durchgeführt werden sollen, dann ist wichtig, dass withCredentials: true in den xhrFields gesetzt wird, da sonst keine Cookie-Informationen mit übergeben werden. Für jQuery würde das folgendermaßen aussehen:

var request = $.ajax({
type: 'GET',
url: url,
dataType: "json",
crossDomain: true,
xhrFields: {
withCredentials: true
}
});
request.done(function(data){
console.log(data);
});

Fazit

Nachdem wir CORS erfolgreich in allen aktuellen Desktop-Browsern und Mobil-Browsern ausprobiert haben und schon vielversprechende Ergebnisse erzielen konnten, sind wir zuversichtlich, dass sich dieser Mechanismus in Zukunft in zahlreichen Umsetzungen wiederfinden wird.

Tino Winkler
09. Oktober 2014 

Sie haben Fragen oder möchten sich von uns beraten lassen?

Gerne stehen wir für Ihre Fragen zur Verfügung. Nutzen Sie einfach unser Kontaktformular.