Как работать с HTTP cookies в Python?

«Как работать с HTTP cookies в Python?» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP cookies — это небольшие фрагменты данных, которые сервер отправляет клиенту (браузеру), а клиент сохраняет и отправляет обратно с каждым последующим запросом. В Python работа с cookies зависит от того, действуете ли вы как клиент или как сервер.

1. Клиентская сторона (отправка и получение запросов)

Для HTTP-клиентов удобнее всего использовать библиотеку requests.

import requests

url = 'https://httpbin.org/cookies'

# Отправка cookies на сервер
my_cookies = {'user_id': '123', 'session_token': 'xyzabc'}
response = requests.get(url, cookies=my_cookies)

# Сервер вернет отправленные cookies
print("Ответ сервера:", response.json())

# Получение cookies, установленных сервером
session = requests.Session()
response_from_server = session.get('https://httpbin.org/cookies/set/framework/fastapi')

# requests.Session автоматически сохраняет и использует cookies
print("Cookies от сервера:", session.cookies.get_dict())

2. Серверная сторона (обработка запросов)

На сервере (например, в веб-фреймворке) используется стандартный модуль http.cookies для парсинга заголовка Cookie от клиента и формирования заголовка Set-Cookie для ответа.

from http.cookies import SimpleCookie

# Пример формирования заголовка Set-Cookie для отправки клиенту
cookie = SimpleCookie()
cookie['session_id'] = 'secret-token'
cookie['session_id']['path'] = '/'
cookie['session_id']['domain'] = '.example.com'
cookie['session_id']['max-age'] = 3600 # 1 час
cookie['session_id']['httponly'] = True
cookie['session_id']['samesite'] = 'Lax'

# Вывод сгенерированной строки для заголовка
print(cookie.output())
# Вывод: Set-Cookie: session_id=secret-token; Domain=.example.com; Max-Age=3600; Path=/; SameSite=Lax; HttpOnly

Атрибуты безопасности Cookies

При установке cookies важно использовать атрибуты для защиты от атак:

  • HttpOnly: Запрещает доступ к cookie из JavaScript на клиенте. Это защищает от XSS-атак, направленных на кражу cookie.
  • Secure: Указывает браузеру отправлять cookie только по зашифрованному HTTPS-соединению.
  • SameSite: Контролирует, когда cookie отправляются с межсайтовыми запросами, что является основной защитой от CSRF-атак. Значения: Strict, Lax, None.