O que exatamente faz o cabeçalho Access-Control-Allow-Credentials?

167

Estou tentando entender como usar o CORS e estou confuso sobre o que o Access-Control-Allow-Credentialscabeçalho faz.

A documentação diz

Indica se a resposta à solicitação pode ou não ser exposta quando o sinalizador de credenciais for verdadeiro.

Mas não entendo o que significa a resposta "exposta".

Alguém pode explicar o que esse cabeçalho sendo definido como verdadeiro (em conjunto com o sinalizador de credenciais definido como verdadeiro) realmente faz?

Nate
fonte
doc xhr.withCredential no lado do cliente developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/...
Weishi Zeng

Respostas:

264

Por padrão, o CORS não inclui cookies em solicitações de origem cruzada. Isso é diferente de outras técnicas de origem cruzada, como JSON-P. O JSON-P sempre inclui cookies com a solicitação, e esse comportamento pode levar a uma classe de vulnerabilidades chamada falsificação de solicitação entre sites ou CSRF.

Para reduzir a chance de vulnerabilidades do CSRF no CORS, o CORS exige que o servidor e o cliente reconheçam que não há problema em incluir cookies nas solicitações. Isso faz dos cookies uma decisão ativa, em vez de algo que acontece passivamente sem nenhum controle.

O código do cliente deve definir a withCredentialspropriedade no XMLHttpRequestpara truepara conceder permissão.

No entanto, esse cabeçalho por si só não é suficiente. O servidor deve responder com o Access-Control-Allow-Credentialscabeçalho. Responder a esse cabeçalho truesignifica que o servidor permite que cookies (ou outras credenciais do usuário) sejam incluídas em solicitações de origem cruzada.

Você também precisa garantir que seu navegador não esteja bloqueando cookies de terceiros, se desejar que as solicitações com credenciais de origem cruzada funcionem.

Observe que, independentemente de você estar fazendo solicitações de mesma origem ou de origem cruzada, é necessário proteger seu site do CSRF (especialmente se sua solicitação incluir cookies).

Monsur
fonte
1
Esclarei a resposta para cobrir sua pergunta. Basicamente, o JSON-P faz errado e é menos seguro.
21413 Monsur
28
Só quero adicionar um pouco a isso para comentar o significado de "exposto". A especificação não requer um pré-vôo (ida e volta adicional para verificar se o servidor permitirá credenciais) para solicitações GET. Em vez de pré-comprovar, o navegador sempre fará a solicitação, enviando cookies se withCredentialsestiver definido, mas quando receber a resposta, se withCredentials estiver definido, ele somente entregará / exporá o resultado ao javascript de chamada se a resposta tiver o Access Conjunto de cabeçalhos -Control-Allow-Credentials. Se não houver cabeçalho, ele não expõe a resposta, efetivamente colocando-a em preto.
heavi5ide
4
@ heavi5ide, Sim, mesmo que o navegador não exponha a resposta ao código do cliente, a solicitação com cookie ainda foi enviada (para solicitações não confirmadas). Portanto, o CSRF ainda estaria pronto.
Pacerier
7
Como essa é uma resposta tão popular, adicionarei mais uma informação importante: além de configurar corretamente os cabeçalhos de solicitação e resposta, você também precisa garantir que seu navegador não esteja bloqueando cookies de terceiros, se você deseja que solicitações credenciadas de origem cruzada funcionem. Veja stackoverflow.com/a/16634887/2970321
alexw
5
Essa é uma resposta tão clara que qualquer pessoa que a leia pela primeira vez poderá entender e corrigir seu código que parece não estar funcionando bem com os cookies. Obrigado!
ASGs