Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

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

Was ist CORS?

In der Wikipedia ließt man fol­gende Erklärung: "Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, um Webbrowsern oder auch ande­ren Webclients Cross-Origin-Requests zu ermög­li­chen.[1] Zugriffe die­ser Art sind nor­ma­ler­weise durch die Same-Origin-Policy (SOP) unter­sagt. CORS ist ein Kompromiss zuguns­ten grö­ße­rer Flexibilität im Internet unter Berücksichtigung mög­lichst hoher Sicherheitsmaßnahmen."

CORS ist also eine Möglichkeit, um im Web Client über Domain-Grenzen hin­weg ver­schie­dene Web-Applikationen in einer gemein­sa­men Oberfläche zu kom­bi­nie­ren. Dabei kann man auf das Tunneln der Kommunikation über spe­zi­elle Proxies ver­zich­ten und es besteht keine  Notwendigkeit für dedi­zierte Web Services, z.B. auf Basis von JSONP.

Der Mechanismus CORS wird bereits seit 2004 dis­ku­tiert und befin­det sich beim W3C aktu­ell im Status "Recommendation" (als Stable). Mit den aktu­el­le­ren Browser-Versionen wird CORS bereits durch­gän­gig unter­stützt, womit der Einsatz nun auch für die breite Masse in greif­bare Nähe rückt. Der aktu­elle Browser-Support kann auf Can I Use nach­ge­schla­gen werden.

Da wir uns häu­fig in unse­ren Projekten mit Integrationsszenarien aus­ein­an­der­set­zen, war damit für uns der Zeitpunkt gekom­men, in die­ses Thema tie­fer ein­zu­stei­gen. Wir ver­mu­te­ten  hier gro­ßes Potential, wel­ches hilft, die Umsetzung von Integrationsprojekten zu vereinfachen.

Grundkonzept

Grundkonzept bei CORS ist es, dass der Server, wel­cher die Daten bereit­stellt, bestimmte HTTP-Header mit­schickt, wel­che dem Browser signa­li­sie­ren, 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 infor­miert sich über die "Allow"-Header. Wenn die Header zu der Anfrage pas­sen, dann wird der Request ohne Weiteres ausgeführt.

Vorteile

Im direk­ten Vergleich zum JSONP-Ansatz erge­ben sich einige Vorteile:

  • Einfachere Implementierung, da bereits vor­han­de­nen Web-APIs (z.B. REST) direkt genutzt wer­den können
  • Nutzung belie­bi­ger HTTP Methoden (z.B. POST, PUT, DELETE)
  • Besseres Caching
  • Besseres Error Handling

Nachteile

Nachteil ist aktu­ell noch, dass ältere Browser CORS nicht kom­plett unter­stüt­zen, so ist beim Internet Explorer min­des­tens Version 8 die Voraussetzung, wobei der Private Tab im IE8 und IE9 auch noch zu Fehlern führt. Außerdem müs­sen IE8 und IE9 mit der xdo­main­re­quest Bibliothek nach­ge­rüs­tet wer­den, um über­haupt mit­spie­len zu können.

Zusätzlich könnte man als Nachteil noch eine gewisse Abhängigkeit von der Infrastruktur auf­füh­ren, da in jedem Fall sicher­ge­stellt wer­den muss, dass die benö­tig­ten HTTP-Header gesetzt bzw. wei­ter­ge­reicht 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 authen­ti­fi­zierte Requests über CORS durch­ge­führt wer­den sol­len, dann ist wich­tig, dass withCredentials: true in den xhrFields gesetzt wird, da sonst keine Cookie-Informationen mit über­ge­ben wer­den. Für jQuery würde das fol­gen­der­ma­ß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 erfolg­reich in allen aktu­el­len Desktop-Browsern und Mobil-Browsern aus­pro­biert haben und schon viel­ver­spre­chende Ergebnisse erzie­len konn­ten, sind wir zuver­sicht­lich, dass sich die­ser Mechanismus in Zukunft in zahl­rei­chen Umsetzungen wie­der­fin­den wird.

9. Oktober 2014

Hi,

wie akti­viere ich also dies in mei­nem Apache web­ser­ver unter httpd.conf

Hallo Ut,

im Prinzip akti­vie­ren Sie dies genau so wie das bereits oben im Text beschrie­ben ist. Achten Sie aller­dings dar­auf, bei der Anweisung
Header set Access-Control-Allow-Origin "https://www.myserver.com"
die URL des Servers ein­zu­tra­gen, den Sie erlau­ben möchten.

Weitere Details zum Einrichten von CORS für Apache httpd fin­den Sie auch unter https://enable-cors.org/server_apache.html. Dort wird aller­dings mit einem Wildcard anstelle eines kon­kre­ten Servernamens gearbeitet.
Weitere Details zu CORS selbst fin­den Sie im Mozilla Developer Network.

Ich hoffe ich konnte Ihnen mit die­ser Information weiterhelfen.

Viele Grüße,
Tino

Hallo,
ich habe in mei­ner HTACCESS Folgendes hinterlegt:

Header set X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options: "nos­niff"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Referrer-Policy "no-referrer"

Sollte ich das fol­gende auch noch ergän­zen oder müsste die­ses anders lauten?
Header set Access-Control-Allow-Origin "*"

Danke schon mal für deine Hilfe!

Hallo Isabell,

das kommt ganz dar­auf an, was du mit dei­ner Konfiguration errei­chen möch­test. Wenn du CORS für alle Quellen akti­vie­ren möch­test, dann ist die Zeile
Header set Access-Control-Allow-Origin "*"
kor­rekt. Beachte dabei aber, dass die im Artikel beschrie­be­nen authen­ti­fi­zier­ten Requests mit die­ser Konfiguration nicht funk­tio­nie­ren. Wenn du diese benö­tigst, musst du kon­kret die Quell-URL ange­ben, für die du CORS akti­vie­ren möch­test. Also z.B.
Header set Access-Control-Allow-Origin "https://www.myserver.com"

Eine sehr gute Dokumentation zu CORS und den vie­len Konfigurationsmöglichkeiten fin­dest du im Mozilla Developer Network.

Ich hoffe ich konnte dir mit die­ser Information helfen.

Viele Grüße,
Tino

Comments are closed.

Pin It on Pinterest