Как безопасно хранить токены аутентификации на стороне клиента?

«Как безопасно хранить токены аутентификации на стороне клиента?» — вопрос из категории Тестирование безопасности, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хранение токенов на стороне клиента требует соблюдения мер безопасности для минимизации рисков утечки. Основные подходы и их характеристики:

1. In-memory (переменные JavaScript)

  • Безопасность: Наиболее безопасный метод, так как токен недоступен для скриптов из других источников и не сохраняется на диске.
  • Недостаток: Токен теряется при обновлении страницы, что требует повторной аутентификации.
    let authToken = null; // Токен хранится только в памяти
    function setToken(token) {
    authToken = token;
    }

2. HttpOnly Cookies

  • Безопасность: Защищены от чтения через JavaScript (XSS), но уязвимы к CSRF-атакам.
  • Практика: Сервер должен устанавливать cookie с флагами Secure, HttpOnly и SameSite=Strict (или Lax).
    Set-Cookie: token=abc123; HttpOnly; Secure; SameSite=Strict

3. Web Storage (LocalStorage/SessionStorage)

  • Удобство: Простота использования и персистентность.
  • Риск: Уязвимы к XSS-атакам — злонамеренный скрипт может получить полный доступ к хранилищу.
    // Не рекомендуется для хранения чувствительных данных
    localStorage.setItem('token', 'abc123');

Рекомендации по безопасности:

  • Всегда используйте HTTPS.
  • Применяйте токены с коротким временем жизни (Access Token) и механизм Refresh Token для их обновления.
  • Для cookies используйте флаги Secure, HttpOnly и атрибут SameSite.
  • Реализуйте защиту от CSRF (например, с использованием anti-CSRF токенов).
  • Рассматривайте хранение в памяти как наиболее безопасный вариант для одностраничных приложений (SPA).