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.







