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

Что такое HTTPS-cookie?

1.0 Junior🔥 231 комментариев
#Браузер и сетевые технологии

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

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

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

HTTPS Cookie и флаги безопасности

По вопросу об HTTPS-cookie имеется в виду Secure cookie — это cookie, которая передаётся только по HTTPS соединению. Однако есть и другие важные флаги для работы с cookies: Secure, HttpOnly и SameSite.

Что такое Secure флаг

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

// Установка cookie с Secure флагом (на сервере)
Set-Cookie: sessionId=abc123; Secure

// Если сайт на http://example.com, cookie с Secure НЕ будет сохранена
// Если сайт на https://example.com, cookie БУДЕТ сохранена
// И будет передаваться только через HTTPS

Все флаги безопасности для cookies

1. Secure — передача только по HTTPS

// На сервере (Node.js/Express)
response.cookie('sessionId', 'abc123', {
  secure: true // Только HTTPS
});

// HTTP заголовок
Set-Cookie: sessionId=abc123; Secure

2. HttpOnly — недоступна для JavaScript

// На сервере
response.cookie('sessionId', 'abc123', {
  httpOnly: true // Недоступна для document.cookie
});

// На клиенте
console.log(document.cookie); // sessionId НЕ появится здесь
// Защита от XSS атак!

3. SameSite — защита от CSRF атак

// На сервере
response.cookie('sessionId', 'abc123', {
  sameSite: 'Strict' // или 'Lax', или 'None'
});

// HTTP заголовок
Set-Cookie: sessionId=abc123; SameSite=Strict

4. Domain и Path — область действия

// На сервере
response.cookie('sessionId', 'abc123', {
  domain: 'example.com',   // Какой домен может использовать
  path: '/api'              // Только для URL содержащих /api
});

// HTTP заголовок
Set-Cookie: sessionId=abc123; Domain=example.com; Path=/api

5. Max-Age и Expires — время жизни

// На сервере
response.cookie('sessionId', 'abc123', {
  maxAge: 1000 * 60 * 60 * 24 // 24 часа в миллисекундах
});

// Или через Expires
response.cookie('sessionId', 'abc123', {
  expires: new Date(Date.now() + 1000 * 60 * 60 * 24)
});

// HTTP заголовок
Set-Cookie: sessionId=abc123; Max-Age=86400

Полный пример безопасной cookie

// На сервере (Node.js/Express)
response.cookie('sessionId', 'secure-token-value', {
  secure: true,      // Только HTTPS
  httpOnly: true,    // Недоступна для JS
  sameSite: 'Strict', // Защита от CSRF
  maxAge: 1000 * 60 * 60 * 24, // 24 часа
  domain: 'example.com',
  path: '/'
});

// HTTP заголовок
Set-Cookie: sessionId=secure-token-value; Secure; HttpOnly; SameSite=Strict; Max-Age=86400; Domain=example.com; Path=/

Варианты SameSite

Strict — самый защищённый

// Cookie НЕ отправляется даже при переходах со ссылок с других сайтов
// Пример: пользователь кликнул ссылку на example.com со стороннего сайта
// Cookie sessionId НЕ будет отправлена
Set-Cookie: sessionId=value; SameSite=Strict

Lax — баланс между безопасностью и удобством

// Cookie отправляется при переходах по ссылкам и редиректах
// Но НЕ отправляется при CORS запросах с других сайтов
// Это дефолт в современных браузерах
Set-Cookie: sessionId=value; SameSite=Lax

None — отправляется везде (требует Secure!)

// Cookie отправляется везде, включая CORS запросы
// ОБЯЗАТЕЛЕН флаг Secure (только HTTPS)
// Используется для третьесторонних сервисов
Set-Cookie: sessionId=value; SameSite=None; Secure

Практические примеры

Пример 1: Сессия пользователя (максимальная безопасность)

// На сервере (Node.js/Express)
app.post('/login', (req, res) => {
  const user = authenticateUser(req.body);
  
  res.cookie('sessionId', generateSessionToken(), {
    secure: true,       // Только HTTPS
    httpOnly: true,     // Нельзя украсть через JS
    sameSite: 'Strict', // Защита от CSRF
    maxAge: 1000 * 60 * 60 * 24 // 1 день
  });
  
  res.json({ success: true });
});

// На клиенте
// Браузер АВТОМАТИЧЕСКИ отправит cookie при запросах к серверу
const response = await fetch('/api/user', {
  credentials: 'include' // Отправить cookies
});

Пример 2: Отслеживающая cookie (для третьесторонних сервисов)

// На сервере
res.cookie('tracking_id', 'abc123', {
  secure: true,
  sameSite: 'None',   // Разрешить CORS
  maxAge: 1000 * 60 * 60 * 24 * 365 // 1 год
});

Пример 3: Предпочтения пользователя (низкая безопасность)

// На сервере
res.cookie('theme', 'dark', {
  maxAge: 1000 * 60 * 60 * 24 * 365 // 1 год
  // Secure, HttpOnly, SameSite не критичны
});

// На клиенте - можно прочитать
console.log(document.cookie); // 'theme=dark'

Ошибки при работе с cookies

Ошибка 1: Отправка sensitive данных в обычной cookie

// ПЛОХО
response.cookie('password', userPassword); // Видна в исходном коде!
response.cookie('token', jwtToken); // Доступна для XSS атак

// ХОРОШО
response.cookie('sessionId', sessionToken, {
  secure: true,
  httpOnly: true,
  sameSite: 'Strict'
});

Ошибка 2: Не использовать Secure на production

// ПЛОХО - на production
if (process.env.NODE_ENV === 'production') {
  response.cookie('sessionId', token); // Без Secure!
}

// ХОРОШО
response.cookie('sessionId', token, {
  secure: process.env.NODE_ENV === 'production'
});

Ошибка 3: Забыть credentials при CORS запросах

// ПЛОХО - cookie не отправится
const response = await fetch('https://api.example.com/data');

// ХОРОШО - отправить cookie
const response = await fetch('https://api.example.com/data', {
  credentials: 'include' // include, same-origin, omit
});

Проверка cookies в браузере

// Прочитать все cookies
console.log(document.cookie); // ТОЛЬКО если НЕ HttpOnly

// В DevTools
// Application tab -> Cookies -> видны все cookies
// Столбец 'HttpOnly' показывает защищены ли от JS
// Столбец 'Secure' показывает только ли по HTTPS

Вывод

HTTPS Cookie с флагами безопасности:

  • Secure — передача только по HTTPS
  • HttpOnly — защита от XSS (скрывает от JavaScript)
  • SameSite — защита от CSRF (контролирует когда отправляется)

Для чувствительных данных (сессии, токены) ВСЕГДА используйте все три флага. Это стандарт безопасности в современных приложениях.