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

Как происходит считывание данных с cookie?

1.8 Middle🔥 182 комментариев
#Браузер и сетевые технологии

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

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

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

Считывание данных с Cookie

Cookie - это небольшие текстовые данные, хранящиеся в браузере, которые отправляются с каждым запросом на сервер. Frontend разработчик должен знать, как их читать и управлять.

Основы Cookie

// Cookie хранит пары ключ=значение
// Формат: "name=value; expires=date; path=/; domain=.example.com; secure; samesite=strict"

// Примеры:
// sessionid=abc123def456; Path=/; HttpOnly
// theme=dark; Path=/; Expires=Wed, 09 Jun 2026 10:18:14 GMT
// user_id=12345; Path=/; SameSite=Strict; Secure

Чтение Cookie через document.cookie

// document.cookie - это строка всех доступных cookie
console.log(document.cookie);
// Результат: "theme=dark; sessionid=abc123; preferences=foo%3Dbar"

// Базовая функция для чтения одного cookie
function getCookie(name) {
  const nameEQ = name + "=";
  const cookies = document.cookie.split(';');
  
  for (let cookie of cookies) {
    cookie = cookie.trim();
    if (cookie.startsWith(nameEQ)) {
      return decodeURIComponent(cookie.substring(nameEQ.length));
    }
  }
  
  return null;
}

// Использование
const theme = getCookie('theme');
console.log(theme); // "dark"

const sessionId = getCookie('sessionid');
console.log(sessionId); // "abc123"

Чтение всех Cookie сразу

// Функция для получения объекта со всеми cookie
function getAllCookies() {
  const cookies = {};
  
  if (document.cookie === '') {
    return cookies;
  }
  
  document.cookie.split(';').forEach(cookie => {
    const [name, value] = cookie.trim().split('=');
    if (name && value) {
      cookies[name] = decodeURIComponent(value);
    }
  });
  
  return cookies;
}

// Использование
const allCookies = getAllCookies();
console.log(allCookies);
// { theme: 'dark', sessionid: 'abc123', preferences: 'foo=bar' }

Установка Cookie

// Записать cookie
function setCookie(name, value, days = 7) {
  const expires = new Date();
  expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
  
  document.cookie = \`\${name}=\${encodeURIComponent(value)};     expires=\${expires.toUTCString()};     path=/;     samesite=strict\`;
}

// Использование
setCookie('theme', 'dark', 30); // на 30 дней
setCookie('user_preferences', JSON.stringify({ lang: 'ru' }));

// Результат в document.cookie:
// "theme=dark; expires=Wed, 09 Jun 2026 10:18:14 GMT; path=/; samesite=strict"

Удаление Cookie

function deleteCookie(name) {
  setCookie(name, '', -1); // expires в прошлом = удаление
}

// Использование
deleteCookie('theme');

Ограничения Cookie

// Важные флаги при установке с сервера:
const cookieFlags = {
  "HttpOnly": "Не доступно из JavaScript (безопаснее для токенов)",
  "Secure": "Передаётся только по HTTPS",
  "SameSite=Strict": "Не отправляется при cross-site запросах (CSRF защита)",
  "SameSite=Lax": "Отправляется при top-level навигации",
  "Domain": "К какому домену относится",
  "Path": "К каким путям относится"
};

// ПРОБЛЕМА: JavaScript НЕ МОЖЕТ ЧИТАТЬ HttpOnly cookie!
// Зачем? Защита от XSS атак

// Сервер установил:
// Set-Cookie: sessionid=abc123; HttpOnly; Secure

// JavaScript не может прочитать:
console.log(document.cookie); // sessionid НЕ видна!

// Но браузер автоматически отправляет её в запросах:
fetch('https://api.example.com/user', {
  credentials: 'include'  // отправляет HttpOnly cookie
});

Практический пример: аутентификация

// 1. Сервер отправляет токен в HttpOnly cookie
// Set-Cookie: token=xyz789; HttpOnly; Secure; SameSite=Strict

// 2. JavaScript не может прочитать, но браузер отправляет

// 3. Для refresh token можем использовать обычный cookie
function setTokens(accessToken, refreshToken) {
  // Access token в памяти (не видно для XSS из других скриптов)
  localStorage.setItem('accessToken', accessToken);
  
  // Или HttpOnly cookie (сервер установит)
  // Set-Cookie: accessToken=...; HttpOnly
}

// 4. Проверка аутентификации
function isAuthenticated() {
  // Попробовать прочитать обычный cookie
  const session = getCookie('sessionid');
  return session !== null;
}

// 5. Logout
function logout() {
  deleteCookie('sessionid');
  localStorage.removeItem('accessToken');
}

Работа с complex данными в Cookie

// Cookie хранит только строки
// Для объектов нужно сериализовать

function setCookieJSON(name, obj, days = 7) {
  setCookie(name, JSON.stringify(obj), days);
}

function getCookieJSON(name) {
  const value = getCookie(name);
  return value ? JSON.parse(value) : null;
}

// Использование
const userPrefs = { theme: 'dark', language: 'ru', sidebar: true };
setCookieJSON('userPrefs', userPrefs);

// Позже прочитать
const prefs = getCookieJSON('userPrefs');
console.log(prefs.theme); // "dark"

Cookie vs LocalStorage vs SessionStorage

const comparison = {
  cookie: {
    размер: "4KB",
    отправляется_с_запросами: true,
    доступна_с_js: "только если не HttpOnly",
    время_жизни: "устанавливается явно",
    защита: "HttpOnly, Secure, SameSite"
  },
  
  localStorage: {
    размер: "5-10MB",
    отправляется_с_запросами: false,
    доступна_с_js: true,
    время_жизни: "бесконечно",
    защита: "не может быть защищено от XSS"
  },
  
  sessionStorage: {
    размер: "5-10MB",
    отправляется_с_запросами: false,
    доступна_с_js: true,
    время_жизни: "до закрытия таба",
    защита: "не может быть защищено от XSS"
  }
};

Best practices

const bestPractices = [
  "Используй HttpOnly для sensitive данных (токены)",
  "Всегда используй Secure флаг для HTTPS",
  "Используй SameSite=Strict для защиты от CSRF",
  "Не логируй cookie в console",
  "Ограничивай Domain и Path",
  "Регулярно очищай старые cookie",
  "Проверяй браузер поддерживает cookie (navigator.cookieEnabled)"
];

// Проверка поддержки
if (!navigator.cookieEnabled) {
  console.warn('Cookies are disabled!');
}

Cookie - это классический, но всё ещё активно используемый механизм хранения данных. Понимание их работы и ограничений - это базовый навык.