Чем ответы 401, 403 и 404 отличаются и что возвращать на запрос чужого ресурса?
- Когда возвращать 403, а когда 404?
401 Unauthorized — личность не установлена: нет токена или он неверный. 403 Forbidden — личность известна, но прав нет. 404 Not Found — ресурс не найден.
- 401 сопровождается заголовком WWW-Authenticate — клиент должен войти
- Чужой заказ — часто 404, чтобы не подтверждать существование ресурса
- 403 уместен, когда ресурс известен, а действие запрещено (админка)
А ещё Название 401 историческое: по смыслу это «unauthenticated»
Подробно
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 означает, что сервер не смог обработать запрос из-за сбоя
- ✗На чужой ресурс всегда отвечают 401
- ✗404 означает ошибку на сервере
- ✓401 — не аутентифицирован, 403 — нет прав, 404 — не найден; на чужое часто 404
Что спросят дальше
- Чем 401 отличается от 403?
- Когда возвращать 409 Conflict?
Разбор темы
- Spring MVC: DispatcherServlet и обработка запроса
Конвейер обработки запроса, @Controller против @RestController, маппинги, извлечение данных и контроль ответа.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.