Gerenciamento de Requisições Cross-Origin no Django

Conceito de Origem e Restrições do Navegador

Na arquitetura web, a segurança é fundamentada na Política de Mesma Origem (Same-Origin Policy). Uma origem é definida pela combinação exata de três componentes: o protocolo (ex: HTTP ou HTTPS), o nome de domínio e o número da porta. Quando um cliente tenta acessar um recurso onde qualquer um desses três elementos difere do contexto atual, ocorre uma solicitação cross-origin.

Os navegadores modernos impõem restrições rigorosas a esse tipo de comunicação para mitigar vulnerabilidades, como ataques de falsificação de solicitação entre sites (CSRF). Sem mecanismos adequados, scripts maliciosos poderiam explorar a sessão ativa de um usuário em outro domínio.

Mecanismos de Contorno

JSONP (Legado)

Antes da padronização atual, utilizava-se o JSON with Padding (JSONP). Esta técnica explora o fato de que tags como <script> não estão sujeitas à política de mesma origem. O funcionamento baseia-se em um acordo entre cliente e servidor: o cliente define uma função de callback e o servidor retorna um script JavaScript que executa essa função, passando os dados como argumento.

Embora compatível com navegadores antigos, o JSONP possui limitações críticas, suportando apenas verbos HTTP do tipo GET e oferecendo tratamento de erros insuficiente.

CORS (Padrão Atual)

O Cross-Origin Resource Sharing (CORS) é a especificação W3C vigente que permite relaxar as restrições de segurança de forma controlada. Através de cabeçalhos HTTP específicos, o servidor informa ao navegador quais origens externas estão autorizadas a consumir seus recursos.

Para solicitações complexas (que não sejam simples GET/POST com headers padrão), o navegador realiza automaticamente uma requisição prévia (preflight) utilizando o método OPTIONS. Somente após a confirmação do servidor, a requisição real é enviada.

Implementação em Django

Para habilitar CORS em projetos Django, recomenda-se o uso da biblioteca django-cors-headers, que gerencia automaticamente os cabeçalhos necessários nas respostas.

Instalação e Configuração Inicial

Primeiro, instale o pacote via gerenciador de dependências:

pip install django-cors-headers

Em seguida, registre a aplicação nas configurações do projeto:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'corsheaders',
    'django.contrib.contenttypes',
    # ... outras apps
]

Middleware

É crucial que o middleware do CORS seja posicionado antes do middleware comum do Django para garantir que os cabeçalhos sejam injetados corretamente:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    # ... outros middlewares
]

Definição de Origens Permitidas

No arquivo settings.py, configure quais domínios frontend têm permissão para acessar a API. Utilize uma lista para definir as origens confiáveis:

# Domínios autorizados a fazer requisições
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
    "http://127.0.0.1:3000",
    "https://frontend.producao.com.br",
]

# Caso seja necessário enviar cookies ou credenciais
CORS_ALLOW_CREDENTIALS = True

# Hosts permitidos pelo Django também devem ser atualizados
ALLOWED_HOSTS = [
    '127.0.0.1',
    'localhost',
    'api.producao.com.br'
]

Personalização de Métodos e Cabeçalhos

Por padrão, a biblioteca já cobre os verbos comuns, mas é possível explicitar quais métodos HTTP e headers customizados são aceitos pela API:

CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]

CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

Tags: Django CORS django-cors-headers segurança-web backend-python

Publicado em 9-29 20:55