Análises Detalhadas sobre Soluções de Cross-Origin no APISIX
January 27, 2024
No desenvolvimento de aplicações web, os problemas de cross-origin tornaram-se um tópico popular. No entanto, com a adoção generalizada de gateways de API, agora temos uma solução mais conveniente e eficiente para lidar com problemas de cross-origin. O gateway de API, como um componente-chave na arquitetura de aplicações, não apenas fornece funcionalidades como roteamento de solicitações e gerenciamento de API, mas também lida efetivamente com solicitações de cross-origin, ajudando os desenvolvedores a contornar as restrições da política de mesma origem do navegador. Este artigo explorará como usar o gateway de API APISIX para resolver problemas de cross-origin.
O Que É Cross-Origin?
Os problemas de cross-origin surgem principalmente da política de mesma origem imposta pelos navegadores. A política de mesma origem exige que a origem (protocolo, domínio, porta) de uma solicitação seja exatamente idêntica ao recurso de destino; caso contrário, o navegador bloqueará a solicitação. Essa política visa proteger a segurança das informações do usuário e evitar que sites maliciosos roubem dados. No entanto, no desenvolvimento prático, cenários como separação de frontend e backend ou implantação com diferentes domínios ou portas frequentemente levam a problemas de cross-origin.
Resolvendo Problemas de Cross-Origin Usando APISIX
CORS (Cross-Origin Resource Sharing)
CORS (Cross-Origin Resource Sharing) é um padrão W3C que permite que os navegadores enviem solicitações para servidores de cross-origin, superando as restrições impostas pela política de mesma origem. No APISIX, os desenvolvedores podem configurar facilmente regras de CORS usando o plugin CORS, especificando quais origens são permitidas acessar recursos.
Exemplo de comando usando curl para configurar CORS no APISIX:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "plugins": { "cors": {} }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:8080": 1 } } }'
Este comando usa curl
para enviar uma solicitação PUT para a API Admin do APISIX, criando uma rota com o ID 1. A rota é configurada com um caminho URI de /hello
, e a configuração padrão habilita o plugin CORS. Além disso, o servidor upstream é especificado como 127.0.0.1:8080
.
Executando uma solicitação de teste, obtemos os resultados da configuração padrão:
curl http://127.0.0.1:9080/hello -v
...
< Server: APISIX web server
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: *
< Access-Control-Allow-Headers: *
< Access-Control-Expose-Headers: *
< Access-Control-Max-Age: 5
...
Se ajustes na política de CORS forem necessários, basta modificar as configurações relevantes do plugin. Aqui estão várias opções de configuração comumente usadas:
-
allow_origins
: Especifica as origens permitidas para acesso cross-origin. Pode ser um URL específico ou usar o curinga '*' para permitir todas as origens. Múltiplos valores são separados por vírgulas. -
allow_methods
: Define os métodos HTTP permitidos para acesso cross-origin, como GET, POST, etc. Múltiplos valores são separados por vírgulas. -
allow_headers
: Permite que campos de cabeçalho personalizados sejam carregados em solicitações cross-origin. Múltiplos valores são separados por vírgulas. -
expose_headers
: Especifica campos de cabeçalho personalizados a serem expostos em respostas cross-origin. Múltiplos valores são separados por vírgulas. -
max_age
: Define o tempo máximo para o navegador armazenar em cache respostas CORS. -
allow_credentials
: Determina se é permitido carregar credenciais (como Cookies) em solicitações cross-origin.
Pontos a Observar
É importante destacar que, embora o CORS seja fácil de usar, habilitá-lo pode levar a problemas de segurança. Isso ocorre principalmente porque o CORS relaxa as restrições impostas pela política de mesma origem, permitindo que solicitações de diferentes origens acessem recursos.
Neste contexto, vamos focar em allow_credentials
. allow_credentials
é um item de configuração crucial no CORS, determinando se as solicitações cross-origin podem carregar informações de autenticação. Isso inclui, mas não se limita a dados sensíveis, como cookies, informações de autenticação HTTP ou certificados SSL do cliente.
Por padrão, allow_credentials
está desabilitado, o que significa que não permite o carregamento de informações de autenticação. No entanto, se o CORS estiver habilitado e permitir o carregamento de informações de autenticação (allow_credentials: true
), é necessário ter cuidado extra. Isso implica que solicitações de outras origens também podem acessar recursos protegidos, potencialmente executando operações sensíveis. Por exemplo, um site malicioso explorando essa vulnerabilidade de configuração pode induzir os usuários a iniciar solicitações cross-origin, levando ao roubo de seus cookies de sessão ou ações não autorizadas.
Para minimizar possíveis problemas de segurança ao habilitar solicitações cross-origin, é aconselhável seguir as seguintes práticas recomendadas:
- Configurar
allow_origin
com cuidado: Evite definirallow_origin
como*
(permitir todas as origens) indiscriminadamente. Em vez disso, especifique explicitamente as origens permitidas. - Limitar
allow_credentials
: Habiliteallow_credentials
apenas quando necessário e restrinja-o a origens confiáveis. - Usar um protocolo de transporte seguro: Certifique-se de que as solicitações CORS sejam transmitidas por HTTPS para evitar ataques de intermediário.
- Validação e autorização: No servidor backend, implemente verificações adequadas de validação e autorização para solicitações cross-origin, garantindo que apenas usuários autorizados possam acessar recursos sensíveis.
- Evitar o uso de métodos HTTP inseguros: Restrinja os métodos HTTP usados em solicitações cross-origin, permitindo apenas métodos seguros como GET e POST, enquanto desabilita métodos potencialmente arriscados como PUT e DELETE, que podem representar riscos de segurança.
Proxy Reverso
Além de usar CORS, o APISIX pode resolver indiretamente problemas de cross-origin configurando-se como um proxy reverso. Um proxy reverso é um padrão comum de arquitetura de servidor onde o servidor proxy reverso atua como um intermediário entre o cliente e o servidor de destino. Quando um cliente inicia uma solicitação, essas solicitações são primeiro enviadas ao servidor proxy reverso, que então as encaminha para o servidor de destino real. Após o processamento, a resposta do servidor de destino é retornada ao proxy reverso, que finalmente a repassa ao cliente.
É crucial entender que um proxy reverso em si não resolve diretamente problemas de cross-origin, mas contorna habilmente as restrições da política de mesma origem do navegador. Quando um cliente precisa fazer uma solicitação cross-origin, ele na verdade envia a solicitação ao servidor proxy reverso, em vez de diretamente ao servidor de destino. Como o servidor proxy reverso e o servidor de destino geralmente estão no mesmo ambiente de rede ou configuração, sua comunicação não está sujeita às restrições da política de mesma origem. Isso permite que o servidor proxy reverso encaminhe livremente as solicitações do cliente para o servidor de destino e retorne as respostas ao cliente, alcançando indiretamente o objetivo de acesso cross-origin.
Como o APISIX atua como um gateway de API, ele está naturalmente posicionado para ser implantado entre o cliente e o servidor. Portanto, em aplicações de menor escala, implantar a aplicação cliente e o APISIX no mesmo domínio e modificar o endereço de solicitação do cliente para o endereço do serviço APISIX garante que o cliente acesse o APISIX sem problemas. Isso pode aproveitar a funcionalidade de proxy reverso para fornecer acesso cross-origin ao cliente. Além disso, outros plugins podem ser combinados para garantir a segurança e confiabilidade de todo o processo de comunicação.
Conclusão
Neste artigo, exploramos como usar o APISIX para resolver problemas de cross-origin, com foco em dois métodos: CORS e proxy reverso. Ao configurar adequadamente o plugin CORS, podemos relaxar as restrições da política de mesma origem impostas pelos navegadores, permitindo que solicitações cross-origin acessem recursos. Por outro lado, o proxy reverso atua como um intermediário, contornando a política de mesma origem dos navegadores e facilitando o acesso cross-origin. Cada método tem suas vantagens, e a escolha da solução apropriada depende das necessidades específicas. Seja usando CORS ou proxy reverso, o APISIX oferece funcionalidades flexíveis e poderosas, ajudando os desenvolvedores a resolverem problemas de cross-origin de forma eficiente e garantindo o funcionamento normal e a experiência do usuário das aplicações.