Разработка API: В чем разница между ответами 401 Unauthorized и 403 Forbidden и когда какой использовать?

При разработке API одной из частых точек путаницы являются HTTP-коды ответа 401 Unauthorized и 403 Forbidden. Несмотря на то что оба статуса связаны с ограничением доступа, они имеют принципиально разную семантику.

**401 Unauthorized — проблема аутентификации**

Код 401 означает, что запрос не был выполнен, потому что сервер не смог идентифицировать клиента. Другими словами, пользователь не аутентифицирован: он либо не передал токен/credentials, либо передал невалидные или просроченные данные для входа. Несмотря на название «Unauthorized» (неавторизован), по своей сути этот статус говорит именно об отсутствии или некорректности аутентификации.

Когда использовать 401:
— Запрос пришёл без заголовка Authorization.
— Передан истёкший JWT-токен или невалидный API-ключ.
— Логин или пароль введены неверно.
— Сессия пользователя завершена.

При возврате 401 сервер обязан включать заголовок `WWW-Authenticate`, указывающий схему аутентификации (например, `Bearer`, `Basic`). Это сигнал клиенту: «Попробуй аутентифицироваться заново».

**403 Forbidden — проблема авторизации**

Код 403 означает, что сервер понял, кто делает запрос (пользователь успешно аутентифицирован), но отказывает в доступе к ресурсу, потому что у этого пользователя недостаточно прав. Это уже вопрос авторизации — разграничения прав доступа.

Когда использовать 403:
— Пользователь вошёл в систему, но пытается получить доступ к чужим данным.
— Роль пользователя (например, `user`) не позволяет выполнить действие, доступное только `admin`.
— IP-адрес клиента заблокирован.
— Ресурс существует, но доступ к нему закрыт для данного аккаунта.

Важно: при 403 повторная аутентификация не поможет — проблема не в том, кто ты есть, а в том, что тебе разрешено делать.

**Практическое правило**

Запомните простую формулу:
— **401** → «Я не знаю, кто ты. Представься».
— **403** → «Я знаю, кто ты. Но тебе сюда нельзя».

**Частая ошибка**

Некоторые разработчики возвращают 403 вместо 401, чтобы «скрыть» факт существования ресурса от неаутентифицированных пользователей. Это допустимо в целях безопасности, но нарушает стандарт RFC 7235. Если же вы хотите скрыть сам факт существования ресурса — используйте 404 Not Found.

**Итог**

Правильное разграничение 401 и 403 делает API предсказуемым, облегчает отладку на стороне клиента и соответствует стандартам HTTP. Всегда думайте: проблема в идентификации пользователя или в его правах?


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.