This may seem confusing at first, but it's actually defined in the CSS 2.1 specification, specifically in clause 14.2 Background: if the background color is transparent and there is no background image for the html element (which is often the default), browsers will use the background properties of the body element instead. This means that the body background effectively becomes the html background if the html element doesn't have its own background specified - affecting only the background properties and not the actual height of the body element.
The reasoning behind this somewhat unusual rule isn't entirely clear, as it essentially creates a form of "reverse inheritance". Nevertheless, it is clearly outlined in the CSS 2.1 standard and consistently implemented by browsers.
As mentioned in other responses, to ensure your content has a background with a specific height, you can either set a background on the html element (so that the body background applies strictly to the body) or create a wrapper element within the body and set its height (as the special rule pertains solely to the body element).
Credit goes to Anne van Kesteren for directing attention to the CSS spec in response to inquiries raised in the WHATWG mailing list. It just goes to show that even those well-versed in CSS 2.1 can still learn something new! ☺