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

Как используются cookie?

1.0 Junior🔥 241 комментариев
#REST API и HTTP#Безопасность

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

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

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

Cookies: хранение состояния на клиенте

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

Как работают cookies

# На сервере (Flask пример):
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route("/login", methods=["POST"])
def login():
    user_id = authenticate(request.json)
    response = make_response({"status": "ok"})
    
    response.set_cookie(
        "session_id",
        value=f"sess_{user_id}",
        max_age=3600,
        secure=True,
        httponly=True,
        samesite="Strict"
    )
    
    return response

@app.route("/protected")
def protected():
    session_id = request.cookies.get("session_id")
    if validate_session(session_id):
        return {"data": "private"}
    return {"error": "unauthorized"}, 401

Жизненный цикл cookie

  1. Создание: Сервер отправляет заголовок Set-Cookie
  2. Сохранение: Браузер сохраняет файл на диск
  3. Отправка: При каждом запросе браузер отправляет Cookie заголовок
  4. Удаление: Когда max_age истечёт или expires достигнут

Основные атрибуты

response.set_cookie(
    "user_id",
    value="12345",
    max_age=86400,
    path="/api",
    domain=".example.com",
    secure=True,
    httponly=True,
    samesite="Strict"
)

Аутентификация (Session)

import secrets
from flask_session import Session

app.config["SESSION_TYPE"] = "filesystem"
Session(app)

@app.route("/login", methods=["POST"])
def login():
    session["user_id"] = user_id
    session["role"] = "admin"
    return {"status": "ok"}

@app.route("/profile")
def profile():
    user_id = session.get("user_id")
    if not user_id:
        return {"error": "not authenticated"}, 401
    return get_user_profile(user_id)

Tracking и Analytics

response.set_cookie(
    "tracking_id",
    value=secrets.token_hex(16),
    max_age=365*24*3600
)

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

Уязвимости:

  • XSS: JS может украсть cookie — используй httponly=True
  • CSRF: Запрос с другого сайта — используй samesite=Strict
  • Man-in-the-Middle: Cookie передаётся незашифрованно — используй secure=True (HTTPS)

Правильная защита:

response.set_cookie(
    "session_id",
    value=generate_secure_token(),
    max_age=3600,
    secure=True,
    httponly=True,
    samesite="Strict",
    path="/"
)

Token vs Cookie

Cookie автоматически отправляются браузером в каждом запросе, что удобно для аутентификации. Token (JWT) требует ручной отправки в Authorization header, но лучше работает с CORS и мобильными приложениями.

Cookie идеальны для традиционных web-приложений, token лучше для APIs и мобильных клиентов.

Как используются cookie? | PrepBro