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

    Desenvolvedor configurando servidor HTTPS e certificado TLS com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    HTTPSServer: crie servidor HTTPS local no Python

    Aprenda HTTPSServer no Python para servir HTTPS localmente, configurar certificados, usar threads e entender limites de segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    08/10/2026
    Arquivos protegidos representando extração segura de TAR com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    tarfile extraction_filter: extraia TAR com segurança

    Aprenda tarfile extraction_filter no Python para extrair arquivos TAR com validação, segurança e controle de caminhos.

    Ler mais

    Tempo de leitura: 6 minutos
    08/10/2026
    Código Python exibindo avisos controlados com catch_warnings
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    catch_warnings: capture warnings em testes Python

    Aprenda catch_warnings no Python para capturar, testar e controlar avisos com filtros específicos e segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código Python representando referências persistentes do pickle
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pickle persistent_id: serialize referências externas

    Aprenda pickle persistent_id no Python para serializar referências externas com IDs estáveis, validação, segurança e compatibilidade.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código binário representando buffers e memória no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    memoryview.count: conte valores sem copiar buffers

    Aprenda memoryview.count no Python para contar bytes e valores em buffers sem cópias, com formatos, limites e boas práticas.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026
    Código Python com anotações de tipos
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    annotationlib: evite imports circulares em anotações

    Aprenda annotationlib no Python para ler anotações adiadas, evitar imports circulares e criar ferramentas de introspecção seguras.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026