Isso é um pouco mais complicado do que a resposta aceita indica.
O suporte do CORS ao usar o Cloudfront + S3 é realmente implementado no S3 e funciona assim de acordo com a Amazon:
The request's Origin header must match an AllowedOrigin element.
The request method (for example, GET or PUT) or the Access-Control Request-Method header in case the of a preflight OPTIONS request must be one of the AllowedMethod elements.
Every header listed in the request's Access-Control-Request-Headers header on the preflight request must match an AllowedHeader element.
Isso faz sentido, o que pode não ficar claro é que, se nenhum cabeçalho Origem for enviado pelo cliente, esse processamento não será feito. E estamos usando o Cloudfront na frente, que, se você está hospedando apenas recursos estáticos, provavelmente configurou para ignorar todos os cabeçalhos durante o armazenamento em cache. Portanto, se a primeira solicitação para cada arquivo de um nó de borda específico não incluir o cabeçalho Origem, ele armazenará em cache a resposta sem o cabeçalho Access-Control-Allow-Origin.
O resultado é que a primeira solicitação de entrada determinará quais cabeçalhos são retornados para todas as solicitações até que o cache expire.
Existem várias maneiras de corrigir / solucionar isso.
- Configure o cloudfront para fazer cache condicional com base no cabeçalho "Origem".
Isso funciona bem se você espera apenas algumas ou uma única origem, mas, caso contrário, sua taxa de armazenamento em cache pode ficar muito ruim.
- Use o Lambda @ edge para forçar os cabeçalhos, isso pode ser feito apenas uma vez para cada solicitação de origem (S3).
Totalmente flexível, mas adiciona sobrecarga e custo.
- Faça com que a cloud substitua o cabeçalho "Origem" por um valor fictício para cada solicitação.
Isso só é realmente útil no caso "Access-Control-Allow-Origin: *" e é um pouco invasivo, mas é provavelmente a melhor solução atual ao hospedar ativos estáticos no cloudfront + S3.