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

Для чего нужны Cookies?

1.7 Middle🔥 181 комментариев
#REST API и HTTP#Безопасность

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Для чего нужны Cookies

Cookies (печенье) — это небольшие текстовые файлы, которые браузер хранит на компьютере пользователя и отправляет серверу с каждым запросом. Это основной механизм для сохранения состояния между HTTP запросами (так как сам HTTP протокол stateless).

Основная проблема, которую решают Cookies

HTTP протокол без памяти (stateless):

  • Запрос 1: POST /login {username: john, password: secret}
  • Ответ: 200 OK
  • Запрос 2: GET /profile
  • Сервер: Кто это? Я же не помню!

Cookies — это решение этой проблемы.

1. Аутентификация и сессии

Самое частое использование. Как это работает:

  1. Пользователь отправляет логин/пароль
  2. Сервер создаёт сессию в БД или Redis
  3. Сервер отправляет Set-Cookie header: session_id=abc123xyz
  4. Браузер автоматически сохраняет этот cookie
  5. При каждом новом запросе браузер отправляет: Cookie: session_id=abc123xyz
  6. Сервер проверяет session_id, достаёт пользователя из БД
from django.contrib.auth import authenticate, login
from django.http import HttpResponse

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)  # Django создаст session cookie
            return HttpResponse("Вы залогинены!")
        return HttpResponse("Неверные учётные данные")

2. Отслеживание активности пользователя

Google Analytics, Yandex Metrica создают cookie для отслеживания:

  • Сколько времени пользователь на сайте
  • Какие страницы он посещает
  • Куда он приходит и уходит

3. Сохранение предпочтений пользователя

from flask import Flask, request, Response
app = Flask(__name__)

@app.route('/set_theme')
def set_theme():
    theme = request.args.get('theme')  # dark или light
    response = Response(f"Тема установлена")
    response.set_cookie('theme', theme, max_age=365*24*60*60)
    return response

4. Временное хранилище данных

import json
@app.route('/cart/add')
def add_to_cart():
    product_id = request.args.get('product_id')
    cart = request.cookies.get('cart', '[]')
    cart_items = json.loads(cart)
    cart_items.append(product_id)
    response = Response("Добавлено в корзину")
    response.set_cookie('cart', json.dumps(cart_items))
    return response

Структура Cookie

Set-Cookie: name=value; Path=/; Domain=example.com; Expires=Wed, 09 Jun 2027 10:18:14 GMT; HttpOnly; Secure; SameSite=Strict

Компоненты:

  • name=value — имя и значение
  • Path=/admin — только для /admin пути
  • Domain=example.com — только для этого домена
  • Expires — дата истечения (absolute)
  • Max-Age — время жизни в секундах (relative)
  • HttpOnly — недоступен для JavaScript (защита от XSS)
  • Secure — передаётся только по HTTPS
  • SameSite=Strict|Lax|None — защита от CSRF

Типы Cookies

1. Session Cookies (без Expires) response.set_cookie('session_id', 'abc123') Удаляется при закрытии браузера

2. Persistent Cookies (с Expires) Остаётся на диске 365 дней и более

3. Secure Cookies (HTTPS only) Только по HTTPS, недоступен JS

Безопасность Cookies

XSS (Cross-Site Scripting) — если cookie не HttpOnly: Вредоносный JS может украсть cookie

Защита: response.set_cookie('session_id', session_id, httponly=True)

CSRF (Cross-Site Request Forgery) — если cookie отправляется на кроссдоменный запрос

Защита через SameSite: response.set_cookie('token', csrf_token, samesite='Strict')

Man-in-the-Middle — если cookie передаётся по HTTP

Защита через Secure: response.set_cookie('auth', token, secure=True)

Лучшие практики

response.set_cookie(
    'session_id',
    generate_secure_token(),
    max_age=3600,  # 1 час
    httponly=True,  # Защита от XSS
    secure=True,    # Только HTTPS
    samesite='Lax'  # Защита от CSRF
)

Альтернативы Cookies

1. Local Storage: localStorage.setItem('user_id', '12345'); Доступен только JS, не отправляется на сервер автоматически. Уязвим для XSS.

2. Session Storage: sessionStorage.setItem('token', 'abc123'); Удаляется при закрытии браузера

3. JWT в заголовке Authorization: Authorization: Bearer eyJhbGciOiJIUzI1NiIs... Требует явной отправки на каждый запрос. Идеален для SPA и мобильных приложений.

Итоги

Cookies нужны для:

  1. Аутентификации — помнить, кто вы
  2. Отслеживания — аналитика и реклама
  3. Персонализации — сохранение предпочтений
  4. Временного хранилища — корзина, черновики

Всегда используйте HttpOnly, Secure, и SameSite флаги. Никогда не сохраняйте чувствительные данные в plain text cookies. Используйте сессии на сервере или подписанные JWT токены.