Как работать с HTTP cookies в 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.

Ответ 18+ 🔞

Давай разберём эту тему про куки, а то у некоторых в голове от неё каша, как у меня после вчерашнего застолья.

Смотри, куки — это такие маленькие бумажки-напоминалки, которые сервер тебе в браузер суёт, а ты их потом при каждом обращении обратно показываешь, типа «я свой, пустите». В Питоне с ними работать — как с картошкой: есть два способа — ты её ешь (клиент) или готовишь (сервер).

1. Ты — голодный клиент (хочешь куки)

Тут всё просто, как три копейки. Берёшь библиотеку requests — она твой лучший друг, лопата и сковородка в одном флаконе.

import requests

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

# Прикидываешься своим, подсовываешь свои куки
my_cookies = {'user_id': '123', 'session_token': 'xyzabc'}
response = requests.get(url, cookies=my_cookies)

# Сервер, такой доверчивый, тебе же их и возвращает
print("Ответ сервера:", response.json())

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

# Session — он как жадная сука, всё собирает и хранит
print("Cookies от сервера:", session.cookies.get_dict())

2. Ты — щедрый сервер (раздаёшь куки)

Тут уже надо мозги включать. Работаешь с http.cookies, это как на кухне с продуктами — всё по рецепту, а то отравишь клиента.

from http.cookies import SimpleCookie

# Начинаешь готовить печеньки для раздачи
cookie = SimpleCookie()
cookie['session_id'] = 'secret-token'
cookie['session_id']['path'] = '/'
cookie['session_id']['domain'] = '.example.com'
cookie['session_id']['max-age'] = 3600 # Жить будет час, не вечно же
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

Броня для печенек, или Как не стать раздатчиком отравы

А вот это, блядь, самое важное! Кидать куки без защиты — это как оставить ключи от квартиры в двери. Запомни три волшебных слова:

  • HttpOnly: Это чтоб какой-нибудь еблан через JavaScript не стырил твои куки. Включай всегда, если не хочешь стать жертвой XSS.
  • Secure: Эта штука велит браузеру таскать куку только по HTTPS. Без неё — всё летит открытым текстом, всем видно, позор на всю деревню.
  • SameSite: Настоящий спаситель от CSRF-атак, ёпта! Решает, посылать ли куки при запросах с других сайтов. Strict — никогда, Lax — только безопасные запросы, None — да похуй, но только с Secure.

Вот и вся наука. Главное — не забывай эти атрибуты ставить, а то потом будешь чесать репу, куда делась сессия пользователя.