Zum Inhalt springen
Deutsch

CORS

CORS ist eine Route-Direktive, keine gewöhnliche Middleware — ein Preflight-OPTIONS-Request passt nie auf eine methoden-spezifische Route, eine Middleware würde dafür also nie laufen. cors(options, child) ist eine eigene Direktive, die der Compiler expandiert: sie dekoriert die echten Responses mit den CORS-Headern und synthetisiert für jedes Pattern in child eine OPTIONS-Preflight-Route.

import { cors, CorsOptions, concat, get, path, post } from 'actor-ts/http';
const corsOptions = CorsOptions.create()
.withOrigins('https://app.example', 'https://admin.example')
.withCredentials();
const routes = cors(corsOptions, path('api', concat(
get(listHandler),
post(createHandler),
)));

Der Compiler fügt OPTIONS /api automatisch hinzu; ein Browser-Preflight erhält 204 mit den Access-Control-Allow-*-Headern, und die eigentlichen GET/POST-Responses erhalten Access-Control-Allow-Origin + Vary: Origin.

Builder-MethodeFeldZweck
withOrigins(...o)originsExakte Allowlist.
withAnyOrigin()originsJeden Origin erlauben (*). Muss explizit sein.
withOriginPredicate(predicate)originsPro Request entscheiden; ein werfendes Prädikat verweigert.
withMethods(...m)methodsAccess-Control-Allow-Methods. Default: die am Pattern registrierten Methoden.
withAllowedHeaders(...h)allowedHeadersDefault: die (sanitisierten) Request-Header echoen.
withExposedHeaders(...h)exposedHeadersAccess-Control-Expose-Headers.
withCredentials(flag?)credentialsAccess-Control-Allow-Credentials: true.
withMaxAge(seconds)maxAgePreflight-Cache-Dauer.

Access-Control-Allow-Origin echot den Request-Origin (das literale * wird nur bei withAnyOrigin() ohne Credentials gesendet), und Vary: Origin wird ergänzt, sobald der Origin geechot wird, damit Caches nicht falsch ausliefern.

  • Security-Header — die begleitenden Response-Header.
  • CSRF — Schutz vor Cross-Site Request Forgery.
  • Sicherheit — der empfohlene Stack + Reihenfolge.