Получить доступ

Чем ответы 401, 403 и 404 отличаются и что возвращать на запрос чужого ресурса?

JuniorSpring MVC и RESTSpring
Ещё спрашивают так:
  • Когда возвращать 403, а когда 404?
Коротко

401 Unauthorized — личность не установлена: нет токена или он неверный. 403 Forbidden — личность известна, но прав нет. 404 Not Found — ресурс не найден.

  • 401 сопровождается заголовком WWW-Authenticate — клиент должен войти
  • Чужой заказ — часто 404, чтобы не подтверждать существование ресурса
  • 403 уместен, когда ресурс известен, а действие запрещено (админка)

А ещё Название 401 историческое: по смыслу это «unauthenticated»

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

401 — запрос без учётных данных или с недействительными (просроченный токен). Сервер говорит: «я не знаю, кто вы». В ответе — WWW-Authenticate со схемой (Bearer). Клиент обновляет токен или отправляет пользователя на вход.

403 — пользователь известен, но действие ему запрещено: обычный пользователь открывает /admin. Повторный вход не поможет.

404 — ресурса по этому адресу нет.

Чужие ресурсы. GET /orders/1002 от пользователя, которому заказ не принадлежит. Ответ 403 подтверждает, что заказ существует, — утечка информации (перебором можно узнать число заказов, существование аккаунтов). Поэтому для ресурсов, которые не должны быть видны, отвечают 404, как будто их нет. Так делает GitHub для приватных репозиториев.

В Spring Security: неаутентифицированный запрос — AuthenticationEntryPoint → 401 (или редирект на форму входа); нет прав — AccessDeniedHandler → 403. Проверку владения удобно делать выборкой findByIdAndOwnerId — для чужого заказа она ничего не находит, и естественно получается 404.

Смежные коды: 400 — неверный запрос, 409 — конфликт состояния, 422 — бизнес-валидация, 429 — превышен лимит.

Что хотят услышать

  • Различие трёх кодов.
  • Почему на чужой ресурс часто 404.
  • Как это делает Spring Security.

Частые ошибки

  • Отвечать 401, когда пользователь вошёл, но прав нет.
  • Отвечать 403 на чужой ресурс и раскрывать его существование.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓401 — не аутентифицирован, 403 — аутентифицирован, но нет прав, 404 — ресурс не найден; на чужой ресурс часто отвечают 404, чтобы не раскрывать его существование
  • ✗401 и 403 — синонимы
  • ✗На чужой ресурс всегда 401
  • ✗404 означает ошибку на сервере

Что спросят дальше

  • Чем 401 отличается от 403?
  • Когда возвращать 409 Conflict?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем