Это из раздяда, "хотите фокус покажу?"
Уберите
height: 100%;
у .header, все будет хорошо.
Почему так происходит:
С шириной браузеру всё более или менее понятно.
А вот высота зависит от контента.
Вы дочернему элементу говорите "стань высотой в 100% родителя", а родителю говорите "растянись по высоте дочернего". Браузер не понимает что же ему делать и что от чего считать.
Т.е. высоту дочернего можно указать в %, если у родителя есть указанная в явном виде высота (не важно в каких единицах измерения).
Можно для html указать высоту в % и они будут считаться от высоты вьюпорта (а её браузер знает, она четкая и понятная) и дальше передавать ее дочерним.
С флексами все проще. Для них по умолчанию align-items stretch, т.е. элементы растягиваются вдоль поперечной оси (по вертикали если главная ось идет по горизонтали (row)).
Если перестать указывать флек-элементам высоту, то они растянутся на всю высоту строки. У вас строка одна, значит на всю высоту родителя для которого у вас указана минимальная высота.
p.s. не вполне понятно, какую задачу вы пытаетесь решить, поставив рядом header и main.
Вообще, думаю, что вам нужны гриды и вот это
Footer не опускается вниз страницы. Появляется скролл. Как это исправить?