Ответ
HTTP 401 Unauthorized — это код состояния клиентской ошибки, который означает, что запрос не был применён, потому что ему не хватает действительных учётных данных для аутентификации. Сервер "не знает", кто такой клиент, и отказывает в доступе.
Ключевое отличие от 403 Forbidden:
- 401 Unauthorized: "Я тебя не узнаю. Предъяви пропуск (учётные данные)."
- 403 Forbidden: "Я тебя узнал, но у тебя нет прав на этот ресурс."
Типичные причины и сценарии:
- Отсутствие заголовка аутентификации: Запрос отправлен без
Authorization. - Неверный или просроченный токен: Переданный Bearer/JWT токен некорректен, подписан неверно или истёк.
- Неправильные логин/пароль при использовании Basic Auth.
- Попытка доступа к защищённому ресурсу без предварительного логина.
Пример запроса и ответа:
### Запрос с неверным токеном
GET /api/profile HTTP/1.1
Host: api.example.com
Authorization: Bearer expired_or_invalid_token
### Ответ сервера
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="Access to profile", error="invalid_token", error_description="The access token expired"
Content-Type: application/json
{
"error": "Unauthorized",
"message": "Invalid or expired authentication token"
}
Заголовок WWW-Authenticate:
Сервер может отправить этот заголовок, чтобы указать клиенту схему аутентификации, которую следует использовать (например, Basic, Bearer). Это часть стандарта HTTP.
Что делать при получении 401:
- На стороне клиента (тестировщика/разработчика):
- Проверить корректность формирования заголовка
Authorization. - Убедиться, что токен активен и не истёк.
- Выполнить запрос на обновление токена (если используется refresh token flow).
- Перелогиниться в системе для получения новых учётных данных.
- Проверить корректность формирования заголовка
- На стороне сервера (если вы администрируете API):
- Проверить конфигурацию сервера аутентификации.
- Убедиться в правильной валидации подписи и срока действия токенов.
Тестирование: При тестировании API сценарии с неверными или отсутствующими учётными данными должны всегда возвращать 401, а не 500 или 403.