What are the fundamental differences between how a browser and a programming language makes a request?

I am trying to scrape one website that has some of the weirdest security I’ve ever seen.

Even when I’m sending a request with matching headers to the ones from the browser, a request that you simply can not distinguish from a browser it instead responds with some random array of bytes, when on browser it works just fine.

I’ve tried other browsers, even Postman worked with the right headers, but the request does not work on JS/Python/Golang.

Can anyone explain how in the hell can a website differentiate if I’m sending a request from the browser or a programming language. How is this possible? I’ve made a simple server just to see if there was ANY kind of difference between a python request and a browser request and was unsuccessful.