AccueilđŸ‡«đŸ‡·Chercher

Cross-origin resource sharing

Le Cross-Origin Resource Sharing ou CORS (littĂ©ralement « partage de ressources entre origines multiples ») est un mĂ©canisme qui permet Ă  des ressources restreintes d'une page web d'ĂȘtre rĂ©cupĂ©rĂ©es par un autre domaine extĂ©rieur au domaine Ă  partir duquel la premiĂšre ressource a Ă©tĂ© servie[1]. Une page web peut librement intĂ©grer des ressources d'origines diffĂ©rentes telles que des images, des feuilles de style, des scripts, des iframes et des vidĂ©os[2]. Certaines "demandes inter-domaine" (en anglais : cross-domain), notamment les requĂȘtes Ajax, sont interdites par dĂ©faut par la politique de sĂ©curitĂ© de mĂȘme origine (en anglais : same origin security policy).

CORS dĂ©finit une maniĂšre dont un navigateur et un serveur peuvent interagir afin de dĂ©terminer si oui ou non il est sĂ»r de permettre une demande inter-origines[3]. Cela permet plus de libertĂ© et de fonctionnalitĂ©s que les requĂȘtes de mĂȘme origine, mais est plus sĂ©curisĂ© que la simple autorisation d'avoir toutes les requĂȘtes inter-origines. Le standard pour CORS a Ă©tĂ© originellement publiĂ© en tant que recommandation du W3C[4] mais ce document est obsolĂšte[5]. La spĂ©cification maintenue activement et qui dĂ©finit CORS est le Fetch Living Standard de WHATWG[6].

Comment fonctionne CORS

Le standard CORS dĂ©crit de nouveaux entĂȘtes HTTP qui offrent aux navigateurs et aux serveurs un moyen de faire une requĂȘte vers une URL distante uniquement s'ils en ont l'autorisation. Bien que certaines validations et autorisations peuvent ĂȘtre effectuĂ©es par le serveur, il est gĂ©nĂ©ralement de la responsabilitĂ© du navigateur de prendre en charge ces entĂȘtes et d'honorer les restrictions qu'ils imposent.

Pour Ajax et les mĂ©thodes de requĂȘte HTTP qui peuvent modifier des donnĂ©es (gĂ©nĂ©ralement des mĂ©thodes HTTP autres que GET, ou pour l'utilisation de POST avec certains types MIME), la spĂ©cification mandate que les navigateurs "contrĂŽlent la requĂȘte en amont", en sollicitant les mĂ©thodes prises en charge par le serveur via une mĂ©thode de requĂȘte HTTP OPTIONS, puis, lors de "l'approbation" par le serveur, l'envoi de la requĂȘte rĂ©elle avec la mĂ©thode de requĂȘte HTTP. Les serveurs peuvent Ă©galement informer les clients si les "informations d'identification" (y compris les cookies et les donnĂ©es d'authentification HTTP) doivent ĂȘtre envoyĂ©es avec la demande[7].

Exemple simple

Supposez qu'un utilisateur visite http://www.example.com et que la page Ă©mette une requĂȘte inter-origine pour rĂ©cupĂ©rer des donnĂ©es de l'utilisateur de http://service.example.com. Un navigateur compatible CORS va essayer de faire une requĂȘte inter-origine vers service.example.com de la maniĂšre suivante.

  1. Le navigateur envoie la requĂȘte OPTIONS avec un entĂȘte HTTP Origin Ă  http://service.example.com contenant le domaine qui a servi la page parent :
    Origin: http://www.example.com
  2. Le serveur de http://service.example.com peut répondre avec :
    • Un entĂȘte Access-Control-Allow-Origin (ACAO) dans sa rĂ©ponse en indiquant quels sites d'origine sont autorisĂ©s. Par exemple :
      Access-Control-Allow-Origin: http://www.example.com
      Parce que www.example.com correspond Ă  la page parent, le navigateur va ensuite faire la requĂȘte inter-origines.
    • Un entĂȘte Access-Control-Allow-Origin (ACAO) avec une Ă©toile qui permet tous des domaines :
      Access-Control-Allow-Origin: *
    • Une page d'erreur si le serveur n'autorise pas la requĂȘte inter-origines.

Une politique de mĂȘme origine dĂ©finie par une Ă©toile est appropriĂ©e lorsqu'une page ou la rĂ©ponse de l'API est considĂ©rĂ© comme du contenu totalement public et qu'il est destinĂ© Ă  ĂȘtre accessible Ă  tout le monde, y compris par n'importe quel code sur n'importe quel site. Par exemple, une police web gratuite sur un service d'hĂ©bergement comme Google Fonts.

Une politique de mĂȘme origine dĂ©finie par une Ă©toile est Ă©galement largement utilisĂ©e et de maniĂšre appropriĂ©e pour les objets-modĂšles de capacitĂ©, oĂč les pages ont des URL non-devinables et qui sont destinĂ©es Ă  ĂȘtre accessibles uniquement aux personnes connaissant le secret.

La valeur « * Â» est spĂ©ciale en ce sens qu'elle ne permet pas aux requĂȘtes de fournir des informations d'identification, c'est-Ă -dire n'autorise pas l'authentification HTTP, les certificats SSL cĂŽtĂ© client, ni l'envoi de cookies dans la requĂȘte inter-domaines[8].

