Veröffentlicht am 5. November 2018
Die Same-Origin-Richtlinie des Browsers verhindert, dass Ressourcen aus einer anderen Quelle gelesen werden. Dieser Mechanismus verhindert, dass schädliche Websites die Daten anderer Websites lesen, aber er verhindert auch legitime Verwendungen.
Moderne Webanwendungen möchten häufig Ressourcen aus einer anderen Quelle abrufen, z.
B. JSON-Daten aus einer anderen Domain oder Bilder von
einer anderen Website in ein <canvas> Element laden. Dabei kann es sich um öffentliche Ressourcen handeln, die für jeden lesbar sein sollten. Die Same-Origin-Richtlinie verhindert jedoch ihre Verwendung. Entwickler haben in der Vergangenheit Problemumgehungen wie
JSONP verwendet.
Cross-Origin Resource Sharing (CORS) behebt dieses Problem auf standardisierte Weise. Wenn Sie CORS aktivieren, kann der Server dem Browser mitteilen, dass er eine zusätzliche Quelle verwenden kann.
Wie funktioniert eine Ressourcenanfrage im Web?
Ein Browser und ein Server können über das Netzwerk Daten austauschen, indem sie das Hypertext Transfer Protocol (HTTP) verwenden. HTTP definiert die Kommunikationsregeln zwischen dem Anfragenden und dem Antwortenden, einschließlich der Informationen, die zum Abrufen einer Ressource erforderlich sind.
Der HTTP-Header verhandelt den Nachrichtenaustausch zwischen dem Client und dem Server und wird verwendet, um den Zugriff zu bestimmen. Sowohl die Anfrage des Browsers als auch die Antwortnachricht des Servers sind in einen Header und einen Text unterteilt.
Header
Informationen zur Nachricht, z. B. der Nachrichtentyp oder die Codierung der Nachricht. Ein Header kann eine Vielzahl von Informationen enthalten, die als Schlüssel/Wert-Paare ausgedrückt werden. Der Anfrageheader und der Antwortheader enthalten unterschiedliche Informationen.
Beispiel für einen Anfrageheader
Accept: text/html
Cookie: Version=1
Dieser Header entspricht der Aussage: „Ich möchte HTML als Antwort erhalten. Hier ist ein Cookie, das ich habe.“
Beispiel für einen Antwortheader
Content-Encoding: gzip
Cache-Control: no-store
Dieser Header entspricht der Aussage: „Die Daten in dieser Antwort sind mit gzip codiert. Speichern Sie sie nicht im Cache.“
Text
Die Nachricht selbst. Dies kann Nur-Text, ein binäres Bild, JSON, HTML oder viele andere Formate sein.
Wie funktioniert CORS?
Die Same-Origin-Richtlinie weist den Browser an, Anfragen für Ressourcen unterschiedlicher Herkunft zu blockieren. Wenn Sie eine öffentliche Ressource aus einer anderen Quelle benötigen, teilt der Server, der die Ressource bereitstellt, dem Browser mit, dass die Quelle, die die Anfrage sendet, auf die Ressource zugreifen kann. Der Browser merkt sich das und erlaubt Cross-Origin Resource Sharing für diese Ressource.
Schritt 1: Clientanfrage (Browser)
Wenn der Browser eine ursprungsübergreifende Anfrage stellt, fügt der Browser einen Origin-Header mit dem aktuellen Ursprung (Schema, Host und Port) hinzu.
Schritt 2: Serverantwort
Wenn ein Server diesen Header sieht und den Zugriff zulassen möchte, fügt er der Antwort einen Access-Control-Allow-Origin-Header hinzu, in dem die anfragende Quelle angegeben wird (oder *, um jede Quelle zuzulassen).
Schritt 3: Browser empfängt Antwort
Wenn der Browser diese Antwort mit einem entsprechenden Access-Control-Allow-Origin-Header sieht, gibt er die Antwortdaten an die Clientwebsite weiter.
Anmeldedaten mit CORS freigeben
Aus Datenschutzgründen wird CORS normalerweise für anonyme Anfragen verwendet, bei denen der Anfragende nicht identifiziert wird. Wenn Sie bei der Verwendung von CORS Cookies senden möchten, mit denen der Absender identifiziert werden kann, müssen Sie der Anfrage und der Antwort zusätzliche Header hinzufügen.
Anfrage
Fügen Sie credentials: 'include' den Fetch-Optionen hinzu, wie im folgenden Beispiel gezeigt.
Dadurch wird das Cookie wie folgt in die Anfrage aufgenommen:
fetch('https://example.com', {
mode: 'cors',
credentials: 'include'
})
Antwort
Access-Control-Allow-Origin muss auf eine bestimmte Quelle festgelegt werden (kein Platzhalter mit *) und Access-Control-Allow-Credentials muss auf true gesetzt werden.
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Preflight-Anfragen für komplexe HTTP-Aufrufe
Wenn eine Webanwendung eine komplexe HTTP-Anfrage stellt, fügt der Browser am Anfang der Anfragenkette eine Preflight-Anfrage hinzu.
In der CORS-Spezifikation wird eine komplexe Anfrage wie folgt definiert:
- Eine Anfrage, die andere Methoden als GET, POST oder HEAD verwendet.
- Eine Anfrage, die andere Header als
Accept,Accept-LanguageoderContent-Languageenthält. - Eine Anfrage mit einem anderen
Content-Type-Header alsapplication/x-www-form-urlencoded,multipart/form-dataodertext/plain.
Browser erstellen automatisch alle erforderlichen Preflight-Anfragen und senden sie vor der eigentlichen Anfragenachricht. Die Preflight-Anfrage ist eine OPTIONS-Anfrage wie im folgenden Beispiel:
OPTIONS /data HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: DELETE
Auf der Serverseite antwortet die Anwendung, die die Anfrage empfängt, auf die Preflight-Anfrage mit Informationen zu den Methoden, die die Anwendung von dieser Quelle akzeptiert:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS
Die Serverantwort kann auch einen Access-Control-Max-Age-Header enthalten, um die Dauer in Sekunden anzugeben, für die Preflight-Ergebnisse im Cache gespeichert werden sollen. So kann der Client mehrere komplexe Anfragen senden, ohne die Preflight-Anfrage wiederholen zu müssen.