Аси Кавинду написала, localStorage
- хорошее место. Если вы хотите защитить приложение от XSS-атак, используйте Content Security Policy , чтобы браузер выполнял только ваш код JavaScript. Недавно был опубликован RFC о лучших практиках для OAuth 2.0 и приложений на основе браузера , поэтому вы можете проверить его.
Если вы хотите сохранить состояние (сеанс) на своем бэкэнде с несколькими бэкэнд-узлами (кластером), вы можете использовать некоторое общее хранилище данных, такое как база данных или Hazelcast. Архитектура имеет состояние так же, как и один внутренний узел с сеансом в памяти.
Если у вас есть сеанс на вашем бэкэнде и cookie, вам больше не нужен токен доступа, так как ваш SPA вызывает только ваш бэкэнд, и токен будет служить той же цели, что и идентификатор сеанса из куки.
Функциональность "помни меня" может быть реализована с помощью файла cookie либо у вашего провайдера аутентификации (возможно, лучший выбор с точки зрения безопасности), либо в вашем собственном приложении.
Выбор архитектуры обычно является компромиссом между простотой и масштабируемостью. Если вы только начинаете разрабатывать приложение и не знаете, что выбрать, я бы пошел на простоту, потому что даже если вы захотите изменить его позже, его будет проще реорганизовать.