2014-01-20 5 views
12

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

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

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

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

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

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

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

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

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

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

ответ

5

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

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

И еще один ответ here on stack overflow Я нашел объяснение очень похожего. «Сеанс без сеанса».

И тогда, если вы действительно хотите, чтобы копаться в его проверить owasp.org по предотвращению CSRF, что объясняет подобную технику под заголовком «General Recommendation: Synchronizer Token Pattern»

Все коммуникации должны быть HTTPS.

Смежные вопросы