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

    Rack de servidores que representa conexiones HTTP de bajo nivel con http.client en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    http.client en Python: HTTP de bajo nivel

    Aprende http.client en Python para controlar conexiones HTTP y HTTPS, streaming, headers, TLS, reutilización, límites y errores.

    Ler mais

    Tempo de leitura: 4 minutos
    20/08/2026
    Teclas formando HTTP que representan solicitudes con urllib.request en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    urllib.request en Python: HTTP nativo

    Aprende urllib.request en Python para GET, POST, JSON y descargas con timeout, TLS, redirects, proxies, límites y manejo de errores.

    Ler mais

    Tempo de leitura: 4 minutos
    19/08/2026
    Cables Ethernet conectados que representan servidores de red con socketserver en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    socketserver en Python: crea servidores

    Aprende socketserver en Python para crear servidores TCP y UDP con handlers, concurrencia, límites, timeouts y apagado seguro.

    Ler mais

    Tempo de leitura: 5 minutos
    19/08/2026
    Sala de servidores iluminada que representa conexiones TLS seguras con ssl en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ssl en Python: conexiones TLS seguras

    Aprende ssl en Python para crear clientes y servidores TLS, validar certificados y hostname, configurar CA, versiones mínimas y mTLS.

    Ler mais

    Tempo de leitura: 5 minutos
    19/08/2026
    Pantalla de verificación de cuenta que representa autenticación de mensajes con HMAC en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    HMAC en Python: autentica mensajes

    Aprende HMAC en Python para firmar y validar webhooks, archivos y mensajes con SHA-256, claves seguras y comparación resistente a

    Ler mais

    Tempo de leitura: 5 minutos
    19/08/2026
    Lector de huella digital que representa verificación de hashes con hashlib en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    hashlib en Python: hashes seguros

    Aprende hashlib en Python para calcular SHA-256, verificar archivos, usar BLAKE2, derivar claves y evitar errores comunes de seguridad.

    Ler mais

    Tempo de leitura: 5 minutos
    19/08/2026