Краткий ответ: ни один. В большинстве случаев вы действительно хотите использовать код 303 .
Для длинного ответа, сначала нам нужен фон.
При получении кода перенаправления клиент может (A) загрузить новое местоположение, используя тот же тип запроса, или (B) он может перезаписать его и использовать GET.
Спецификация HTTP 1.0 не имела 303 и 307, она имела только 302, что предписывало поведение (A). Но на практике выяснилось, что (A) приводит к проблеме с отправленными формами.
Скажем, у вас есть контактная форма, посетитель заполняет ее и отправляет, а клиент получает 302 на страницу со словами «спасибо, мы свяжемся с вами». Форма была отправлена с использованием POST, поэтому страница благодарности также загружается с использованием POST. Теперь предположим, что посетитель перезагружается; запрос повторно отправляется так же, как он был получен в первый раз, то есть с POST (и той же полезной нагрузкой в теле). Конечный результат: форма отправляется дважды (и еще раз для каждой перезагрузки). Даже если клиент запрашивает у пользователя подтверждение перед тем, как сделать это, в большинстве случаев это все равно раздражает.
Эта проблема стала настолько распространенной, что производители клиентов решили переопределить спецификацию и выполнить запросы GET для перенаправленного местоположения. По сути, это был недосмотр в спецификации HTTP 1.0. Больше всего клиенты нуждались в 303 (и поведении (B) выше), но вместо этого они получали только 302 (и (A)).
Если бы HTTP 1.0 предлагал и 302, и 303, проблем бы не было. Но это не так, так что это привело к 302, который никто не использовал правильно. Так, HTTP 1.1 добавил 303 (крайне необходимо), но также решил добавить 307, что технически идентично 302, но является своего рода «явным 302»; он говорит: «Да, я знаю проблемы, связанные с 302, я знаю, что я делаю, дай мне поведение (А)».
Теперь вернемся к нашему вопросу. Теперь вы понимаете, почему в большинстве случаев вам нужно 303 .
Случаи, когда вы хотите сохранить тип запроса, очень редки. И если вы обнаружите, что у вас такой случай, ответ прост: используйте 302. Либо клиент говорит HTTP 1.0, и в этом случае он не может понять 307; или он говорит HTTP 1.1, что означает, что у него нет причин сохранять бунтарское поведение старых клиентов, т.е. он правильно реализует 302, так что используйте его!