
401 и 403 - оба означают, что вы не получили страницу, и их постоянно путают друг с другом в сообщениях об ошибках и в отчетах об ошибках. Различие между ними просто читается, но имеет большое значение для действий: один касается того, кто вы, а другой - того, что вам разрешено делать.
Если вы перепутаете их, это отправит вас исправлять не то. Поэтому вот различие, что на самом деле говорит каждый код и как определить, какой у вас на самом деле.
Краткая версия
401 Unauthorized означает, что сервер не знает, кто вы. Вы не вошли, или учетные данные, которые вы отправили, отсутствуют, неверны или истекли. Если вы правильно войдете, запрос будет успешным.
403 Forbidden означает, что сервер точно знает, кто вы, и вам все еще не разрешено. Вы вошли, ваши учетные данные в порядке, и этот конкретный аккаунт просто не имеет разрешения выполнять это действие. Повторный вход ничего не изменит, потому что вход никогда не был проблемой.
Проще говоря: 401 означает «я вас не знаю», 403 означает «я вас знаю, и нет».
Названия - это историческая ошибка, которая делает это еще хуже. 401 обозначен как «Unauthorized», когда на самом деле означает не прошедший аутентификацию - сервер не смог установить, кто вы. 403 - это тот, который действительно касается авторизации. Эти названия сохранились для совместимости, поэтому смотрите дальше названий и на то, что реально делает каждый код.
Как определить, какой у вас
Посмотрите, вошли ли вы, когда это произошло.
Если вы не вошли в систему, или запрос не содержал файл cookie сеанса или токена, 401 - это ожидаемый и правильный ответ, и нужно пройти аутентификацию. Если тот же запрос работает после входа, то это была только 401.
Если вы вошли - надлежащим образом, с действительным сеансом, который сервер принимает - и одно конкретное действие или страница возвращает ошибку, вы смотрите на 403. Учетная запись аутентифицирована, и ответ все равно нет. Выход и повторный вход, очистка cookie или использование другого браузера ничего не изменят, и каждое из них - распространённая пустая трата получаса на попытку решить, как если бы это была 401.
Одна ловушка, которую стоит отметить: некоторые серверы специально возвращают 404 Not Found вместо 403, чтобы не подтверждать существование ресурса. Если URL, который вы знаете, реален, возвращается как «не найден» только когда у вас нет доступа, то на самом деле это 403 в маске.
Если это ваш сайт
Какой код вы отправляете - это решение, а не деталь, потому что это говорит человеку на другом конце, какую из двух очень разных проблем у них есть.
Отправьте 401, когда запрос не аутентифицирован - нет учетных данных или те, которые сервер не может проверить - и включите заголовок WWW-Authenticate, чтобы клиент знал, как ему войти. 401 - это приглашение пройти аутентификацию и повторить попытку.
Отправьте 403, когда запрос аутентифицирован, но не разрешен. Пользователь - это именно то, на кого он выдает себя, но этот аккаунт не имеет разрешения выполнять это действие. Не отправляйте 401, потому что 401 скажет им войти снова, они войдут, это не сработает, и они будут думать, что ваш сайт неработающий.
Наиболее частая причина 403 на вашем собственном сайте - это проверка разрешений или ролей: пользователь, достигший маршрута администратора, API ключ без необходимых разрешений для конечной точки, объект, принадлежащий другой учетной записи. Наиболее частая причина неожиданного 401 - это сеанс или токен, которые истекли, но интерфейс это не заметил, поэтому он продолжает отправлять учетные данные, которые сервер больше не признает.
Почему их стоит захватывать, а не описывать
«Я получил ошибку, и она меня не впустила» - это отчет, который вы обычно получаете, и оба кода подходят для этого описания одинаково, что и объясняет, почему это не помогает. 401 и 403 выглядят идентично для пользователя - страница, которую он хотел, и не получил - а единственная информация, которая их отличает, код состояния, - это то, что человек почти никогда не проверяет.
Сам запрос содержит ответ: статус, отправлены ли учетные данные, и что ответил сервер. Захваченный в момент сбоя, это превращает «это меня не впустило» в «403 на этой конечной точке при входе под этим аккаунтом», что является ошибкой разрешений, которую кто-то может найти - а не проблему входа, на которой кто-то потратит час.
Session Replay
Бесплатное расширение Chrome. Один клик на странице, которая ведет себя неправильно, захватывает скриншот, консоль и журнал сети, и выдает вам ссылку для вставки в билет.
Журнал сети содержит неудачный запрос с его статусом и информацией о том, отправлены ли учетные данные, поэтому тот, кто получает отчет, может с первого взгляда увидеть, является ли это 401 или 403 - и не должен воспроизводить состояние входа, чтобы выяснить. Чтобы проверить, какой из этих кодов возвращает URL прямо сейчас, инструмент проверки HTTP статуса запрашивает его и сообщает полученный код.
Одним абзацем
401 Unauthorized означает, что сервер не знает, кто вы, и вам следует пройти аутентификацию; 403 Forbidden означает, что он точно знает, кто вы, и вам все еще не разрешено, поэтому повторный вход не поможет. Различайте их по тому, вошли ли вы, когда это произошло, отправляйте правильный код с вашего сайта, чтобы никто не зациклился на входе из-за ошибки разрешений, и захватите неудачный запрос, а не описывайте его, потому что код состояния - это весь ответ и единственное, что пользователь никогда не читает.