Чего не хватает другим ответам, так это того, что следует понимать, что Аутентификация и Авторизация в контексте RFC 2616 относятся ТОЛЬКО к протоколу HTTP-аутентификации RFC 2617. Аутентификация по схемам вне RFC2617 не поддерживается в кодах состояния HTTP и не рассматривается при принятии решения использовать 401 или 403.
Краткое и краткое
Unauthorized указывает, что клиент не прошел проверку подлинности RFC2617, и сервер инициирует процесс проверки подлинности. Запрещено указывает, что клиент аутентифицирован по RFC2617 и не имеет авторизации, или что сервер не поддерживает RFC2617 для запрошенного ресурса.
Это означает, что если у вас есть свой собственный процесс входа в систему «по-отдельности» и вы никогда не используете HTTP-аутентификацию, 403 всегда является правильным ответом, а 401 никогда не должен использоваться.
Подробный и углубленный
От RFC2616
10.4.2 401 Несанкционированный
Запрос требует аутентификации пользователя. Ответ ДОЛЖЕН включать поле заголовка WWW-Authenticate (раздел 14.47), содержащее запрос, применимый к запрашиваемому ресурсу. Клиент МОЖЕТ повторить запрос с подходящим полем заголовка Авторизация (раздел 14.8).
а также
10.4.4 403 Запрещено Сервер понял запрос, но отказывается его выполнить. Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться.
Первое, что нужно иметь в виду, это то, что «Аутентификация» и «Авторизация» в контексте этого документа относятся конкретно к протоколам HTTP-аутентификации из RFC 2617. Они не относятся к любым протоколам аутентификации, которые вы, возможно, создали сами. использование страниц входа и т. д. Я буду использовать «логин» для ссылки на аутентификацию и авторизацию, отличные от RFC2617
Таким образом, реальная разница не в том, в чем проблема, или даже в том, если есть решение. Разница в том, что сервер ожидает, что клиент будет делать дальше.
401 указывает, что ресурс не может быть предоставлен, но сервер ЗАПРОСИЛ, чтобы клиент вошел через HTTP-аутентификацию и послал заголовки ответа, чтобы инициировать процесс. Возможно, есть авторизации, которые разрешат доступ к ресурсу, возможно, нет, но давайте попробуем и посмотрим, что произойдет.
403 указывает, что ресурс не может быть предоставлен, и для текущего пользователя нет никакого способа решить это через RFC2617 и нет смысла пытаться. Это может быть связано с тем, что известно, что никакого уровня аутентификации недостаточно (например, из-за черного списка IP-адресов), но это может быть связано с тем, что пользователь уже аутентифицирован и не имеет полномочий. Модель RFC2617 является однопользовательской, однопользовательской, поэтому случай, когда у пользователя может быть второй набор учетных данных, которые могут быть авторизованы, может быть проигнорирован. Это не предполагает и не подразумевает, что какая-либо страница входа в систему или другой протокол аутентификации, отличный от RFC2617, может или не может помочь - что находится за пределами стандартов и определений RFC2616.
Изменить: RFC2616 устарел, см. RFC7231 и RFC7235 .