Es una duda clásica. La forma fácil de recordarlo es:
undefined: Es el valor que tiene una variable que ha sido declarada pero a la que todavía no se le ha asignado un valor. Es el estado "por defecto".null: Es un valor que tú, como programador, asignas intencionadamente para indicar que una variable no tiene valor. Es una ausencia de valor explícita.
En resumen: la máquina te da undefined, tú pones null.