← Назад к вопросам

Что такое респонс-код 401?

2.0 Middle🔥 73 комментариев
#Теория тестирования

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое HTTP-код ответа 401?

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

Это один из ключевых кодов класса 4xx (Client Error), указывающий, что проблема связана с запросом со стороны клиента.

Основная суть и отличие от 403 Forbidden

Важно понимать разницу между 401 Unauthorized и 403 Forbidden:

  • 401 Unauthorized: "Я не знаю, кто ты. Представься (предоставь валидные учетные данные), и, возможно, ты получишь доступ". Проблема в аутентификации (Authentication).
  • 403 Forbidden: "Я знаю, кто ты, но у тебя нет прав для доступа к этому ресурсу". Проблема в авторизации (Authorization).

Сервер, отправляя код 401, ОБЯЗАТЕЛЬНО должен включить в заголовки ответа поле WWW-Authenticate, которое указывает клиенту, какая схема аутентификации требуется для доступа к ресурсу (например, Basic, Bearer, Digest).

Типовые сценарии возникновения кода 401

Как QA-инженер, я ожидаю увидеть этот код в следующих ситуациях:

  1. Попытка доступа к защищенному API-эндпоинту без токена.

    # Пример запроса без заголовка Authorization
    curl -X GET https://api.example.com/user/profile
    # Ответ сервера:
    # HTTP/1.1 401 Unauthorized
    # WWW-Authenticate: Bearer realm="api"
    
  2. **Использование просроченного, отозванного или некорректного JWT.

  3. Ввод неверного логина или пароля при использовании базовой аутентификации (Basic Auth).

    # Запрос с неверными данными
    curl -u wronguser:wrongpass https://example.com/secure-page
    
  4. Отсутствие необходимых кук сессии при попытке доступа к странице, требующей входа в веб-приложение.

  5. Сбой в механизме "одноразовых" токенов или проблемах с их подписью.

Как тестировать сценарии с кодом 401?

При тестировании API или веб-приложений проверки на 401 код являются критически важной частью негативного тестирования и тестирования безопасности. Вот примерный чек-лист:

  • Позитивные проверки (Preconditions): Убедиться, что с валидными учетными данными доступ к ресурсу есть (коды 200, 201 и т.д.).
  • Негативные проверки:
    *   Отправить запрос **без заголовка `Authorization`**.
    *   Отправить запрос с **пустым или поврежденным токеном** в заголовке `Authorization`.
    *   Использовать **просроченный токен** (проверить логику `exp` claim в JWT).
    *   Использовать токен, **подписанный неверным секретным ключом**.
    *   Для Basic Auth: отправить **неверный логин/пароль**, **пустые** credentials.
    *   Проверить, что в ответе **присутствует заголовок `WWW-Authenticate`** с корректной информацией.
    *   Проверить **тело ответа**. Часто сервер возвращает JSON с описанием ошибки, которое должно быть информативным, но не раскрывать внутреннюю структуру безопасности (например, "Invalid token", а не "Signature verification failed").
    ```json
    // Пример ожидаемого тела ответа
    {
      "statusCode": 401,
      "message": "Access denied. Invalid or expired authentication token."
    }
    ```
  • Проверка поведения клиента: Убедиться, что клиентское приложение (веб-интерфейс, мобильное приложение) корректно обрабатывает 401 ответ — например, перенаправляет пользователя на страницу логина или запускает процедуру обновления токена (refresh token flow).

Инструменты для тестирования

Для тестирования таких сценариев я регулярно использую:

  • Postman / Insomnia: Для ручного и автоматизированного тестирования API, где легко можно удалить или изменить заголовки авторизации.
  • cURL: Для быстрых проверок и создания скриптов.
  • Автотесты на Python (pytest + requests) / JavaScript (Jest + axios): Для интеграции проверок кода 401 в CI/CD пайплайн.
    # Пример pytest теста на Python
    import pytest
    import requests
    
    def test_access_without_token():
        url = "https://api.example.com/secure-data"
        response = requests.get(url)  # Намеренно НЕ передаем токен
        assert response.status_code == 401
        assert "WWW-Authenticate" in response.headers
        assert response.json()["message"] == "Unauthorized"
    

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

Что такое респонс-код 401? | PrepBro