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.
Hi,
wie aktiviere ich also dies in meinem Apache webserver unter httpd.conf
Hallo Ut,
im Prinzip aktivieren Sie dies genau so wie das bereits oben im Text beschrieben ist. Achten Sie allerdings darauf, bei der Anweisung
Header set Access-Control-Allow-Origin "https://www.myserver.com"
die URL des Servers einzutragen, den Sie erlauben möchten.
Weitere Details zum Einrichten von CORS für Apache httpd finden Sie auch unter https://enable-cors.org/server_apache.html. Dort wird allerdings mit einem Wildcard anstelle eines konkreten Servernamens gearbeitet.
Weitere Details zu CORS selbst finden Sie im Mozilla Developer Network.
Ich hoffe ich konnte Ihnen mit dieser Information weiterhelfen.
Viele Grüße,
Tino
Hallo,
ich habe in meiner HTACCESS Folgendes hinterlegt:
Header set X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options: "nosniff"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Referrer-Policy "no-referrer"
Sollte ich das folgende auch noch ergänzen oder müsste dieses anders lauten?
Header set Access-Control-Allow-Origin "*"
Danke schon mal für deine Hilfe!
Hallo Isabell,
das kommt ganz darauf an, was du mit deiner Konfiguration erreichen möchtest. Wenn du CORS für alle Quellen aktivieren möchtest, dann ist die Zeile
Header set Access-Control-Allow-Origin "*"
korrekt. Beachte dabei aber, dass die im Artikel beschriebenen authentifizierten Requests mit dieser Konfiguration nicht funktionieren. Wenn du diese benötigst, musst du konkret die Quell-URL angeben, für die du CORS aktivieren möchtest. Also z.B.
Header set Access-Control-Allow-Origin "https://www.myserver.com"
Eine sehr gute Dokumentation zu CORS und den vielen Konfigurationsmöglichkeiten findest du im Mozilla Developer Network.
Ich hoffe ich konnte dir mit dieser Information helfen.
Viele Grüße,
Tino