HMAC checks a message wasn't altered, using a shared key. HKDF turns one secret into several independent keys.
The idea: HMAC hashes the message together with the secret key, in two nested passes. Without the key, the result looks like random noise, so nobody can produce a valid tag for a changed message. HKDF uses the same construction as a key mixer: feed it one shared secret and different labels ("client key", "server key") and get independent keys for each job.
Why it matters: Inside TLS, Signal and many other protocols.
HMAC authenticates messages using a hash and a secret key[1, 2]. HKDF derives several independent keys from one shared secret[3, 4]. Both are used in TLS 1.3, Signal and HPKE.
Security relies on the hash's internal compression function behaving like a pseudorandom function, not on collision resistance[5], which is why HMAC-MD5 and HMAC-SHA1 were never practically broken.
If any of these breaks, this breaks too.
If this breaks, these break with it.
Nothing on the map depends on it: it is an end point, something people use directly.