Partage des ressources cross-origine (CORS) - Amazon Simple Storage Service

Partage des ressources cross-origine (CORS)

Le partage des ressources cross-origin (CORS) définit un moyen pour les applications Web clientes chargées dans un domaine particulier d'interagir avec les ressources d'un autre domaine. Grâce à la prise en charge du CORS, vous pouvez créer de riches applications web clientes avec Amazon S3 et autoriser de manière sélective un accès cross-origin à vos ressources Amazon S3.

Cette section fournit une présentation du CORS. Les sous-rubriques expliquent comment activer le CORS à l'aide de la console Amazon S3 ou par programmation à l'aide de l'API REST Amazon S3 et des kits SDK AWS.

Partage des ressources de plusieurs origines : scénarios de cas d'utilisation

Les exemples de scénarios suivants utilisent le partage CORS.

Scénario 1

Supposons que vous hébergez un site web dans un compartiment Amazon S3 nommé website, comme décrit dans Hébergement d'un site Web statique sur Amazon S3. Les utilisateurs chargent le point de terminaison du site web :

http://website.s3-website.us-east-1.amazonaws.com

À présent, vous souhaitez utiliser JavaScript sur les pages web stockées dans ce compartiment pour pouvoir effectuer des demandes GET et PUT authentifiées sur le même compartiment en utilisant le point de terminaison d'API Amazon S3 pour le compartiment, website.s3.us-east-1.amazonaws.com. En principe, un navigateur empêcherait JavaScript d'autoriser ces demandes, mais avec le partage CORS, vous pouvez configurer le compartiment pour autoriser explicitement les demandes cross-origin de website.s3-website.us-east-1.amazonaws.com.

Scénario 2

Supposons que vous souhaitez héberger une police web à partir de votre compartiment S3. Une fois encore, les navigateurs requièrent un contrôle CORS (aussi appelé contrôle en amont) pour le chargement des polices web. Vous configurez le compartiment qui héberge la police web pour permettre à toute origine d'effectuer ces demandes.

Comment configurer le CORS sur un compartiment ?

Pour configurer le compartiment afin qu'il autorise les demandes cross-origin, vous créez une configuration CORS, à savoir un document XML avec les règles qui identifient les origines auxquelles vous autorisez l'accès au compartiment, les opérations (méthodes HTTP) qui prennent en charge chaque origine et d'autres informations propres aux opérations.

Vous pouvez ajouter jusqu'à 100 règles à la configuration. Vous ajoutez le document XML comme sous-ressource cors au compartiment soit par programmation, soit à l'aide de la console Amazon S3. Pour plus d'informations, consultez Activation du partage des ressources de plusieurs origines (CORS).

Au lieu d'accéder à un site web en utilisant un point de terminaison de site web Amazon S3, vous pouvez utiliser votre propre domaine, comme example1.com, pour proposer votre contenu. Pour plus d'informations sur l'utilisation de votre propre domaine, consultez Configuration d'un site web statique à l'aide d'un domaine personnalisé enregistré avec Route 53. L'exemple de configuration cors suivant possède trois règles, qui sont spécifiées comme éléments CORSRule :

  • La première règle autorise des demandes cross-origin PUT, POST et DELETE de l'origine http://www.example1.com. La règle autorise également tous les en-têtes dans une demande OPTIONS en amont via l'en-tête Access-Control-Request-Headers. En réponse à toute demande OPTIONS en amont, Amazon S3 renvoie les en-têtes demandés.

  • La deuxième règle autorise les mêmes demandes cross-origin que la première, mais elle s'applique à une autre origine, http://www.example2.com.

  • La troisième règle permet des demandes GET cross-origin de toutes les origines. Le caractère générique * fait référence à toutes les origines.

<CORSConfiguration> <CORSRule> <AllowedOrigin>http://www.example1.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>http://www.example2.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> </CORSRule> </CORSConfiguration>

La configuration CORS permet également d'ajouter des paramètres facultatifs, comme illustré dans la configuration CORS suivante. Dans cet exemple, la configuration CORS permet les demandes PUT, POST et DELETE cross-origin depuis l'origine http://www.example.com.

