http.cookiejar en Python: gestiona cookies

Publicado el: 20/08/2026
Tempo de leitura: 5 minutos
Persona usando un portátil en una sesión web que representa cookies con http.cookiejar en Python

El módulo http.cookiejar gestiona cookies automáticamente en clientes HTTP. Extrae valores de cabeceras Set-Cookie, decide si deben aceptarse, los almacena y añade el encabezado Cookie a solicitudes futuras compatibles con dominio, ruta, expiración y política.

Esto permite mantener sesiones de login y preferencias con urllib.request. Un cookie de sesión puede equivaler a una contraseña temporal, por lo que persistencia, logs, compartición y políticas de dominio son decisiones de seguridad.

CookieJar con urllib.request

import http.cookiejar
import urllib.request

jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(
    urllib.request.HTTPCookieProcessor(jar),
)

with opener.open("https://example.com/", timeout=10) as response:
    response.read(100_000)

for cookie in jar:
    print(cookie.name, cookie.domain, cookie.path)

HTTPCookieProcessor extrae cookies permitidos y los devuelve en solicitudes posteriores. Reutiliza el mismo opener durante la sesión. Consulta urllib.request en Python.

Cómo se seleccionan los cookies

Cada cookie contiene nombre, valor, dominio, ruta, flag secure, expiración y otros atributos. El jar solo lo envía cuando la política considera el destino compatible.

for cookie in jar:
    print({
        "name": cookie.name,
        "domain": cookie.domain,
        "path": cookie.path,
        "secure": cookie.secure,
        "expires": cookie.expires,
        "session": cookie.discard,
    })

No imprimas el valor. Tokens de autenticación, sesión o CSRF pueden estar dentro. Los logs deben incluir únicamente metadatos necesarios.

Cookies Secure y HTTPS

Los cookies marcados Secure solo deben enviarse por protocolos seguros, normalmente HTTPS y WSS. Toda sesión autenticada debe usar HTTPS con certificado y hostname validados.

La guía de ssl en Python explica la validación TLS. No desactives certificados para resolver un problema de sesión.

Enviar un formulario de login

from urllib.parse import urlencode
from urllib.request import Request

form = urlencode({
    "username": username,
    "password": password,
}).encode("utf-8")

request = Request(
    "https://example.com/login",
    data=form,
    headers={"Content-Type": "application/x-www-form-urlencoded"},
    method="POST",
)

with opener.open(request, timeout=10) as response:
    body = response.read(200_000)

No supongas que el login funcionó solo porque apareció un cookie. Valida estado, URL final y contenido esperado. Las credenciales deben proceder de una entrada protegida o secret manager.

Tokens CSRF

Muchos sitios requieren un token CSRF presente en HTML o cookie. El jar solo transporta cookies; no descubre automáticamente el token ni proporciona protección CSRF al servidor.

Un flujo habitual abre el formulario, extrae el token, envía token y credenciales, valida la respuesta y conserva la sesión. Prefiere una API oficial cuando exista.

Política por dominio

from http.cookiejar import CookieJar, DefaultCookiePolicy

policy = DefaultCookiePolicy(
    allowed_domains=["example.com", ".example.com"],
    blocked_domains=["ads.example.com"],
    strict_ns_domain=DefaultCookiePolicy.DomainStrict,
)

jar = CookieJar(policy)

Las entradas con punto inicial incluyen subdominios más específicos según las reglas del módulo. Prueba la política con hosts reales. Una allowlist reduce fugas, pero no reemplaza validación de URL y TLS.

Cookies de sesión y persistentes

Los cookies sin expiración suelen tener discard=True. Elimínalos con:

jar.clear_session_cookies()

Un CookieJar en memoria desaparece al terminar el proceso. Usa una subclase de FileCookieJar solo cuando necesites persistencia.

MozillaCookieJar

from pathlib import Path
from http.cookiejar import MozillaCookieJar

cookie_path = Path("cookies.txt")
jar = MozillaCookieJar(cookie_path)

if cookie_path.exists():
    jar.load(ignore_discard=False, ignore_expires=False)

jar.save(ignore_discard=False, ignore_expires=False)

El formato interoperable cookies.txt puede perder atributos modernos. Haz backup antes de reescribir un archivo importante.

LWPCookieJar

LWPCookieJar usa Set-Cookie3, un formato legible que conserva más información del módulo.

from http.cookiejar import LWPCookieJar
jar = LWPCookieJar("session.cookies")

Elige por interoperabilidad. Ningún formato es una caja fuerte.

Proteger el archivo

import os
from pathlib import Path

path = Path("session.cookies")
path.touch(mode=0o600, exist_ok=True)
os.chmod(path, 0o600)

Usa controles equivalentes en otros sistemas. Evita carpetas públicas, artefactos compartidos e imágenes de contenedor. En alto riesgo, evita persistencia o cifra con gestión correcta de claves.

