Хранение токенов на стороне клиента

Проблема

Приложение хранит токен так, что возникает одна или несколько из следующих ситуаций:

  • токен автоматически отправляется браузером (сookie storage);
  • токен получается, даже если браузер перезапущен (использование контейнера localStorage браузера);
  • токен получается в случае атаки XSS (сookie, доступный для кода JavaScript или токен, который хранится в localStorage или sessionStorage).

Решение

  • Хранить токен в браузере, используя контейнер sessionStorage.
  • Добавить его в заголовок Authorization, используя схему Bearer. Заголовок должен выглядеть следующим образом: Authorization: Bearer <token>
  • Добавить fingerprint информацию к токену.

Сохраняя токен в контейнере sessionStorage, он предоставляет токен для кражи в случае XSS. Однако fingerprint, добавленный в токен, предотвращает повторное использование украденного токена злоумышленником на его компьютере. Чтобы закрыть максимум областей использования для злоумышленника, добавьте Политику безопасности содержимого браузера (Content Security Policy), чтобы ограничить контекст выполнения.

Остается случай, когда злоумышленник использует контекст просмотра пользователя в качестве прокси-сервера, чтобы использовать целевое приложение через легитимного пользователя, но Content Security Policy может предотвратить связь с непредвиденными доменами.

На главную