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

Ответ

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 — «у вас нет доступа, даже с удостоверением».

Ответ 18+ 🔞

А, слушай, вот эта история с ошибками 401 и 403 — это ж классика, просто пиздец! Сидишь такой, пытаешься что-то сделать, а тебе в ответ — отлуп. И главное, отлупы-то разные, а понять, в чём разница, — это надо быть почти экстрасенсом.

Так вот, смотри, чтобы не быть мудаком, который нихуя не понимает, запомни раз и навсегда.

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 — «А, это ты, Вася. Я тебя знаю. Но в этот сортир тебе, Вася, нельзя. Иди в общий, падла».

Вот и вся магия, блядь. Теперь не будешь путать, как последний распиздяй.