Im Sinne der Same-Origin-Policy bestehen bei einer Serververbindung die Angaben zur Herkunft aus drei Elementen: Host, Port und Protokoll. Die Richtlinie verbietet demnach, dass im obigen Beispiel „https://example.com“ auf „http://example.com“ oder auf „https://example.org“ zugreift. Im ersten Fall ist das Protokoll nicht das gleiche, im zweiten sind die beiden Host-Angaben nicht identisch.
Bei einem Cross-Origin-Request handelt es sich im Prinzip um einen HTTP-Request. Bestimmte Methoden stellen grundsätzlich keine Probleme dar. GET und HEAD können Daten nicht ändern und werden deshalb in der Regel nicht als Sicherheitsrisiko wahrgenommen. Anders sieht es bei PATCH, PUT oder DELETE aus: Hiermit ist es möglich, schädliche Eingriffe vorzunehmen. Deshalb muss hierfür auch Cross-Origin Resource Sharing aktiviert werden. Demnach kann CORS nicht nur Informationen zum erlaubten Ursprung beinhalten, sondern auch darüber, welche HTTP-Requests durch die Quelle erlaubt sind.
Handelt es sich um sicherheitsrelevante HTTP-Methoden, sendet der Client zunächst eine Preflight-Anfrage. In dieser gibt man eigentlich nur an, welche HTTP-Methode man als nächstes an den Server richten wird und erfragt, ob die Anfrage als sicher gewertet wird. Dafür verwendet man den OPTIONS-Header. Erst nach einer positiven Rückantwort kann dann die eigentliche Anfrage gestellt werden.
Es gibt verschiedene CORS-Header, die sich jeweils mit unterschiedlichen Aspekten auseinandersetzen. Genannt wurden schon die beiden wichtigen Header zur Bestimmung von sicheren Ursprüngen und erlaubten Methoden. Aber es gibt noch weitere:
- Access-Control-Allow-Origin: Welche Herkunft ist erlaubt?
- Access-Control-Allow-Credentials: Sind Anfragen auch dann erlaubt, wenn der Credentials Mode auf include gesetzt ist?
- Access-Control-Allow-Headers: Welche Header dürfen verwendet werden?
- Access-Control-Allow-Methods: Welche HTTP-Request-Methoden sind erlaubt?
- Access-Control-Expose-Headers: Welche Header dürfen angezeigt werden?
- Access-Control-Max-Age: Wie alt darf die Preflight-Anfrage sein, bevor sie ihre Gültigkeit verliert?
- Access-Control-Request-Headers: Welcher HTTP-Header ist in der Preflight-Anfrage angegeben?
- Access-Control-Request-Method: Welcher HTTP-Methode ist in der Preflight-Anfrage angegeben?
- Origin: Was ist die Quelle der Anfrage?
Der besondere Fokus liegt auf dem ersten Header. Dort spezifiziert der Server, welcher andere Host auf ihn zugreifen darf. Neben einer konkreten Adresse kann man dort auch eine Wildcard in Form eines Asterisks angeben. Damit erlaubt der Server Cross-Origin-Requests von jeglichen Quellen.