http.cookiejar no Python: gerencie cookies

Publicado em: 20/08/2026
Tempo de leitura: 6 minutos
Pessoa usando laptop em uma sessão web representando cookies com http.cookiejar no Python

O módulo http.cookiejar gerencia cookies automaticamente em clientes HTTP. Ele recebe valores de cabeçalhos Set-Cookie, decide se devem ser aceitos, armazena-os e adiciona o cabeçalho Cookie às requisições futuras compatíveis com domínio, caminho, expiração e política.

Essa funcionalidade permite manter sessões de login, preferências e fluxos de navegação usando urllib.request. Entretanto, um cookie de sessão pode equivaler a uma senha temporária. Persistência, logs, compartilhamento entre processos e políticas de domínio precisam ser tratados como decisões de segurança.

CookieJar com 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 extrai cookies das respostas e devolve os cookies permitidos nas próximas requisições. Use o mesmo opener durante toda a sessão.

O guia de urllib.request no Python apresenta timeouts, limites, TLS e erros HTTP.

Um cookie possui nome, valor, domínio, caminho, flag secure, expiração e outros atributos. O jar só envia cookies quando a política considera o destino compatível.

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

Evite imprimir o valor. Tokens de sessão, CSRF e autenticação podem estar dentro dele. Logs devem conter somente metadados necessários.

Cookies Secure e HTTPS

Cookies marcados como Secure devem ser enviados somente por protocolos considerados seguros, por padrão HTTPS e WSS. Isso não autoriza o uso de HTTP para login. Toda sessão autenticada deve trafegar por HTTPS com certificado validado.

O guia de ssl no Python explica verificação de certificados e hostname. Nunca desative TLS para fazer um fluxo com cookies funcionar.

Login com formulário

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)

Não conclua que o login funcionou apenas porque um cookie apareceu. Valide status, URL final e conteúdo esperado. Credenciais devem vir de um secret manager ou entrada protegida, nunca do código ou log.

Proteção CSRF

Muitos sites exigem um token CSRF presente em HTML ou cookie. O cookie jar cuida apenas do transporte dos cookies; ele não descobre automaticamente o token nem protege seu próprio servidor.

Um fluxo comum é: abrir a página do formulário, extrair o token, enviar token e credenciais, validar a resposta e manter os cookies recebidos. Se precisar analisar HTML controlado, consulte o guia de web scraping com Python.

Política por domínio

DefaultCookiePolicy permite bloquear ou permitir domínios.

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)

Entradas iniciadas por ponto incluem subdomínios mais específicos segundo as regras do módulo. Teste a política com os hosts reais. Uma allowlist reduz vazamentos acidentais, mas não substitui validação de URL e TLS.

Cookies de sessão e persistentes

Cookies sem expiração geralmente possuem discard=True e representam a sessão atual. clear_session_cookies() remove esses valores.

jar.clear_session_cookies()

CookieJar em memória desaparece quando o processo termina. Para persistência, use uma subclasse de FileCookieJar.

Persistindo com 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)

# Após usar o opener:
jar.save(ignore_discard=False, ignore_expires=False)

O formato é compatível com cookies.txt usado por ferramentas como curl. Ele pode perder atributos modernos ou específicos. Faça backup antes de sobrescrever um arquivo importante.

LWPCookieJar

LWPCookieJar usa o formato Set-Cookie3, legível e capaz de preservar mais informações do módulo.

from http.cookiejar import LWPCookieJar

jar = LWPCookieJar("session.cookies")

Escolha o formato pela interoperabilidade necessária. Nenhum deles deve ser considerado um cofre de segredos.

Protegendo o arquivo de cookies

Defina permissões restritas e evite diretórios sincronizados, backups públicos e imagens de container.

import os
from pathlib import Path

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

Em sistemas sem permissões POSIX, use mecanismos equivalentes. Se o risco for alto, evite persistência ou criptografe o armazenamento com gestão correta de chaves.

Carregar, salvar e revert

load() adiciona cookies do arquivo ao estado atual. revert() limpa e recarrega de forma transacional: se ocorrer falha, o estado anterior não é alterado.

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

Não use ignore_expires=True ou ignore_discard=True sem compreender que cookies expirados ou de sessão serão preservados.

Limpeza seletiva

jar.clear("example.com", "/", "sessionid")
# ou limpar tudo:
jar.clear()

clear() pode gerar KeyError quando não existe correspondência. Em logout, além de limpar o jar, use o endpoint do servidor para invalidar a sessão.

Expiração

O jar remove cookies expirados quando necessário. Você pode consultar cookie.is_expired() durante auditorias.

active = [cookie for cookie in jar if not cookie.is_expired()]

