Tach!
So richtig durchdrungen habe ich das auch nicht, vor allem was „preflighted requests“ angeht, aber hier steht eine Menge zum Thema.
Mit dem Preflight Request fragt der Browser erstmal die Header der einzubindenden Ressource ab, um nach Access-Control-Allow-Origin und seinen Kumpanen Ausschau zu halten. Dann entscheidet er, ob er den eigentlichen Request startet oder auch nicht.
Ansonsten ist CORS eine "Du darfst mich (nicht) einbinden"-Geschichte. Man sollte sie verstanden haben, weil sonst die Browser nicht mitspielen, wenn die Header bei Cross-Origin-Zugriffen fehlen.
Beispiel:
Eine öffentliche API setzt keinen Access-Control-Allow-Origin: *
. Dann kann man zwar mit selbst (z.B. serverseitig) erzeugten Requests darauf zugreifen, weil man dabei ja diesen Header nicht zu beachten braucht. Die Daten werden (bei richtigem Request, also nicht dem Preflight) problemlos ausgeliefert. Setzt man allerdings im Browser einen XMLHttpRequest oder fetch() ab, muss der Header gesetz sein, sonst sagt der Browser: "Nein, das hol ich nicht oder geb dir keine Daten." Keine Daten zu geben ist der Fall, wenn man fetch() mit mode: 'no-cors'
losschickt. Da setzt er zwar den eigentlichen Request ab, behält aber die Daten für sich.
dedlfix.