Это проблема, на которую я потратил много времени. Как надежно хранить токен авторизации. У людей разные стратегии решения этой проблемы, поэтому я поделюсь тем, что работает для меня. Пользователи моих приложений подвергались различным атакам, и все они до сих пор не смогли ничего украсть. Никто не использовал XSS.
Вот что я делаю
В итоге я выбрал хранение токена авторизации в локальном хранилище . Приложения, которые я работаю, обычно имеют соединения WebSocket поверх HTTP-маршрутов, и я хочу, чтобы токен был сохранен в одном месте и действовал как единый источник правды. Все они являются веб-приложениями, запущенными в браузере. Большинство приложений, которые я создаю, используют JWT.
Почему я так делаю
Во-первых, почему я не использую токены refre sh. Если они сохраняются так же, как и текущий токен авторизации, это устраняет причину существования токена refre sh, поскольку злоумышленник может использовать токен refre sh для получения авторизационного токена.
Сохранение маркер в файлах cookie не дает никаких преимуществ по сравнению с локальным хранилищем, если предположить, что приложение защищено от атак злоумышленников, которые могут внедрить JavaScript в ваше приложение, в основном через формы и API в вашем приложении. Убедитесь, что все пользовательские данные JS безопасны для инъекций. Кроме того, с файлами cookie возникают проблемы при использовании WebSockets, которые вы должны go вокруг.
Существует также точка взлома одной из учетных записей, и вы хотите аннулировать этот токен как можно скорее. JWT по умолчанию должен иметь механизм отзыва. Реализация этой функции сводит на нет масштабируемость JWT, потому что проверка JWT потребует вызова базы данных, чтобы узнать, может ли этот пользователь выполнить указанное действие c. Есть 2 способа, которыми вы можете go узнать об этом. Один из них - просто проверить пользовательские данные, если пользователь заморожен из базы данных, он менее масштабируем из-за вызова, но если вы уже извлекаете пользовательские данные в промежуточном программном обеспечении, это достаточно хорошая ТМ. Другой способ заключается в извлечении «замороженных пользователем» данных из базы данных только при внесении изменений в базу данных или при важности вызова от клиента.
В сумме
Я бы хранил токен в локальном хранилище. Защитите приложение от инъекций кода. И сделайте переключатель уничтожения для учетных записей, если они каким-либо образом скомпрометированы.
РЕДАКТИРОВАТЬ СПАСИБО ЗА КОММЕНТАРИИ @ @ JerryCauser
Хранить токен более безопасно в безопасном http только повар ie. Не ожидайте, что выбор механизма хранения автоматически спасет ваших пользователей от взлома. Существуют способы захвата сеансов и других эксплойтов, включая пользователей, использующих веб-расширения и одобряющих их запрос на чтение защищенных данных.
Для приведенного ниже примера веб-сайта для ставок пользователю не требуется вводить свой пароль (или утвердить запрос с помощью автоматической электронной почты) каждый раз, когда они делают ставку, но вы будете делать это каждый раз, когда они захотят снять, например.
Я использую локальное хранилище, потому что даже если случится кража токена, или другой человек попал на ноутбук вашего пользователя (например, ребенок), вы никогда не должны позволять учетной записи выполнять критические задачи без одобрения.
Нет волшебной c пули против хакерской защиты. Старайтесь изо всех сил, чтобы обеспечить безопасность ваших пользователей со здравым смыслом.
РЕДАКТИРОВАТЬ В СООТВЕТСТВИИ С КОММЕНТАРИЙ ОТ АСКЕРА @ amaster
Если вы совершаете поездку в базу данных Возможно, JWT не самый лучший солютон. Суть JWT заключается в том, чтобы иметь подписанные заявки и идентификатор пользователя без вызова базы данных. В этом случае, возможно, выберите сеансы вместо JWT.