Wat is de Cross-Origin-Opener-Policy header en waarom is die belangrijk?
De Cross-Origin-Opener-Policy header, meestal geschreven als COOP, is een response header die bepaalt of je pagina een venstersamenhang deelt met pagina's van andere origins. Ingesteld op same-origin isoleert hij je document in een eigen browsing context group, zodat een pagina van een andere origin die de jouwe opent, of die jij opent, geen scriptbare verwijzing terug naar je venster kan behouden. Dit sluit een klasse van cross-origin aanvallen die bekendstaan als XS-Leaks en side-channel aanvallen, en het is bovendien de instelling die bepaalde krachtige browserfuncties ontgrendelt.
Waarom bestaat de Cross-Origin-Opener-Policy header?
COOP bestaat omdat het openen van een venster een verband creëert dat misbruikt kan worden. Wanneer de ene pagina de andere opent met window.open(), of een pagina de jouwe opent, kan de browser via de eigenschap window.opener een verwijzing tussen de twee vensters behouden. Als die twee pagina's van verschillende origins komen, wordt die verwijzing een route waarlangs een cross-origin pagina de jouwe kan aftasten.
De aanvallen die dit mogelijk maakt zijn subtiel. Ze stelen je gegevens niet rechtstreeks, maar leiden ze af via side channels, timing en gedeelde browserstatus, in een familie van technieken die de securitygemeenschap XS-Leaks noemt. Volgens de documentatie van Mozilla is COOP specifiek geïntroduceerd zodat een site kan garanderen dat zijn top-level document geen browsing context group deelt met cross-origin documenten, en dat is precies wat die verwijzing verbreekt en de route afsluit.
Wat doet de Cross-Origin-Opener-Policy header eigenlijk?
COOP bepaalt of je document en de pagina's waarmee het interacteert tot dezelfde browsing context group behoren, het interne browserbegrip dat bepaalt of twee vensters elkaar kunnen scripten. Als je hem strikt instelt, gaat je venster in een eigen groep en verliest elk cross-origin venster zijn verwijzing naar het jouwe.
De header kent een kleine set waarden. De standaardwaarde, unsafe-none, past geen isolatie toe en laat je document een browsing context group delen met cross-origin pagina's. De strikte waarde, same-origin, isoleert je document zo dat alleen same-origin pagina's die zelf ook same-origin instellen in dezelfde groep kunnen blijven. Een tussenwaarde, same-origin-allow-popups, behoudt die isolatie maar laat popups die je zelf opent gewoon functioneren, wat de praktische keuze is voor sites die afhankelijk zijn van popup-flows zoals betaling of single sign-on. Wanneer een cross-origin venster onder same-origin wordt geopend, wordt zijn window.opener null, zodat de verwijzing simpelweg niet bestaat.
Wat gebeurt er als je hem niet instelt?
Zonder COOP is de standaard unsafe-none, wat betekent dat er geen isolatie is en de vensterverwijzing openblijft. Een cross-origin pagina die de jouwe opent, of die jij opent, kan een greep op je venster behouden en die gebruiken als opstap voor de hierboven beschreven side-channel technieken.
Dit is een stil gat, geen luid gat. Niets op je site lijkt kapot, en de meeste bezoekers zullen het nooit veroorzaken, en juist daarom blijft het vaak onaangepakt. Maar voor een site die iets gevoeligs verwerkt, een login, een patiëntenportaal, een betaalstap, is het openlaten van de venstersamenhang een vermijdbare blootstelling, en het is er een die securityscanners en audits steeds vaker aanmerken als een ontbrekende header.
Hoe implementeer je de Cross-Origin-Opener-Policy header?
Je stelt COOP in als één HTTP response header. Voor de meeste sites is de juiste startwaarde Cross-Origin-Opener-Policy: same-origin-allow-popups, die je isolatie geeft terwijl popup-flows behouden blijven; een site zonder zulke afhankelijkheden kan naar de striktere same-origin. Hij kan worden toegevoegd op de webserver, in de applicatielaag, of aan de rand in een CDN of securitylaag die voor de site staat.
De enige sterke aanbeveling is: test voordat je afdwingt. COOP ondersteunt een report-only modus, verstuurd als Cross-Origin-Opener-Policy-Report-Only, die de browser Reporting API gebruikt om je te laten weten wat de policy zou breken zonder dat het daadwerkelijk breekt. Eerst report-only draaien, letten op popup- of vensterflows die geraakt zouden worden, en pas dan overschakelen naar de afgedwongen header is het veilige pad, zeker op een site met integraties van derden die je niet zelf gebouwd hebt.
Wat verandert er op je site zodra hij aanstaat?
Voor de meeste sites niets zichtbaars. Gewone paginaladingen, navigatie en same-origin gedrag blijven onaangetast, en de isolatie gebeurt onzichtbaar op browserniveau. De winst is dat cross-origin vensters geen verwijzing naar het jouwe meer kunnen behouden, wat het aanvalsoppervlak wegneemt zonder de gebruikerservaring te raken.
De plek om te controleren is elke flow die bewust een andere origin opent of erdoor geopend wordt. Een betaalprovider, een identity provider, of een ingebedde tool die via vensterverwijzingen communiceert kan geraakt worden door een strikte same-origin waarde, en dat is precies waarom same-origin-allow-popups bestaat en waarom testen in report-only ertoe doet. Er is ook een voordeel dat het weten waard is: same-origin instellen, samen met de verwante Cross-Origin-Embedder-Policy header, brengt je document in een cross-origin isolated staat die sommige krachtige browserfuncties vereisen, zoals SharedArrayBuffer en timers met hoge resolutie.
Wat moet je nu doen?
Begin met controleren of je site überhaupt een Cross-Origin-Opener-Policy header verstuurt, want de standaard van geen header betekent geen isolatie. Als hij ontbreekt, is het risicoarme pad om hem toe te voegen in report-only modus, te bevestigen dat er niets in je popup- of externe flows breekt, en dan same-origin-allow-popups af te dwingen als verstandige standaard, of same-origin als je site geen popup-afhankelijkheden heeft.
Wil je dit correct laten controleren en instellen over je hele site in plaats van stukje bij beetje, dan kan EuroraCloud je huidige security headers bekijken en je laten zien wat ons platform oplost. Bekijk wat EuroraCloud oplost
Conclusie: wat moet je onthouden over de Cross-Origin-Opener-Policy header?
COOP is een stille maar waardevolle header: hij isoleert je browservenster van cross-origin pagina's en sluit daarmee een klasse van side-channel en popup-aanvallen die geen zichtbaar spoor achterlaten totdat een scanner of een aanvaller ze vindt. Voor de meeste sites is de veilige route om te testen in report-only modus en daarna same-origin-allow-popups af te dwingen, wat het venster beschermt terwijl legitieme popup-flows behouden blijven. De nuttigste stap is controleren of je site de header vandaag verstuurt, want zolang dat niet zo is, is de standaard helemaal geen isolatie.