Для вошедших в систему пользователей сеанс токены действуют как прокси к их личности. Эти токены (JWT или Non-Jwt) выдаются бэкэндом и отправлены на фасад, где они хранятся. Если они используются неправильно или украдены, злоумышленник может получить несанкционированный доступ к счету жертвы. Как таковой, мы должны убедиться, что Минимизируйте риск всех возможных способов выполнения сеанса.
Один из векторов сеанса атаки – это клиент Frontend – веб-браузер. Токены сеансов хранятся здесь, пока пользователь вошел в систему. Это означает, что мы должны быть осторожны, где и как мы их храним. Именно здесь мы начинаем рассмотреть дискуссию на хранение браузера (LocalStorage, SessionStorage etc ..) VS Cookie Storage.
Прежде чем мы попадем в плюсы и минусы двух типов хранения, давайте кратко рассмотрим их свойства.
Точка осветления: как jwt, так и не-jwt (непрозрачные) токены сеанса могут храниться в хранилище cookie или в хранилище браузера. Единственное различие между двумя типами – это количество места, которое они занимают, которые мы рассмотрим в этой статье. Но помимо этого разницы, когда мы имеем ссылку на «токен сеанса», мы имеем в виду любой из двух типов.
Свойства хранения
Приведенная ниже таблица сравнивается различные механизмы хранения во всех различных соответствующих свойствах. Обратите внимание, что «хранение браузера» действительно может быть локальным или сеансовым хранилищем, indexedDB или Web SQL.
Хранение сеансов ❌ – Большинство приложений требуют, чтобы пользователь вошел в систему, даже если они открывают несколько вкладок браузера или перезапускают браузер и, следовательно, мы можем устранить этот метод хранения (не обманывать его имя).
IndexedDB ❌ – жетоны сеансов являются парами ключевых ценностей. Таким образом, им не нужны сложные возможности запросов. Использование IndexedDB может технически быть вариантом, однако, было бы более сложным, чем использование локальной таблички для целей хранения и извлечения жетонов сеансов.
Web SQL ❌- Глядя на стол, понятно, что WebSQL никогда не был вариантом.
Мы остались при выборе между локальным и хранением куки.
Cookies против LocalStorage.
Мы будем сравнивать эти типы хранения от удобства использования и точки безопасности. Для удобства использования мы рассмотрим простоту письма, чтения и удаления жетонов сеансов и любых ограничений, размещенных каждым из типов хранения для конкретных случаев использования.
С точки зрения безопасности мы рассмотрим различные методы, которые можно использовать для неправильного использования или кражи токена для каждого из типов хранения.
Анализ удобства использования
Ограничения размера: cookies имеют ограничение размеров 4 КБ на домен, тогда как размер локальной таблички составляет порядок больше. Для большинства случаев 4 КБ более чем достаточно для хранения жетонов сеансов, даже при использовании JWTS_ [1] _. Cookie: 1; LocalStorage: 1.
Автоматическое управление: Cookies автоматически сохраняются, отправляются и удалены браузером. Разработчик Frontend не должен беспокоиться о реализации этой части, а также нет никаких объемов ошибки от стороны Frontend. Это не относится к локальной местности. Cookie: 2; LocalStorage: 1.
Сервер боковых приложений: при выполнении навигации уровня браузера (типы пользователей в URL в их браузер/открывает ссылку на новой вкладке), отправляются только куки. Это означает, что для этих API вызовы на сервер, они получат только жетоны сеанса, если они используют файлы cookie – LocalStorage не будет работать. Cookie 3; LocalStorage 1.
Разделяя ту же сеанс через поддомены: целью здесь заключается в том, что пользователь должен использовать ту же сеанс при навигации на разных поддоменов сайта. Этого можно легко сделать с помощью файлов cookie, установив домен cookie как “.yoursite.com”. Это не легко можно сделать через LocalStorage, так как магазин не передается доменами/субдоменами. Можно использовать Iframes, чтобы взломать это, однако это не тривиально. Cookie: 4; LocalStorage: 1.
Анализ безопасности
Неправильное использование токена через XSS-атаку: атака XSS происходит, когда «злобный» JavaScript вводится на сайт. Некоторые способы, которыми может произойти настоящий впрыск кода, являются неверной проверкой ввода/вывода, могил третьего стороннего скрипта загружен в код интерфейса или социальной инженерии. При использовании LocalStorage, вредоносный код JS может легко прочитать токены сеанса и передавать их на злоумышленник. Затем злоумышленник поставил эти токены в свой браузер и иметь значительный, если не полный доступ к учетной записи этого пользователя. Печенье есть этот специальный флаг называется httponly. Если установлено, он предотвращает любые JS на фаусинге от чтения этого значения файла cookie. Это означает, что вредоносный код JS не может отправить токену доступа к злоумышленнику. Однако этот код все еще может делать злые вызовы API, когда пользователь использует сайт. В зависимости от продукта и причины атаки, которые могут быть недостаточно, чтобы удовлетворить намерение злоумышленника. Cookie: 5; LocalStorage: 1.
Неправильное использование токена через атаку CSRF: это атака, которая заставляет конечный пользователь выполнять нежелательные действия в веб-приложении, в котором они в данный момент аутентифицируются. Это нежелательное действие выполняется, когда пользователь посещает третье лицо вредоносного сайта. Эта атака возможна только в случае использования файлов cookie для хранения токенов доступа. Однако он также может быть легко смягчен с использованием токенов против CSRF или флаг намесе в файлах cookie. Независимо от использования LocalStorage, не нужно думать об этой атаке вектора. Cookie: 5; LocalStorage: 2.
Токен кража через вредоносное ПО: это растущая забота. Фактически, многие крупные счета подписчиков Youtube были угнаны, потому что их токены сеанса были украдены через вредоносное ПО на своем компьютере. Они были заражены этим вредоносным ПО из-за атаки социальной инженерии. Ни LocalStorage, ни хранилище Cookie не даст разницы, чтобы смягчить эту атаку (отсюда нет, присужденные либо). Единственная мера, которую можно взять здесь, состоит в том, чтобы иметь Обнаружение кражи токена на месте. Cookie: 5; LocalStorage: 2.
Неправильные представления
- Пользователь можно очистить файлы cookie: это правда, то же самое относится к локальному языку. При очистке истории просмотра и файлов cookie, LocalStorage также очищено.
- Нет необходимости для согласия cookie при использовании LocalStorage: сайт нужно только попросить согласие cookie для cookie, которые не «строго необходимые файлы cookie» (узнайте больше об этом здесь ). Сеанс Cookie Cookie считается строго необходимым и, следовательно, пользователь не может отрицать их использование. Это, как говорят, пользователю все еще нужно рассказать об их существовании.
- Мобильные приложения не могут использовать куки: Это просто не правда. Все Mobile Development Frameworks (IOS, Android, React Native, Flutter, Cordova и т. Д.) имеют нативную поддержку для файлов cookie.
« Вполне понятно, что Httponly, безопасное печенье – это путь для хранения жетонов сеансов. Если у вас все еще есть какие-либо сомнения, это отвечает на все вопросы и уточняет общие заблуждения. »
Заключение
На основе конечных баллов (Cookie: 5; LocalStorage: 2), вполне понятно, что Httponly, Secure Cookies является правильным способом для хранения жетонов сеанса. Это также рекомендация от сообщества OWAPP [2].
Эта статья написана командой в Supertokens – Мы строим решение для управления сессионом, которое оптимизирует безопасность, разработчик и опыт работы пользователя. Если вам понравилась эта статья, вы также можете быть заинтересованы в:
- Вы используете JWTS для пользовательских сеансов правильно?
- Лучший способ надежно управлять сеансами пользователей
[1]: Типичный JWT содержит следующую информацию:
- МКС (эмитент): имя сайта (20 байтов – хороший верхний предел)
- Суб (предмет): 36 байт UUID
- AUD (аудитория): имя сайта (20 байтов – хороший верхний предел)
- Exp (Expirt): Timestamp: 13 байт
- NBF (не до времени): Timestamp: 13 байтов
- IAT (выпущено вовремя): Timestamp: 13 байт
- Пользовательские роли и информация: 200 байт Подробнее
Это в общей сложности 315 байтов. Заголовок JWT обычно составляет от 36 до 50 байтов, и, наконец, подпись составляет от 43 до 64 байта. Таким образом, это дает нам максимум 429 байтов, что потребовалось около 10% пространства cookie.
[2]: « не хранить идентификаторы сеанса в LocalStorage, поскольку данные всегда доступны JavaScript. Cookies может уменьшить этот риск, используя флаг HttPonly. ” Источник