materials for refuting pawn storms
"Refuting" pawn storms is part of chess strategy. Whenever a pawn is pushed, it doesn't control the squares it did before and it leaves holes/weak squares behind it. So #3's suggestion with Nimzovich is a classic, I like the more modern How to reassess your chess by Silman better. But in general, you'll learn how to exploit weak squares and how to fight for certain squares using your own pawns.
It's probably worth mentioning that sometimes attacks are justified by the position itself.
For example if you mentally divide the board into two sides (queenside and kingside) and see that your opponent has:
1) More non-pawns on the kingside
2) The main pawn chain affords them more space on the kingside
Then objectively speaking there is no way to defend your kingside.
But think about it logically, if your opponent has more non-pawns than you on the kingside, it means you probably have a similar advantage on the queenside (or center).
The classic way to meet a flank attack is by opening the center... and if that's not possible then attacking on the opposite side. This is important because as I pointed out in the beginning direct defense is sometimes impossible.
You should set up and push for these counter-actions before their attack is in full swing. Luckily such attacks take a while to build up while center action is faster (usually).