Notez que dans les architectures CORS, l'entĂȘte ACAO est initialisĂ© par le service web externe (service.example.com), et non par le serveur d'applications web d'origine (www.example.com). Ici service.example.com utilise CORS pour permettre au navigateur d'autoriser www.example.com Ă  faire les requĂȘtes Ă  service.example.com.

Exemple de contrĂŽle en amont

Lors de l'exĂ©cution de certains types de requĂȘtes Ajax inter-domaine, les navigateurs modernes qui prennent en charge CORS vont insĂ©rer une requĂȘte supplĂ©mentaire de "contrĂŽle en amont" afin de dĂ©terminer s'ils ont l'autorisation d'effectuer l'action.

OPTIONS /
Host: service.example.com
Origin: http://www.example.com

Si service.example.com est disposĂ© Ă  accepter l'action, il peut rĂ©pondre avec les entĂȘtes suivants:

Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: PUT, DELETE

En-tĂȘtes

Les en-tĂȘtes HTTP qui se rapportent Ă  CORS sont :

En-tĂȘtes de requĂȘte

  • Origin
  • Access-Control-Request-Method
  • Access-Control-Request-Headers

En-tĂȘtes de rĂ©ponse

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

Support des navigateurs

CORS est supporté par tous les navigateurs basés sur les moteurs de rendu suivant :

Historique

Le support de cross-origin a Ă©tĂ© proposĂ© initialement par Matt Oshry, Brad Porter, et Michael Bodell de Tellme Networks en mars 2004 pour son inclusion dans VoiceXML 2.1[18], afin de permettre des requĂȘtes cross-origin sĂ»res par le navigateur VoiceXML. Le mĂ©canisme a Ă©tĂ© jugĂ© de nature gĂ©nĂ©rale et non spĂ©cifique Ă  VoiceXML et a par la suite Ă©tĂ© sĂ©parĂ© dans une NOTE d'implĂ©mentation[19]. Le groupe de travail WebApps du W3C, avec la participation des principaux Ă©diteurs de navigateurs ont commencĂ© Ă  officialiser la NOTE dans une Ă©bauche de travail W3C dirigĂ©e vers une Recommandation formelle du W3C.

En mai 2006, la premiÚre ébauche du projet W3C a été soumise[20]. En mars 2009, le projet a été renommé en "Cross-Origin Resource sharing"[21] et, en janvier 2014, il a été accepté comme une Recommandation du W3C[22].

CORS et JSONP

CORS peut ĂȘtre utilisĂ© comme une alternative moderne au modĂšle JSONP. Tandis que JSONP ne supporte que la mĂ©thode de requĂȘte GET, CORS prend Ă©galement en charge d'autres types de requĂȘtes HTTP. CORS permet au programmeur web d'utiliser l'habituel XMLHttpRequest, qui a une meilleure gestion des erreurs que JSONP. D'autre part, JSONP fonctionne sur les navigateurs anciens qui datent d'avant le support de CORS. CORS est pris en charge par la plupart des navigateurs web modernes. Aussi, alors que JSONP peut causer des problĂšmes de sĂ©curitĂ© dus au cross-site scripting (XSS) lorsque le site est compromis, CORS permet aux sites web de traiter manuellement les rĂ©ponses pour augmenter la sĂ©curitĂ©[3] - [23].

Voir aussi

Références

  1. on July 6, 2009 by Arun Ranganathan, « cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog », Hacks.mozilla.org, (consultĂ© le )
  2. « Same-origin policy / Cross-origin network access », MDN
  3. « Cross-domain Ajax with Cross-Origin Resource Sharing », NCZOnline (consulté le )
  4. « Cross-Origin Resource Sharing »
  5. « WebAppSec Working Group Minutes »
  6. « Fetch Living Standard »
  7. « cross-site xmlhttprequest with CORS », MOZILLA (consulté le )
  8. Cross-Origin Resource Sharing.
  9. « Blink », QuirksBlog, (consulté le )
  10. (en-US) « Google going its own way, forking WebKit rendering engine », Ars Technica,‎ (lire en ligne, consultĂ© le )
  11. « HTTP access control (CORS) - MDN », Developer.mozilla.org (consulté le )
  12. « Gecko - MDN », Developer.mozilla.org, (consulté le )
  13. Tony Ross et Program Manager, « CORS for XHR in IE10 », MSDN, (consulté le )
  14. David Honneffer, Documentation Specialist, « 12.00 for UNIX Changelog », Opera, (consulté le )
  15. David Honneffer, Documentation Specialist, « Opera Software: Web specifications support in Opera Presto 2.10 », Opera.com, (consulté le )
  16. « 59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass », Osvdb.org (consulté le )
  17. « Microsoft Edge deverloper's guide »
  18. « Voice Extensible Markup Language (VoiceXML) 2.1 », W3.org, (consulté le )
  19. « Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0 », W3.org (consulté le )
  20. « Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0 W3C - Working Draft 17 May 2006 », W3.org (consulté le )
  21. « Cross-Origin Resource Sharing - W3C Working Draft 17 March 2009 », W3.org (consulté le )
  22. « Cross-Origin Resource Sharing - W3C Recommendation 16 January 2014 », W3.org (consulté le )
  23. « When can I use... Cross Origin Resource Sharing », caniuse.com (consulté le )

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.