We have found no secure way to support cross-origin HTTP requests without some form of mutual opt-in. Lots of things could be "secure enough" for many sites, but there's no end to sites running code making really old assumptions about what a web page can do. In particular, the browser can't know when a URL request is public or not until it gets the answer, at which point it could be too late and some kind of CSRF has just happened. Cookies are an obvious clue that the request might be part of a stateful transaction, but the absence of cookies doesn't mean it's not: the authorization might be buried in the URL itself or in some added headers. New features shouldn't create security problems for old sites. It's not fair to the authors of those sites and it's dangerous for the users of those sites. It's frustrating to everyone because there are sites where "obviously" it would be safe and beneficial to allow use of the data. The problem is it's not obvious to the browser, which has no brain that can distinguish safe sites from problematic ones.
CORS is not getting in your way of communicating; CORS is allowing a whole lot of communication that was never possible before CORS was invented.
Most of these restrictions are because browsers don't know what the user wants or expects. Instead of the two origins mutually opting in through CORS you could imagine a user setting for "I trust
prettycharts.com to talk to
censusdata.org on my behalf" and then allowing any connection at all. We haven't figured out a way to expose that to users that they'd understand, and we're afraid of the annoyance and abuse we'd unleash if we allowed sites to request it (if you thought constant geolocation requests were bad...). But Web Extensions, that users explicitly install, can make these kinds of unfettered requests, bounded by the permissions the user granted.
-Dan Veditz