Don't think of hazard as a density function. It is an arrival rate, a probability per unit time.
I always think of hazard in terms of a conditional probability tree.
I think of the hazard as the expected number of events in a unit of time, and it has a Poisson distribution.
Double the time, the expected number of events doubles.
Halve the time, the expected number of events halves.
If I make the time step small enough, the expected number of events is either 0 (survival) or 1 (death). If it is 0, the coin gets to flip again.

Here, if the time is in discrete days, on each day there is a 0.1 chance of death, and a 0.9 chance of surviving until tomorrow. That's a hazard of 0.1 death per day.
The probability of surviving to time $t$ is $0.9^t$, obviously, or $(1 - 0.1)^t$, obviously.
Rather than multiplying everything, you can add their logs, and the log of 1-P is just -P, if P is small enough. You can make it small enough by shortening the intervals.
If you cut the time steps in half, you also cut the probability of death in half, so the tree gets smoother but keeps about the same shape.
In the limit it is $exp{(-h t)}$.
Of course, the total probability of dying at that time is the probability of surviving to that time, multiplied by the local probability of dying at that time, which is now $P(death) * deltaTime$, or $h$, which is now a density, as you can see, or $h*exp(-h t)$.
Notice that hazard $h$ does not have to be constant over time. You can replace $h t$ by its time-integral, and you still get a correct survival function.
Thinking of it as a conditional probability tree makes it really easy (for me) to understand things like right-censoring, interval-censoring, etc.