Я пытаюсь понять параметры, которые есть у меня при создании механизма проверки подлинности для приложений, которые могут запускаться на произвольном количестве веб-серверов. До сих пор у меня есть опыт работы с небольшими веб-сайтами, которые используют (web-) серверные сеансы для управления аспектами аутентификации. Но как только я хочу добавить больше веб-серверов (или "веб-экземпляров" в среде PaaS), этот подход, очевидно, становится проблемой; состояние аутентификации, привязанное к определенным машинам, из моего понимания не то, что вы хотите при использовании балансировки нагрузки (afaik sticky sessions/sticky load balancing - это то, чего следует избегать). Я ищу решение, которое позволяет мне масштабировать количество веб-серверов/экземпляров вверх и вниз динамически, не заботясь о механизме аутентификации.
Я думаю, что единственный способ добиться этого - принять состояние сеанса/аутентификации из моих веб-серверов. Это то, что я имел в виду, говоря "без гражданства". Конечно, это состояние должно быть временно сохранено где-то, поэтому должно быть что-то, что не является апатридом.
Я мог бы использовать сервер базы данных для управления всеми сеансами аутентификации. К серверу базы данных можно было получить доступ со всех моих веб-серверов в каждом HTTP-запросе, чтобы запросить состояние аутентификации пользователей. Но так как серверы баз данных еще сложнее масштабировать, чем веб-серверы (это было бы моим предположением, не имея никакого опыта с ним), я бы просто переместил проблему с веб-серверов на серверы баз данных. Кроме того, я не думаю, что это было бы лучшим решением с точки зрения производительности.
Вместо сервера базы данных я мог бы использовать сервер кэша, например memcached или redis, для управления сеансами для аутентификации. Я думаю, что это свести к минимуму проблемы с масштабируемостью, так как один сервер кеша мог бы управлять множеством сеансов по-своему (или я ошибаюсь на этом этапе?). Но я иногда читаю такие вещи, как "важный момент в кеше заключается в том, что он ведет себя точно так же, как кэш должен: данные, которые вы только что сохранили, могут просто исчезнуть". Ну, это будет проблемой. Я не хочу, чтобы пользователи приходили каждые два часа. Мой вопрос: почему данные в кеше пропадают, если в кеше хватает памяти? Не хватило бы 250 Мбайт памяти на кэш-сервере для управления более чем миллионом сеансов одновременно без необходимости избавляться от данных (при использовании простых пар ключ-значение, сопоставляющих идентификаторы сеанса с идентификаторами пользователя или наоборот)?
Третьим решением может быть сохранение состояния auth sesson в файлах cookie, которые подписываются сервером и не могут управляться клиентами. Но если я не ошибаюсь, для стороны сервера не существует возможности принудительного выхода из системы определенного пользователя...
Подведем итоги моих требований:
-
Я хочу масштабировать веб-серверы за балансиром нагрузки вверх и вниз и система auth должна иметь дело с ней
-
Пользователям должно быть разрешено войти в систему как минимум на несколько дней
например, например. на stackoverflow.com - Серверная сторона должна иметь возможность отключать пользователей, если есть причина для этого
Меня интересуют лучшие практики. Я думаю, что есть тонна сайтов которые сталкиваются с теми же проблемами и нашли для нее решения.