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

Что такое куки?

3.0 Senior🔥 61 комментариев
#Тестирование

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

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

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

Куки (Cookies)

Что это такое?

Куки (cookies) — это небольшие файлы текстовых данных, которые веб-браузер сохраняет на компьютере пользователя. Сервер отправляет куки клиенту через HTTP заголовок Set-Cookie, а браузер автоматически отправляет их обратно серверу в каждом HTTP запросе в заголовке Cookie.

Куки используются для сохранения информации о пользователе между посещениями и для отслеживания его активности.

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

1. Name — имя куки 2. Value — значение куки 3. Domain — домен, для которого действует куки 4. Path — путь, для которого действует куки 5. Expires — дата истечения куки 6. Max-Age — максимальный возраст куки в секундах 7. Secure — передавать только по HTTPS 8. HttpOnly — недоступна для JavaScript 9. SameSite — защита от CSRF атак (Strict, Lax, None)

Пример HTTP заголовков

Сервер отправляет куки:

HTTP/1.1 200 OK
Set-Cookie: session_id=abc123; Path=/; Expires=Wed, 01 Jan 2025 00:00:00 GMT; Secure; HttpOnly
Set-Cookie: user_preferences=dark_mode; Path=/; Max-Age=31536000

Браузер отправляет куки обратно:

GET /api/user HTTP/1.1
Host: example.com
Cookie: session_id=abc123; user_preferences=dark_mode

Работа с куками на сервере (Python + FastAPI)

Отправка куки клиенту:

from fastapi import FastAPI
from fastapi.responses import JSONResponse
from datetime import datetime, timedelta

app = FastAPI()

@app.post("/login")
async def login(username: str):
    response = JSONResponse({"status": "logged_in"})
    
    # Установка куки
    response.set_cookie(
        key="session_id",
        value="abc123xyz",
        max_age=3600,  # 1 час
        secure=True,   # Только по HTTPS
        httponly=True, # Недоступна для JavaScript
        samesite="Strict"  # CSRF защита
    )
    
    return response

Чтение куки из запроса:

from fastapi import FastAPI, Cookie

@app.get("/profile")
async def get_profile(session_id: str = Cookie(None)):
    if session_id is None:
        return {"error": "Not authenticated"}
    
    # Проверяем сессию
    if validate_session(session_id):
        return {"username": "alice", "role": "admin"}
    
    return {"error": "Invalid session"}

Удаление куки:

@app.post("/logout")
async def logout():
    response = JSONResponse({"status": "logged_out"})
    response.delete_cookie(key="session_id")
    return response

Использование requests для работы с куками

Сохранение куки в сессии:

import requests

# Создание сессии (автоматически сохраняет куки)
session = requests.Session()

# Первый запрос (получаем куки)
response = session.post(
    "https://api.example.com/login",
    json={"username": "alice", "password": "secret"}
)

# Второй запрос (куки отправляются автоматически)
response = session.get("https://api.example.com/profile")
print(response.json())  # {"username": "alice"}

Прямое управление куками:

import requests

# Создание запроса с явными куками
cookies = {
    "session_id": "abc123",
    "user_preference": "dark_mode"
}

response = requests.get(
    "https://api.example.com/data",
    cookies=cookies
)

# Получение куки из ответа
for cookie in response.cookies:
    print(f"{cookie.name}: {cookie.value}")

Работа с куками на клиенте (JavaScript)

// Установка куки
document.cookie = "username=alice; path=/; max-age=3600";

// Получение всех куки
console.log(document.cookie);

// Удаление куки
document.cookie = "username=; max-age=0";

Виды куки

1. Сессионные куки (Session Cookies) Удаляются при закрытии браузера:

# Без параметра max_age или expires
response.set_cookie("session_id", "abc123")

2. Постоянные куки (Persistent Cookies) Остаются на компьютере до истечения срока:

from datetime import datetime, timedelta

expires = datetime.utcnow() + timedelta(days=30)
response.set_cookie(
    "remember_me",
    "true",
    expires=expires
)

3. Куки первой стороны (First-Party Cookies) Устанавливаются доменом, который посещает пользователь.

4. Куки третей стороны (Third-Party Cookies) Устанавливаются другими доменами (для рекламы, аналитики).

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

from fastapi import FastAPI, HTTPException, Cookie, Response
from datetime import datetime, timedelta
import jwt

app = FastAPI()
SECRET_KEY = "your-secret-key"

@app.post("/login")
async def login(username: str, password: str):
    # Проверка учетных данных
    if not verify_credentials(username, password):
        raise HTTPException(status_code=401, detail="Invalid credentials")
    
    # Создание JWT токена
    payload = {
        "sub": username,
        "exp": datetime.utcnow() + timedelta(hours=24)
    }
    token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
    
    # Отправка в куки
    response = Response({"status": "success"})
    response.set_cookie(
        key="access_token",
        value=token,
        max_age=86400,  # 24 часа
        secure=True,
        httponly=True,
        samesite="Strict"
    )
    
    return response

@app.get("/protected")
async def protected_route(access_token: str = Cookie(None)):
    if not access_token:
        raise HTTPException(status_code=401, detail="Not authenticated")
    
    try:
        payload = jwt.decode(access_token, SECRET_KEY, algorithms=["HS256"])
        username = payload.get("sub")
        return {"message": f"Hello, {username}!"}
    except jwt.InvalidTokenError:
        raise HTTPException(status_code=401, detail="Invalid token")

Безопасность куки

1. HttpOnly флаг — предотвращает доступ из JavaScript:

response.set_cookie(
    "session_id",
    value,
    httponly=True  # Защита от XSS атак
)

2. Secure флаг — отправка только по HTTPS:

response.set_cookie(
    "session_id",
    value,
    secure=True  # Защита при передаче
)

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

# Strict - не отправляются при переходе с других сайтов
response.set_cookie(
    "session_id",
    value,
    samesite="Strict"
)

# Lax - отправляются при переходах, но не при POST
# None - отправляются всегда (требует Secure)

Примеры реальных куки

Google Analytics:

_ga=GA1.2.1234567890.1234567890
_gid=GA1.2.9876543210.0987654321

Session ID:

php_session_id=abc123def456ghi789

Preferences:

theme=dark
language=ru
timezone=Europe/Moscow

Когда использовать куки?

Используйте куки для:

  • Хранения session ID
  • Сохранения пользовательских настроек
  • Отслеживания действий пользователя
  • Аутентификации (с токеном в куки)
  • Запоминания выбора пользователя

Не используйте куки для:

  • Хранения чувствительных данных (пароли, токены доступа)
  • Больших объёмов данных (максимум 4 KB)
  • Данных, требующих частых обновлений (используйте sessionStorage)

Альтернативы куки

Local Storage (только на клиенте):

localStorage.setItem('username', 'alice');
let username = localStorage.getItem('username');

Session Storage (только на клиенте, удаляется при закрытии):

sessionStorage.setItem('temp_data', 'value');

JWT в заголовке Authorization:

@app.get("/data")
async def get_data(authorization: str = Header(None)):
    if authorization:
        token = authorization.replace("Bearer ", "")
        # Проверка JWT

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

Что такое куки? | PrepBro