← Назад к вопросам

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

2.0 Middle🔥 94 комментариев
#Клиент-серверная архитектура

Комментарии (4)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Анализ хранения JWT токенов на стороне клиента

В современных веб-приложениях JWT (JSON Web Token) действительно часто хранится на стороне клиента, так как это один из основных принципов stateless-аутентификации. Однако способ хранения имеет критическое значение для безопасности приложения.

Основные методы хранения токенов на клиенте

1. LocalStorage (или SessionStorage)

  • Преимущества: Простота реализации, токен доступен во всех вкладках приложения.
  • Недостатки: Уязвимость к XSS-атакам (Cross-Site Scripting). Злоумышленник может внедрить JavaScript-код, который получит доступ к localStorage.
// Пример сохранения токена в localStorage
const token = 'eyJhbGciOiJIUzI1NiIs...';
localStorage.setItem('jwt_token', token);

// Пример извлечения токена
const savedToken = localStorage.getItem('jwt_token');

2. HttpOnly Cookies

  • Преимущества: Защита от XSS-атак, так как JavaScript не имеет доступа к cookie с флагом HttpOnly.
  • Недостатки: Уязвимость к CSRF-атакам (требует дополнительной защиты), сложнее в настройке CORS.
// На сервере устанавливается cookie с HttpOnly флагом
app.post('/login', (req, res) => {
    const token = generateJWT();
    res.cookie('jwt_token', token, {
        httpOnly: true,
        secure: true, // Только по HTTPS
        sameSite: 'strict' // Защита от CSRF
    });
});

3. In-memory (хранилище в памяти JavaScript)

  • Преимущества: Максимальная защита от XSS (токен удаляется при закрытии вкладки).
  • Недостатки: Токен теряется при перезагрузке страницы, требуется повторная аутентификация.

Безопасная архитектура хранения токенов

Для enterprise-приложений я рекомендую гибридный подход:

Access Token + Refresh Token паттерн:

  • Короткоживущий Access Token (5-15 минут) хранится в памяти JavaScript
  • Долгоживущий Refresh Token хранится в HttpOnly cookie
  • При истечении Access Token используется Refresh Token для получения нового
// Пример работы с access и refresh токенами
class AuthService {
    constructor() {
        this.accessToken = null; // Хранится в памяти
    }
    
    async refreshAccessToken() {
        // Refresh token автоматически отправляется в cookie
        const response = await fetch('/api/refresh', {
            method: 'POST',
            credentials: 'include' // Включаем cookies
        });
        
        const data = await response.json();
        this.accessToken = data.accessToken; // Новый токен в памяти
    }
    
    async makeAuthenticatedRequest(url) {
        if (!this.accessToken) {
            await this.refreshAccessToken();
        }
        
        return fetch(url, {
            headers: {
                'Authorization': `Bearer ${this.accessToken}`
            }
        });
    }
}

Критические рекомендации по безопасности

Обязательные меры защиты:

  • Всегда используйте HTTPS для передачи токенов
  • Устанавливайте короткое время жизни access token
  • Реализуйте механизм отзыва refresh token
  • Используйте SameSite и Secure флаги для cookies
  • Регулярно обновляйте секретные ключи для подписи JWT

Защита от распространенных атак:

  • Внедрение CSP (Content Security Policy) для защиты от XSS
  • Использование CSRF-токенов при работе с cookies
  • Валидация origin/referer headers
  • Регулярный аудит зависимостей на уязвимости

Промышленные best practices

В моей практике для крупных финансовых приложений мы использовали:

  1. HttpOnly cookie для refresh token с strict sameSite политикой
  2. In-memory storage для access token с автоматическим refresh
  3. Дополнительная защита: fingerprint браузера, проверка IP-адреса
  4. Мониторинг аномалий: детектирование подозрительных запросов

Хранение токенов на клиенте — это компромисс между безопасностью и удобством. Выбор метода зависит от уровня чувствительности данных приложения. Для большинства SPA-приложений оптимальным является комбинация короткоживущего access token в памяти и защищенного refresh token в HttpOnly cookie с полным набором security headers и постоянным мониторингом угроз.

Хранил ли токет на стороне клиента | PrepBro