Я пытаюсь реализовать аутентификацию и управление сессиями для микросервиса.Для того, чтобы выполнить процесс RESTful, я понимаю, что мне нужно будет использовать некоторую аутентификацию на основе токенов, чтобы избежать отслеживания данных сеанса клиента на сервере.Следующая цитата из этого ответа о стеке информационной безопасности Exchange обобщает мое понимание реализации:
В аутентификации на основе токенов ни один сеанс не сохраняется на стороне сервера (без сохранения состояния).Начальные шаги одинаковы.Учетные данные обмениваются с токеном, который затем присоединяется к каждому последующему запросу (его также можно сохранить в файле cookie).Однако с целью уменьшения использования памяти, легкого масштабирования и полной гибкости выдается строка со всей необходимой информацией (токен), которая проверяется после каждого запроса, сделанного клиентом на сервер.
Из этого я понимаю, что обслуживание сеансов без сохранения состояния выгодно для масштабируемости и гибкости, как объяснено.Но мне кажется, что это оставляет приложение подверженным некоторым серьезным проблемам:
- Если хакер каким-то образом перехватывает вызов HTTP REST обмена учетными данными, он может выполнить атаки воспроизведения насервер получает всю необходимую информацию.
- Фактически, поскольку токен сеанса хранится на стороне клиента, может ли хакер просто получить необходимую информацию из LocalStorage / SessionStorage путем отладки приложения?Или путем мониторинга входящих и исходящих HTTP-вызовов с помощью инструментов разработчика?Если они получают требуемую информацию о токене (даже зашифрованную информацию о токене), они могут просто начать подделывать вызовы REST на сервер из другого окна и получать все нужные данные!
Наконец, даже если вы дадите клиенту токен сеанса, разве сервер не должен будет аутентифицировать
этот токен?По сути, сервер должен поддерживать маркеры сеансов для сопоставлений пользователей ... но разве это не противоречит цели архитектуры на основе REST без сохранения состояния?
Может быть, я вижу эти проблемы, потому что тамэто пробел в моем понимании.Если это так, я бы хотел немного прояснить основные понятия.Если нет, я хотел бы знать, есть ли какие-либо методы для решения этих конкретных проблем.