<CORSConfiguration> <CORSRule> <AllowedOrigin>http://www.example.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> <MaxAgeSeconds>3000</MaxAgeSeconds> <ExposeHeader>x-amz-server-side-encryption</ExposeHeader> <ExposeHeader>x-amz-request-id</ExposeHeader> <ExposeHeader>x-amz-id-2</ExposeHeader> </CORSRule> </CORSConfiguration>

L'élément CORSRule dans la configuration précédente inclut les éléments facultatifs suivants :

  • MaxAgeSeconds—Indique pendant combien de temps en secondes (dans cet exemple, 3 000) le navigateur met en cache une réponse Amazon S3 à une demande OPTIONS en amont pour la ressource spécifiée. En mettant en cache la réponse, le navigateur n'a pas à envoyer de demandes en amont à Amazon S3 si la demande originale doit être répétée.

  • ExposeHeader—Identifie les en-têtes de réponse (dans cet exemple, x-amz-server-side-encryption, x-amz-request-id et x-amz-id-2) auxquels les clients peuvent accéder à partir de leurs applications (par exemple, à partir d'un objet XMLHttpRequest JavaScript).

Élément AllowedMethod

Dans la configuration CORS, vous pouvez spécifier les valeurs suivantes pour l'élément AllowedMethod.

  • GET

  • PUT

  • POST

  • DELETE

  • HEAD

Élément AllowedOrigin

Dans l'élément AllowedOrigin, vous spécifiez les origines à partir desquelles vous souhaitez autoriser des demandes cross-domaine, par exemple, http://www.example.com. La chaîne de caractères d'origine peut contenir au maximum un caractère générique *, comme http://*.example.com. Si vous le souhaitez, vous pouvez spécifier * comme l'origine pour permettre à toutes les origines d'envoyer des demandes cross-origin. Vous pouvez également spécifier https pour permettre uniquement les origines sécurisées.

Élément AllowedHeader

L'élément AllowedHeader spécifie les en-têtes autorisés dans une demande en amont via l'en-tête Access-Control-Request-Headers. Chaque nom d'en-tête figurant dans l'en-tête Access-Control-Request-Headers doit avoir une entrée correspondante dans la règle. Amazon S3 envoie uniquement dans une réponse les en-têtes autorisés qui ont été demandés. Pour obtenir la liste des en-têtes qui peuvent être utilisés dans les demandes à Amazon S3, consultez En-têtes de demandes courantes dans le guide Amazon Simple Storage Service API Reference.

Chaque chaîne de caractères AllowedHeader dans la règle peut contenir au maximum un caractère générique *. Par exemple, <AllowedHeader>x-amz-*</AllowedHeader> permet tous les en-têtes propres à Amazon.

Élément ExposeHeader

Chaque élément ExposeHeader identifie un en-tête dans la réponse auquel vous souhaitez que les clients puissent accéder depuis leurs applications (par exemple, depuis un objet XMLHttpRequest JavaScript). Pour obtenir la liste des en-têtes de réponse Amazon S3 courants, consultez En-têtes de réponses courants dans le guide Amazon Simple Storage Service API Reference.

Élément MaxAgeSeconds

L'élément MaxAgeSeconds spécifie le nombre d'heures en secondes pendant lesquelles le navigateur peut mettre en cache une réponse pour une demande en amont comme identifié par la ressource, la méthode HTTP et l'origine.

Comment Amazon S3 évalue la configuration CORS sur un compartiment ?

Lorsqu'Amazon S3 reçoit une demande en amont d'un navigateur, il évalue la configuration CORS pour le compartiment et utilise la première règle CORSRule qui correspond à la demande entrante du navigateur pour permettre une demande cross-origin. Pour qu'une règle corresponde, les conditions suivantes doivent être remplies :

  • L'en-tête Origin de la demande doit correspondre à un élément AllowedOrigin.

  • La méthode de demande (par exemple, GET ou PUT) ou l'en-tête Access-Control-Request-Method dans le cas d'une demande OPTIONS en amont doit être l'un des éléments AllowedMethod.

  • Chaque en-tête listé dans l'en-tête Access-Control-Request-Headers de la demande sur la demande en amont doit correspondre à un élément AllowedHeader.

Note

Les listes ACL et stratégies continuent de s'appliquer lorsque vous activer le CORS sur le compartiment.