yes, zip codes are best stored as strings since mathematical operations won't be used on the data...plus having it as a string will support non US postal codes that contain letters.
Depending on your usage, since zip codes are always 5 characters long, its sometimes better to use char(5) instead of varchar (or int for that matter) to save a little memory. (a byte or two saved per record may not seem alot, till you have 1 million records)
If you also have zip suffixes it is sometimes best to seperate them into a seperate column, but depending on your setup is not always the best option.