Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Для чего нужны Cookies
Cookies (печенье) — это небольшие текстовые файлы, которые браузер хранит на компьютере пользователя и отправляет серверу с каждым запросом. Это основной механизм для сохранения состояния между HTTP запросами (так как сам HTTP протокол stateless).
Основная проблема, которую решают Cookies
HTTP протокол без памяти (stateless):
- Запрос 1: POST /login {username: john, password: secret}
- Ответ: 200 OK
- Запрос 2: GET /profile
- Сервер: Кто это? Я же не помню!
Cookies — это решение этой проблемы.
1. Аутентификация и сессии
Самое частое использование. Как это работает:
- Пользователь отправляет логин/пароль
- Сервер создаёт сессию в БД или Redis
- Сервер отправляет Set-Cookie header: session_id=abc123xyz
- Браузер автоматически сохраняет этот cookie
- При каждом новом запросе браузер отправляет: Cookie: session_id=abc123xyz
- Сервер проверяет 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 нужны для:
- Аутентификации — помнить, кто вы
- Отслеживания — аналитика и реклама
- Персонализации — сохранение предпочтений
- Временного хранилища — корзина, черновики
Всегда используйте HttpOnly, Secure, и SameSite флаги. Никогда не сохраняйте чувствительные данные в plain text cookies. Используйте сессии на сервере или подписанные JWT токены.