Где можно хранить JWT токен на клиенте?

«Где можно хранить JWT токен на клиенте?» — вопрос из категории Безопасность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор места хранения JWT на клиенте — это компромисс между безопасностью и удобством. Вот основные варианты, отсортированные от наиболее до наименее безопасных:

1. HTTP-Only Cookie (Рекомендуемый способ для веб-приложений)

  • Как: Сервер устанавливает cookie с флагами HttpOnly, Secure, SameSite=Strict.
  • Плюсы: Недоступен для JavaScript, что защищает от XSS-атак. Автоматически отправляется браузером с каждым запросом.
  • Минусы: Требует защиты от CSRF-атак (используйте анти-CSRF токены).

2. In-Memory (Переменная JavaScript)

  • Как: Токен сохраняется в переменной (например, в замыкании, состоянии SPA-фреймворка) после логина.
  • Плюсы: Максимальная защита от XSS, так как токен не сохраняется персистентно и очищается при закрытии вкладки.
  • Минусы: Пользователь должен логиниться заново после обновления страницы. Не подходит для PWA или фоновых обновлений.

3. Session Storage

  • Как: sessionStorage.setItem('jwt', token)
  • Плюсы: Данные живут только в рамках вкладки браузера, очищаются после её закрытия.
  • Минусы: Уязвим к XSS (скрипт может прочитать токен). Не сохраняется между сессиями.

4. Local Storage (Наименее безопасный)

  • Как: localStorage.setItem('jwt', token)
  • Плюсы: Простота, токен сохраняется после закрытия браузера.
  • Минусы: Крайне уязвим к XSS. Любой успешный XSS-скрипт получит доступ к токену. Не рекомендуется для хранения чувствительных данных.

Практический совет: Для SPA (React, Angular, Vue) предпочтительна комбинация:

  1. Использовать HTTP-Only Cookie для Access Token.
  2. Хранить в памяти или sessionStorage только идентификатор пользователя или роли для UI-логики.
  3. Реализовать механизм Refresh Tokens (также в HTTP-Only cookie) для получения новых Access Tokенов без повторного логина.