Cargar y revertir

load() mezcla cookies del archivo con el estado actual. revert() limpia y recarga de forma transaccional.

try:
    jar.revert()
except (OSError, http.cookiejar.LoadError) as error:
    raise RuntimeError("Archivo de cookies inválido") from error

No actives ignore_expires o ignore_discard sin entender que conservarás cookies expirados o de sesión.

Limpieza selectiva

jar.clear("example.com", "/", "sessionid")
jar.clear()  # todo

clear() puede lanzar KeyError. En logout, llama también al endpoint del servidor para invalidar la sesión remota.

Expiración

El jar elimina cookies expirados cuando corresponde. Consulta cookie.is_expired(). No modifiques expiración para prolongar una sesión: el servidor puede mantener su propia validez.

SameSite y atributos modernos

http.cookiejar se diseñó alrededor de protocolos Netscape, RFC 2109 y RFC 2965. Puede conservar atributos modernos como valores no estándar, pero no reproduce todo el modelo de aislamiento de un navegador actual.

if cookie.has_nonstandard_attr("SameSite"):
    print(cookie.get_nonstandard_attr("SameSite"))

No asumas garantías equivalentes a Chrome o Firefox. Para automatización real de navegador, usa una herramienta que implemente el modelo moderno.

Cookies de terceros

La política incluye conceptos de origen y transacción no verificable, pero descargar subrecursos manualmente no equivale a navegar. Usa jars separados o allowlists estrictas para evitar enviar cookies a dominios innecesarios.

Concurrencia

No compartas un jar mutable entre hilos sin coordinación. Protege secuencias de apertura y guardado con un lock o usa una sesión por worker. Guarda en temporal y reemplaza atómicamente.

Importar cookies del navegador

Copiar cookies puede exponer sesiones personales y sobrescribir datos. Nunca accedas a perfiles sin consentimiento. Los navegadores modernos utilizan bases de datos y cifrado que MozillaCookieJar no entiende automáticamente.

Prefiere APIs oficiales

Usa tokens API, OAuth o cuentas de servicio cuando estén disponibles. Automatizar formularios es frágil, puede violar términos y debe seguir CSRF, MFA y cambios de HTML. Consulta la guía de integración de APIs con Python.

Errores comunes

Los fallos frecuentes son registrar valores, guardar con permisos abiertos, aceptar expirados, compartir jar entre usuarios, ignorar dominio, asumir soporte completo de SameSite, desactivar TLS, guardar sesiones descartables y tratar cualquier cookie como prueba de login.

Buenas prácticas

Usa HTTPS validado, un jar por identidad, allowlist de dominios, timeouts y límites HTTP. Mantén cookies en memoria cuando sea posible. Protege archivos persistentes, no guardes cookies descartables sin necesidad y limpia sesiones local y remotamente.

Conclusión

http.cookiejar integra sesiones basadas en cookies con clientes estándar y ofrece políticas y persistencia. La comodidad implica responsabilidad: los cookies autenticados son secretos, los archivos pueden filtrar sesiones y el modelo no equivale a un navegador moderno. Usa alcance mínimo, TLS y almacenamiento protegido.

Consulta la documentación oficial de http.cookiejar y el RFC 6265.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Desarrollador configurando un servidor HTTPS y certificado TLS con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    HTTPSServer: crea un servidor HTTPS local en Python

    Aprende HTTPSServer en Python para crear servicios HTTPS locales, configurar certificados, usar hilos y comprender sus límites.

    Ler mais

    Tempo de leitura: 4 minutos
    08/10/2026
    Archivos protegidos que representan extracción segura de TAR con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    tarfile extraction_filter: extrae TAR con seguridad

    Aprende tarfile extraction_filter en Python para extraer archivos TAR con validación, seguridad y control de rutas.

    Ler mais

    Tempo de leitura: 6 minutos
    08/10/2026
    Código Python mostrando avisos controlados con catch_warnings
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    catch_warnings: captura warnings en pruebas Python

    Aprende catch_warnings en Python para capturar, probar y controlar avisos con filtros específicos y alcance seguro.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código Python que representa referencias persistentes de pickle
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    pickle persistent_id: serializa referencias externas

    Aprende pickle persistent_id en Python para referencias externas estables, validación, seguridad, rendimiento y compatibilidad.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código binario que representa buffers y vistas de memoria en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    memoryview.count: cuenta valores sin copiar buffers

    Aprende memoryview.count en Python para contar bytes y valores en buffers sin copias, con formatos, límites y buenas prácticas.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026
    Código Python y anotaciones de tipos
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    annotationlib: evita imports circulares en anotaciones

    Aprende annotationlib en Python para inspeccionar anotaciones diferidas, evitar imports circulares y crear herramientas seguras.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026