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

Что такое флаг Secure в Cookie?

2.0 Middle🔥 151 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Флаг Secure в Cookie

Флаг Secure — это параметр при установке cookie, который гарантирует, что cookie будет передаваться только по HTTPS соединению, никогда по незащищённому HTTP. Это критическая мера безопасности для защиты authentication токенов и чувствительных данных.

Как работает Secure флаг?

Когда сервер устанавливает cookie с флагом Secure, браузер:

  1. Отправляет cookie только на HTTPS запросах
  2. Игнорирует попытки отправить cookie по HTTP
  3. Защищает от man-in-the-middle атак, когда перехватываются незащищённые каналы связи

Установка Secure флага на сервере

// Node.js с Express
res.cookie("sessionId", "token123", {
  secure: true,        // только HTTPS
  httpOnly: true,      // недоступна JavaScript (защита от XSS)
  sameSite: "Strict"   // защита от CSRF атак
});

// Результирующий HTTP Header:
// Set-Cookie: sessionId=token123; Secure; HttpOnly; SameSite=Strict

Почему это критично?

Сценарий БЕЗ Secure флага (уязвимо):

// Установка cookie
Set-Cookie: sessionId=abc123xyz; Path=/

// Проблема: Если пользователь подключен к открытой WiFi
// Атакующий может перехватить HTTP трафик и украсть sessionId
// Затем выдать себя за пользователя

С Secure флагом (защищено):

// Установка cookie
Set-Cookie: sessionId=abc123xyz; Secure; HttpOnly; Path=/

// Cookie отправляется ТОЛЬКО через HTTPS
// Даже если перехватить трафик, это зашифрованные данные
// sessionId невозможно украсть или подделать

Полный пример: Безопасная аутентификация

// Server-side (Node.js / Express)
app.post("/login", async (req, res) => {
  const user = await authenticateUser(req.body);
  
  if (!user) {
    return res.status(401).json({ error: "Invalid credentials" });
  }
  
  const jwtToken = generateJWT(user.id, user.email);
  
  // Устанавливаем secure cookie
  res.cookie("authToken", jwtToken, {
    secure: true,           // ✅ Только HTTPS
    httpOnly: true,         // ✅ Недоступна JavaScript (защита от XSS)
    sameSite: "Strict",     // ✅ Защита от CSRF
    maxAge: 3600000,        // 1 час в миллисекундах
    path: "/",
    domain: ".example.com"  // Ограничение домена
  });
  
  res.json({ message: "Logged in successfully" });
});

// Client-side (браузер)
// Cookie автоматически отправляется в каждом HTTPS запросе
fetch("https://api.example.com/profile", {
  method: "GET",
  credentials: "include"  // Включаем cookies в запрос
})
.then(res => res.json())
.then(data => console.log("Profile:", data));

Какие флаги использовать вместе с Secure?

ФлагПрименениеЗащита от
SecureТолько HTTPSПерехват по HTTP (man-in-the-middle)
HttpOnlyНедоступна JSXSS атаки (кража через JavaScript)
SameSite=StrictТолько same-siteCSRF атаки (подделка запросов)
Max-AgeВремя жизниНеограниченный доступ
DomainОграничение доменаУтечка на другие домены

Как браузер обрабатывает Secure флаг?

// Находясь на https://example.com

// ✅ Запрос по HTTPS - cookie отправляется
fetch("https://example.com/api/data", { credentials: "include" });
// Request Header: Cookie: authToken=abc123xyz;

// ❌ Запрос по HTTP - cookie НЕ отправляется
fetch("http://example.com/api/data", { credentials: "include" });
// Request Header: Cookie: (пусто)

Локальная разработка

На localhost при разработке ты можешь отключить Secure флаг:

// Конфигурация для разработки и продакшена
res.cookie("token", jwtToken, {
  secure: process.env.NODE_ENV === "production", // true только в prod
  httpOnly: true,
  sameSite: "Lax",  // Lax более удобен для разработки
  maxAge: 3600000
});

Запомни: Secure флаг — это базовый стандарт безопасности. В production ОБЯЗАТЕЛЬНО комбинируй его с HttpOnly и SameSite для максимальной защиты от распространённых веб-атак.