Zauważ, że div-owi header nadajesz również ujemny margines i dlatego nie ma odstępu od góry. Trzeba zresetować ustawienia marginesów zewnętrznych i wewnętrznych dla elementu body, bo standardowo mają one jakąś tam wartość (chyba 8px).
body {
margin: 0;
padding: 0;
}
Niektóre inne elementy też posiadają ustalone domyślne wartości dla marginesów zewnętrznych i wewnętrznych.
edit:
Właściwie wystarczyłoby
body {
margin: 0;
}
w tym wypadku.