Cross-Origin Resource Sharing (CORS)
Stel, je bouwt een front-end in React die data ophaalt van een externe API. Alles werkt lokaal, maar zodra je het online zet, krijg je een foutmelding: “Blocked by CORS policy”. Grote kans dat je te maken hebt met Cross-Origin Resource Sharing: een beveiligingsmechanisme dat voorkomt dat een website ongecontroleerd data opvraagt van een andere website of server.
Inhoudsopgave
Je browser gedraagt zich als portier
Het internet is gebouwd op vertrouwen, maar dat vertrouwen heeft grenzen. Zonder beperkingen zou elke willekeurige website jouw data kunnen opvragen bij bijvoorbeeld je bank of je e-mailprovider. Om dat tegen te gaan, hebben browsers het same-origin policy ingevoerd: een webpagina mag alleen communiceren met bronnen van hetzelfde domein.
Maar… in de praktijk willen we juist vaak communiceren met andere domeinen, bijvoorbeeld een front-end op domein A die data ophaalt van een API op domein B. Dat is precies waar CORS om de hoek komt kijken.
Wat gebeurt er achter de schermen?
Als je browser een cross-origin verzoek doet, kijkt de server waar het verzoek naartoe gaat of dat is toegestaan. Dat doet hij via de CORS-header Access-Control-Allow-Origin. Staat daar jouw domein tussen? Dan wordt de data netjes doorgestuurd. Staat het er niet tussen? Dan wordt het verzoek geblokkeerd.
Voor simpele GET-verzoeken werkt dit vrij soepel. Maar bij bijvoorbeeld POST-verzoeken of custom headers voert de browser eerst een “preflight request” uit: een soort test om te checken of het verzoek is toegestaan. Pas bij goedkeuring volgt het echte verzoek.
Help! Mijn API mag er niet in
CORS-fouten zijn een klassieker bij webdevelopment. Je code is goed, je API werkt, maar de browser houdt je tegen. De oplossing ligt meestal bij de server: die moet expliciet toestaan dat jouw domein verzoeken mag doen. Dat kan door:
- Een wildcard (*) toe te staan (alleen veilig bij publieke data)
- Specifieke domeinen whitelisten via Access-Control-Allow-Origin
- CORS correct configureren in frameworks zoals Express.js, Laravel of Django
Let op: voor gevoelige data is het belangrijk om alleen vertrouwde domeinen toegang te geven.
Veelgestelde vragen
Origin verwijst naar het protocol, domein en poort van de website. Dus https://example.com:443 is een andere origin dan http://example.com of https://api.example.com.
Omdat localhost vaak als “andere origin” wordt gezien. Je kunt dit tijdelijk oplossen via proxy-instellingen of CORS-configuratie op de server.
Niet echt. Browsers zijn streng. Je kunt CORS alleen ‘omzeilen’ door de server anders in te stellen, of tijdelijk met tools zoals een proxy of browserplugin.
Nee. Een firewall blokkeert verkeer op netwerk- of serverniveau. CORS is puur een browsermechanisme dat bepaalt wat er in de front-end mag gebeuren.
Gerelateerde begrippen
- Ad exchange
- Barter
- Big O Notation
- Breadcrumbs
- Business-to-Business
- ChatGPT
- Cloud computing
- Contentkalender
- Cross-Site Request Forgery
- Data pipelines
- Golden Circle
- Huisstijl
- Linkstructuur
- Merge
- Micro-interactions
- reCAPTCHA
- Repository
- SSL-certificaat
- User Interface
- User journey
- VPN
- Web Content Accessibility Guidelines
- Web3-websites
- Webbrowser