Expand description
The browser rules (kernel spec §3.3): what every browser route checks before its handler, cookie or not.
- State-changing methods (every method but
GETandHEAD):Originmust bepublic_url’s, and a missingOriginis refused. Before setup there is nopublic_url, so they are refused outright. The body must be JSON: aContent-Typeother thanapplication/jsonis refused, and so is a body without one. A body-less request (park, logout, revoke) needs noContent-Type. GETandHEAD: browsers send noOriginon a same-originGET, soSec-Fetch-Siteis checked instead:same-originornone, or absent (a client that is not a browser, or one too old to send it; theSameSite=Strictcookie still keeps cross-site requests out). A presentOriginmust match.
No GET or HEAD route changes state; one that must is a POST.
Accepting a missing Sec-Fetch-Site relies on this.
Host enrollment, the host WebSocket and setup are not browser routes in this sense and sit outside this layer (setup has its own rule).