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

В чем разница между 401 и 403 статус-кодам?

2.2 Middle🔥 241 комментариев
#Тестирование API

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

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

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

Разница между HTTP статус-кодами 401 Unauthorized и 403 Forbidden

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

Семантика и контекст использования

401 Unauthorized фактически означает "Неаутентифицированный" (более точный перевод — "Unauthenticated"). Этот статус указывает, что запрос не содержит корректных учетных данных для аутентификации пользователя или что предоставленные учетные данные неверны. Сервер таким образом говорит: "Я не знаю, кто вы, поэтому не могу предоставить доступ".

403 Forbidden означает "Запрещено" и сигнализирует, что сервер понял запрос (клиент успешно аутентифицирован), но отказывается его авторизовать. То есть: "Я знаю, кто вы, но у вас нет прав на выполнение этого действия".

Технические различия

Ключевое техническое отличие — наличие заголовка WWW-Authenticate в ответе:

  • Для 401 сервер ОБЯЗАН отправить заголовок WWW-Authenticate, содержащий информацию о требуемой схеме аутентификации:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Restricted Area"
Content-Type: application/json

{
  "error": "Invalid credentials"
}
  • Для 403 заголовок WWW-Authenticate НЕ ТРЕБУЕТСЯ, поскольку проблема не в аутентификации:
HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "error": "Insufficient permissions",
  "required_role": "admin"
}

Практические сценарии в тестировании

Типичные случаи для 401:

  • Отправка запроса без токена/куки аутентификации
  • Использование просроченного JWT-токена
  • Неверный логин/пароль при Basic-аутентификации
  • Поддельная или поврежденная подпись токена

Типичные случаи для 403:

  • Пользователь с ролью "user" пытается получить доступ к админ-панели
  • Попытка редактирования чужого контента (например, поста другого пользователя)
  • Доступ к API-эндпоинту, требующему определенной scope/роли
  • Попытка выполнения операции, запрещенной политиками безопасности (например, частые запросы к API)

Пример из реального тестирования API

Представим REST API с эндпоинтом управления пользователями:

# Пример теста для 401
def test_access_admin_without_auth():
    response = requests.get('/api/admin/users')
    assert response.status_code == 401
    assert 'WWW-Authenticate' in response.headers

# Пример теста для 403  
def test_access_admin_as_regular_user():
    headers = {'Authorization': 'Bearer user_token'}
    response = requests.get('/api/admin/users', headers=headers)
    assert response.status_code == 403
    assert 'error' in response.json()

Особенности поведения браузеров

  • При получении 401 с Basic/Digest аутентификацией браузер обычно показывает диалоговое окно для ввода логина/пароля
  • 403 обычно отображается как стандартная страница "Доступ запрещен" без запроса учетных данных

Важность для тестирования безопасности

Понимание разницы помогает корректно проектировать тестовые сценарии:

  1. Тесты аутентификации должны проверять, что защищенные эндпоинты возвращают 401 при отсутствии/некорректных учетных данных
  2. Тесты авторизации должны валидировать, что пользователи с разными ролями получают соответствующие ответы (200 для разрешенных, 403 для запрещенных операций)
  3. Тесты безопасности должны учитывать, что 403 не должен раскрывать излишней информации о структуре ресурсов (во избежание помощи злоумышленникам)

Распространенные ошибки реализации

На практике разработчики иногда путают эти коды:

  • Возврат 403 вместо 401 при истекшей сессии (правильнее — 401)
  • Использование 401 когда пользователь аутентифицирован, но не имеет прав (правильнее — 403)
  • Отсутствие заголовка WWW-Authenticate при 401 (нарушение спецификации RFC 7235)

Для QA-инженера важно не только различать эти статусы, но и уметь объяснить разработчикам правильное использование, так как это влияет на безопасность и пользовательский опыт приложения. Корректная обработка этих кодов позволяет создавать более безопасные и понятные для пользователя системы аутентификации и авторизации.

В чем разница между 401 и 403 статус-кодам? | PrepBro