В чем разница аутентификации и авторизации
Что проверяют
Различаете ли вы «кто вы» и «что вам можно», и знаете ли, как это выглядит в коде: где хранится сессия, какой код ответа отдавать, где проверять права.
Как отвечать
Аутентификация отвечает на вопрос, кто перед нами: проверка пароля, кода из письма, токена, отпечатка. Авторизация отвечает, что этому пользователю разрешено: доступ к разделу, чужому заказу, действию удаления.
Порядок всегда такой: сперва аутентификация, потом авторизация. Пользователь может быть опознан, но не иметь прав.
Практическая часть, ради которой вопрос и задают:
- коды ответов: 401 означает «не опознан или сессия истекла», 403 означает «опознан, но нельзя». Их путают чаще всего;
- как хранится вход: серверная сессия с идентификатором в куке или подписанный токен. У токена нельзя мгновенно отозвать доступ, поэтому его делают коротким и добавляют обновляющий токен;
- где проверять права: всегда на сервере и как можно ближе к данным. Скрытая кнопка в интерфейсе это удобство, а не защита;
- модели доступа: по ролям (администратор, редактор), по атрибутам (свой заказ, своя компания), по владельцу объекта. Типичная дыра это доступ к чужой записи по прямой ссылке, когда проверяют только вход и не проверяют владельца;
- фиксация: журнал действий нужен и для разбора инцидентов, и для требований аудита.
Уместно добавить, что рядом стоит идентификация (заявление о том, кто вы) и что двухфакторность это усиление именно аутентификации, на права она не влияет.
Где спотыкаются
Отдают 403 вместо 401 при истёкшей сессии, и клиент не понимает, что надо обновить токен.
Проверяют роль, но не владельца объекта.
Считают, что скрытый в интерфейсе раздел недоступен, хотя запрос к API проходит напрямую.