Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Куки (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
Куки — это фундаментальный механизм веб-приложений для сохранения состояния между запросами. Правильное использование куки с учётом безопасности критически важно для создания надёжных и защищённых веб-приложений.