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

«В чем разница между HTTP-кодами состояния 401 и 403?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

401 Unauthorized означает, что запрос не был выполнен из-за отсутствия или недействительности аутентификационных данных. Сервер ожидает, что клиент предоставит корректные учетные данные (например, логин/пароль или токен). Это проблема с аутентификацией (кто вы?).

403 Forbidden означает, что сервер понял запрос, но отказывается его выполнять, даже если клиент аутентифицирован. Это проблема с авторизацией (что вам разрешено?). У клиента недостаточно прав для доступа к ресурсу.

Практический пример (Python/Django-like):

# 401 Unauthorized — пользователь не аутентифицирован
if not request.user.is_authenticated:
    return HttpResponse(status=401)

# 403 Forbidden — у пользователя нет нужного разрешения
if not request.user.has_perm('app.view_secret_data'):
    return HttpResponse(status=403)

Ключевое отличие: 401 — «представьте удостоверение», 403 — «у вас нет доступа, даже с удостоверением».