Механизмы входа/аутентификации без учета состояния для масштабируемых веб-приложений?

Я пытаюсь понять параметры, которые есть у меня при создании механизма проверки подлинности для приложений, которые могут запускаться на произвольном количестве веб-серверов. До сих пор у меня есть опыт работы с небольшими веб-сайтами, которые используют (web-) серверные сеансы для управления аспектами аутентификации. Но как только я хочу добавить больше веб-серверов (или "веб-экземпляров" в среде PaaS), этот подход, очевидно, становится проблемой; состояние аутентификации, привязанное к определенным машинам, из моего понимания не то, что вы хотите при использовании балансировки нагрузки (afaik sticky sessions/sticky load balancing - это то, чего следует избегать). Я ищу решение, которое позволяет мне масштабировать количество веб-серверов/экземпляров вверх и вниз динамически, не заботясь о механизме аутентификации.

Я думаю, что единственный способ добиться этого - принять состояние сеанса/аутентификации из моих веб-серверов. Это то, что я имел в виду, говоря "без гражданства". Конечно, это состояние должно быть временно сохранено где-то, поэтому должно быть что-то, что не является апатридом.

Я мог бы использовать сервер базы данных для управления всеми сеансами аутентификации. К серверу базы данных можно было получить доступ со всех моих веб-серверов в каждом HTTP-запросе, чтобы запросить состояние аутентификации пользователей. Но так как серверы баз данных еще сложнее масштабировать, чем веб-серверы (это было бы моим предположением, не имея никакого опыта с ним), я бы просто переместил проблему с веб-серверов на серверы баз данных. Кроме того, я не думаю, что это было бы лучшим решением с точки зрения производительности.

Вместо сервера базы данных я мог бы использовать сервер кэша, например memcached или redis, для управления сеансами для аутентификации. Я думаю, что это свести к минимуму проблемы с масштабируемостью, так как один сервер кеша мог бы управлять множеством сеансов по-своему (или я ошибаюсь на этом этапе?). Но я иногда читаю такие вещи, как "важный момент в кеше заключается в том, что он ведет себя точно так же, как кэш должен: данные, которые вы только что сохранили, могут просто исчезнуть". Ну, это будет проблемой. Я не хочу, чтобы пользователи приходили каждые два часа. Мой вопрос: почему данные в кеше пропадают, если в кеше хватает памяти? Не хватило бы 250 Мбайт памяти на кэш-сервере для управления более чем миллионом сеансов одновременно без необходимости избавляться от данных (при использовании простых пар ключ-значение, сопоставляющих идентификаторы сеанса с идентификаторами пользователя или наоборот)?

Третьим решением может быть сохранение состояния auth sesson в файлах cookie, которые подписываются сервером и не могут управляться клиентами. Но если я не ошибаюсь, для стороны сервера не существует возможности принудительного выхода из системы определенного пользователя...

Подведем итоги моих требований:

  • Я хочу масштабировать веб-серверы за балансиром нагрузки вверх и вниз и система auth должна иметь дело с ней

  • Пользователям должно быть разрешено войти в систему как минимум на несколько дней
    например, например. на stackoverflow.com

  • Серверная сторона должна иметь возможность отключать пользователей, если есть причина для этого

Меня интересуют лучшие практики. Я думаю, что есть тонна сайтов  которые сталкиваются с теми же проблемами и нашли для нее решения.

Ответ 1

Этот проект github - это хорошее место для начала. Реализация в Play! Рамки, но это хорошее объяснение того, что, как я думаю, вам нужно. Также помогает преодолеть CSRF, который может быть присущ приложению.

Сервер отправляет обратно auth_token (через https) после входа в систему. Auth_token сохраняется как файл cookie (только так он будет сохраняться и доступен с клиента). Когда запрос делается, auth_token помещается как HTTP-заголовок (через JavaScript), который был сохранен в файлах cookie. Затем его снимает обработчик запросов сервера и проверяется с каждым запросом. Таким образом, это куки файл, но не используемый в качестве файла cookie. "Дважды выпеченный" cookie, если вы это сделаете:) Ссылки объясняются более подробно.

И еще один ответ здесь, когда переполнение стека, я нашел объяснение очень похожего. "Сеанс без сеанса".

И тогда, если вы действительно захотите в него заглянуть, проверьте owasp.org на предотвращение CSRF, что объясняет аналогичную технику под заголовком " Общая рекомендация: Шаблон маркера синхронизатора"

Все сообщения должны быть HTTPS.