Não altere manualmente expires para prolongar uma sessão. O servidor pode manter validade própria, e estender localmente um token aumenta risco.

SameSite e atributos modernos

http.cookiejar foi criado em torno de protocolos Netscape, RFC 2109 e RFC 2965. Atributos modernos podem aparecer como não padronizados, mas o módulo não replica integralmente a política de um navegador atual.

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

Não use CookieJar para afirmar que um fluxo possui as mesmas garantias de isolamento de Chrome ou Firefox. Para automação de navegador, use uma ferramenta que implemente o modelo moderno.

Cookies de terceiros

A política possui conceitos de transação verificável e origem, mas a integração com urllib.request não representa toda a navegação de uma página moderna. Ao baixar recursos de terceiros manualmente, mantenha jars separados ou políticas estritas para evitar enviar cookies além do necessário.

Concorrência

Não compartilhe um jar mutável entre threads sem coordenação. Use um lock ao realizar sequências de abertura e salvamento, ou mantenha uma sessão por worker. Ao salvar, grave em temporário e substitua atomicamente para reduzir corrupção.

Cookies importados do navegador

Copiar um arquivo cookies.txt de um navegador pode expor sessões pessoais e sobrescrever dados. Nunca acesse perfis sem consentimento. Navegadores modernos usam bancos e criptografia específicos; MozillaCookieJar não lê automaticamente todos esses formatos.

Automação autenticada

Prefira tokens de API, OAuth ou contas de serviço quando o sistema oferece uma interface oficial. Automatizar login por formulário é mais frágil, pode violar termos e exige acompanhar CSRF, MFA e mudanças de HTML.

O guia de APIs REST no Python mostra uma alternativa mais estável.

Erros comuns

Os erros frequentes são registrar valores de cookies, persistir arquivo com permissões abertas, usar cookies expirados, compartilhar jar entre usuários, ignorar domínio, supor suporte completo a SameSite, desativar TLS, salvar cookies de sessão sem necessidade e tratar presença de cookie como prova de login.

Boas práticas

Use HTTPS validado, um jar por identidade, allowlist de domínios, timeouts e limites HTTP. Mantenha cookies em memória quando possível. Se persistir, proteja o arquivo, não salve sessão descartável sem motivo e limpe no logout. Prefira APIs oficiais a automação de navegador.

Conclusão

http.cookiejar integra sessões baseadas em cookies aos clientes da biblioteca padrão e oferece políticas e persistência. A conveniência vem com responsabilidade: cookies autenticados são segredos, arquivos podem vazar sessões e o modelo não equivale integralmente a um navegador moderno. Use escopo mínimo, TLS e armazenamento protegido.

Consulte a documentação oficial de http.cookiejar e o RFC 6265 sobre cookies HTTP.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Rack de servidores representando conexões HTTP de baixo nível com http.client no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    http.client no Python: HTTP de baixo nível

    Aprenda http.client no Python para controlar conexões HTTP e HTTPS, streaming, headers, TLS, reutilização, limites e erros de protocolo.

    Ler mais

    Tempo de leitura: 5 minutos
    20/08/2026
    Código HTML em uma tela representando crawling responsável com robotparser no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    robotparser no Python: leia robots.txt

    Aprenda urllib.robotparser no Python para respeitar robots.txt, crawl-delay, request-rate, sitemaps, cache e limites de crawling.

    Ler mais

    Tempo de leitura: 5 minutos
    20/08/2026
    Teclas formando HTTP representando requisições com urllib.request no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    urllib.request no Python: HTTP nativo

    Aprenda urllib.request no Python para fazer GET, POST e downloads com timeout, TLS, redirects, proxies, limites e tratamento de erros.

    Ler mais

    Tempo de leitura: 5 minutos
    19/08/2026
    Cabos Ethernet conectados representando servidores de rede com socketserver no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    socketserver no Python: crie servidores

    Aprenda socketserver no Python para criar servidores TCP e UDP, aplicar concorrência, limites, timeouts e encerramento seguro.

    Ler mais

    Tempo de leitura: 6 minutos
    19/08/2026
    Sala de servidores iluminada representando conexões TLS seguras com ssl no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    ssl no Python: conexões TLS seguras

    Aprenda ssl no Python para criar clientes e servidores TLS, validar certificados, configurar versões mínimas, CA e autenticação mútua.

    Ler mais

    Tempo de leitura: 6 minutos
    19/08/2026
    Tela de verificação de conta representando autenticação de mensagens com HMAC no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    hmac no Python: autentique mensagens

    Aprenda HMAC no Python para assinar e validar webhooks, arquivos e mensagens com SHA-256, chaves seguras e comparação resistente a

    Ler mais

    Tempo de leitura: 6 minutos
    19/08/2026