what does extract column header node do?
The first port will contain a table with the column names in the row (and possibly generated column names for the table). The second table uses the same column names that was probably selected for new column names (kind of anonimizing the content, removing information from the header).
there are situations where you want to "generalize" the header names for certain workflows (e.g. in loops, but also others) where it's not practical or possible to use you header names. But once you are done you want to use the preserved names and write them back. I think there is an example workflow in the public community examples.