Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, der es Webanwendungen erlaubt, Ressourcen von verschiedenen Quellen im Internet abzurufen, auch wenn diese Quellen von verschiedenen Domains stammen. CORS ist eine wichtige Technologie für die Sicherheit von Webanwendungen und kann dazu beitragen, Angriffe wie Cross-Site Scripting (XSS) und Cross-Site Request Forgery (CSRF) zu verhindern.
Kurz gesagt steuern Sie hierdurch, von welchen Quellen auf APIs oder Schnittstellen, welche unter einer anderen Domain ausgeführt werden zugegriffen werden darf. Relevant sind hierbei erst einmal folgende Einstellungen:
- Access-Control-Allow-Methods => welche Methoden (GET, POST etc.) sollen erlaubt werden
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods
- Access-Control-Allow-Origin => von welchen Domains aus darf auf die "externe" Schnittstelle zugegriffen werden
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
- Access-Control-Allow-Headers => welche Header dürfen bei der Request übermittelt werden (optional)
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
Zudem müssen CORS-Preflight Requests erlaubt werden. Hier führt der Browser entsprechende OPTIONS Requests durch, um im Vorfeld zu prüfen ob die API korrekt konfiguriert ist und der Zugriff gestattet wird. Hier muss als Status-Code auch ein HTTP 200 zurückgegeben werden.
Im Beispiel wird hier von Zugriffen auf https://testen.de ausgegangen, welche eine externe API ( https://api.example.com ) einbindet. Im Beispiel wird zudem ein Content-Type Header übermittelt.
Im Startverzeichnis der api.example.com muss hier eine .htaccess Datei angelegt oder ergänzt werden. Diese kann (bitte die Kommentare entsprechend beachten) wie folgt aufgebaut werden:
# Hier müssen die nötigen HTTP Methodes angegeben werden. OPTIONS muss hier *immer* enthalten sein, weitere verfügbare Methoden finden sich unter:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
# Diese sollten nach Bedarf gewählt werden
header always set Access-Control-Allow-Methods OPTIONS,GET,POST,PUT
# Hier muss die Domain angegeben werden, von welcher zugegriffen wird. Mehrere Domains können hier durch Komma separiert hinterlegt werden
header always set Access-Control-Allow-Origin https://testen.de
# OPTIONAL Freischalten der benötigten zusätzlichen HTTP Header
header always set Access-Control-Allow-Headers Content-Type
# Der entsprechende HTTP Status-Code soll nur bei Preflight Requests ausgeliefert werden (OPTIONS), für normale Zugriffe ist dies nicht nötig
<If "%{REQUEST_METHOD} == 'OPTIONS'">
# HTTP Status Code auf 200 ändern (erfolgreich)
RewriteRule ^ - [R=200,L]
</If>
Im Anschluss kann ohne weiteres innerhalb der Anwendung ( https://testen.de ) per CORS auf die Schnittstelle unter https://api.example.com zugegriffen werden.