Правильный код статуса http для ресурса, требующего авторизации

Похоже, существует много путаницы относительно правильного кода статуса http, который должен возвращаться, если пользователь пытается получить доступ к странице, которая требует от пользователя входа в систему.

Итак, какой код состояния будет отправлен, когда я покажу страницу входа?

Я почти уверен, что нам нужно использовать код состояния в диапазоне 4xx.

Я не говорю здесь о HTTP-аутентификации, поэтому по крайней мере один код состояния мы использовать не будем (401 Unauthorized).

Итак, что мы должны использовать? Ответы (также здесь на SO), кажется, разнятся:

Согласно ответу здесь мы должны использовать 403 Forbidden.

Но в описании кода статуса есть:

Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться.

Что ж, похоже, что это не то, что нужно. Поскольку авторизация ДОЛЖНА помочь.

Так что давайте посмотрим другой ответ. Ответ здесь даже не использует диапазон 4xx, а использует 302 Found

Описание кода статуса 302 Found:

Запрашиваемый ресурс временно находится под другим URI. Поскольку перенаправление может быть изменено, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов. Этот ответ можно кэшировать только в том случае, если на это указывает поле заголовка Cache-Control или Expires.

Я думаю, что это также не то, чего я хочу. Поскольку это не запрашиваемый ресурс, который находится под другим URI. А скорее совершенно другой ресурс (страница входа в систему против страницы аутентифицированного контента).

Поэтому я пошел дальше и выбрал другой ответ, на удивление, с другим решением.

Этот ответ предлагает нам выбрать 400 Bad Request.

Описание этого кода состояния таково:

Запрос не может быть понят сервером из-за неправильного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

Я думаю, что сервер прекрасно понял запрос, но просто отказывается предоставлять доступ, пока пользователь не прошел аутентификацию.

В другом ответе также говорится, что ответ 403 является правильным, однако в конце говорится:

Если это публичный сайт, где вы пытаетесь запретить доступ на основе сессионного cookie [именно так я и делаю], то часто лучше всего использовать 200 с соответствующим телом, указывающим на необходимость входа в систему, или временное перенаправление 302 на страницу входа в систему.

Так что 403 - это правильно, но 200 или 302 - это ЛУЧШЕ.

Эй! Это то, что я ищу: ЛУЧШЕЕ решение. Но разве лучшее не должно быть тем же самым, что и правильное? И почему оно должно быть лучшим?

Спасибо всем, кто дошел до этого вопроса :)

Я знаю, что мне не стоит слишком беспокоиться об этом. И я думаю, что этот вопрос более гипотетический (не совсем, но использовал его за неимением лучшего слова).

Но этот вопрос преследует меня уже некоторое время.

И если бы я был менеджером (который просто подобрал несколько круто звучащих слов, как они всегда делают), я бы сказал: но, но, но, но, но отдых важен. :-)

Итак: каков правильный способ™ использования кода статуса в описанной выше ситуации (если таковой имеется)?

tl;dr

Каков правильный ответ кода состояния http, когда пользователь пытается получить доступ к странице, требующей входа?

56
задан Community 23 May 2017 в 12:03
поделиться