크로스 오리진 자원 공유
Cross-origin resource sharingCross-Origin Resource Sharing(CORS)은 웹 페이지의 제한된 리소스를 첫 번째 리소스가 제공된 도메인 외부의 다른 도메인에서 [1]요청할 수 있는 메커니즘입니다.
웹 페이지는 여러 원본 이미지, 스타일시트, 스크립트, iframe 및 비디오를 자유롭게 [2]포함할 수 있습니다.특정 "크로스 도메인" 요청, 특히 Ajax 요청은 기본적으로 동일한 원본 보안 정책에 의해 금지됩니다.CORS는 브라우저와 서버가 상호 작용하여 크로스 오리진 [3]요구를 허용하는 것이 안전한지 여부를 판단하는 방법을 정의합니다.순수하게 같은 발신기지 요구보다 더 많은 자유와 기능을 제공하지만 단순히 모든 발신기지 요구를 허용하는 것보다 더 안전합니다.
CORS 사양은 WHATWG의 Fetch Living [4]Standard에 포함되어 있습니다.이 사양은 [5]현재 브라우저에서 CORS가 어떻게 구현되어 있는지를 설명합니다.이전 사양은 W3C [6]권장사항으로 발행되었습니다.
기술 개요
데이터를 변경할 수 있는Ajax 및 HTTP 요구 방식(일반적으로 GET 이외의 HTTP 방식 또는 특정 MIME 유형에서의 POST 사용)의 경우 사양에서는 브라우저가 요구를 '프리플라이트'하고 HTTP OPTIONS 요구 방식을 사용하여 서버에서 지원되는 메서드를 요청하고 서버에서 '승인'하면 실제 요구 사항을 전송하도록 규정하고 있습니다.실제 HTTP 요청 방식을 사용합니다.서버는,[7] 클라이언트에게 「credentials」(Cookie 및 HTTP 인증 데이터 포함)를 요구와 함께 송신할지를 통지할 수도 있습니다.
간단한 예
사용자가 http://www.example.com에 접속하여 페이지가 교차 검색 요청을 시도하여 http://service.example.com에서 사용자의 데이터를 가져오려고 한다고 가정합니다.CORS 호환 브라우저는 다음과 같이 service.example.com에 크로스 컨버전스 요청을 시도합니다.
- 브라우저는 GET 요청을 추가와 함께 전송합니다.
Origin부모 페이지를 서비스한 도메인을 포함하는 service.example.com에 대한 HTTP 헤더:출처 : http://www.example.com
- service.example.com 의 서버는, 다음의 3 개의 응답 중 하나를 송신합니다.
- 요구된 데이터와 함께
Access-Control-Allow-Origin송신원으로부터의 요구를 나타내는 응답내의 (ACAO) 헤더가 허가됩니다.예를 들어, 이 경우 다음과 같습니다.Access-Control-Allow-Origin : http://www.example.com
- 요구된 데이터와 함께
Access-Control-Allow-Origin(ACAO) 헤더에는 모든 도메인으로부터의 요구가 허가되고 있는 것을 나타내는 와일드카드가 포함되어 있습니다.액세스 제어 허가 발신지: *
- 서버가 발신기지 간 요청을 허용하지 않는 경우 오류 페이지
- 요구된 데이터와 함께
와일드카드 동일 발신원 정책은 페이지 또는 API 응답이 완전한 퍼블릭콘텐츠로 간주되어 임의의 사이트의 코드를 포함하여 모든 사용자가 액세스할 수 있도록 하는 경우에 적합합니다.구글 폰트와 같은 공공 호스팅 서비스에서 무료로 사용할 수 있는 웹 폰트가 그 예입니다.
와일드카드 동일 발신기지 정책은 오브젝트 기능 모델에서도 폭넓고 적절하게 사용됩니다.이 모델에서는 페이지에 추측할 수 없는 URL이 있어 비밀을 알고 있는 사람은 누구나 액세스 할 수 있습니다.
「*」의 값은, 요구의 credential을 지정할 수 없다는 점에서 특별합니다.즉, HTTP 인증, 클라이언트측의 SSL 증명서, 또는 쿠키를 크로스 도메인 [8]요구로 송신할 수 없습니다.
CORS 아키텍처에서는 Access-Control-Allow-Origin 헤더는 원래 웹 애플리케이션서버(www.example.com)가 아닌 외부 웹 서비스(service.example.com)에 의해 설정됩니다.여기서 service.example.com은 CORS를 사용하여 브라우저가 service.example.com에 요청을 할 수 있도록 허용하고 있습니다.
사이트에서 "Access-Control-Allow-Credentials:true" 헤더가 지정되어 있는 경우 타사 사이트는 특권 액션을 수행하고 중요한 정보를 검색할 수 있습니다.그렇지 않더라도 공격자는 사용자의 브라우저를 통해 프록시를 통해 IP 기반 액세스 제어를 무시할 수 있습니다.
프리플라이트 예시
특정 유형의 교차 도메인 Ajax 요청을 실행할 때 CORS를 지원하는 최신 브라우저는 추가 "사전 비행" 요청을 시작하여 작업을 수행할 수 있는 권한이 있는지 여부를 판단합니다.크로스 오리진 요구는 사용자 데이터에 영향을 미칠 수 있기 때문에 이러한 방식으로 사전 전송됩니다.
OPTIONS / Host: service.example.com 오리진: http://www.example.com Access-Control-Request-Method: PUT
service.example.com 가 액션을 받아들일 의향이 있는 경우는, 다음의 헤더로 응답할 수 있습니다.
Access-Control-Allow-Origin : http://www.example.com 접근컨트롤-Allow-Methods : PUT
그러면 브라우저가 실제 요청을 합니다.service.example.com가 이 발신기지로부터의 크로스 사이트 요구를 받아들이지 않는 경우 OPTIONS 요구에 대한 오류로 응답하고 브라우저는 실제 요청을 하지 않습니다.
머리글
CORS와 관련된HTTP 헤더는 다음과 같습니다.
요청 헤더
OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
응답 헤더
Access-Control-Allow-OriginAccess-Control-Allow-CredentialsAccess-Control-Expose-HeadersAccess-Control-Max-AgeAccess-Control-Allow-MethodsAccess-Control-Allow-Headers
브라우저 지원
CORS는 다음 레이아웃엔진에 기반한 모든 브라우저에서 지원됩니다.
- Blink 기반 및 Chrome 기반 브라우저(Chrome 28+,[9][10] Opera 15+,[9] Amazon Silk, Android의 4.4+ WebView 및 Qt의 WebEngine)
- Gecko 1.9.1(Firefox 3.5,[11] SeaMonkey 2.0[12]) 이상.
- MSHTML/Trident 6.0(Internet Explorer 10)은 네이티브로 지원됩니다.[13]MSHTML/Trident 4.0 및 5.0(Internet Explorer 8 및 9)은 XDomainRequest [1]개체를 통해 부분적으로 지원합니다.
- Presto 기반 브라우저(Opera)는 Opera 12.00[14] 및 Opera Mobile 12에서 CORS를 구현하지만 Opera [15]Mini는 구현하지 않습니다.
- WebKit (초기 리비전 불명, Safari 4 이상,[1] Google Chrome 3 이상, 아마도 이전 [16]버전)
- Microsoft Edge 모든 버전[17]
역사
크로스 오리진 지원은 원래 2004년 3월 Tellme Networks의 Matt Oshry, Brad Porter 및 Michael Bodell에 의해 VoiceXML 2.1에[18] 포함되어 VoiceXML 브라우저에 의한 안전한 크로스 오리진 데이터 요구를 가능하게 하기 위해 제안되었습니다.이 메커니즘은 본질적으로 일반적이며 VoiceXML에 고유하지 않다고 간주되어 이후 구현 [19]NOTE로 분리되었습니다.주요 브라우저 벤더가 참여한 W3C의 WebApps Working Group은 공식적인 W3C 권고 상태를 목표로 W3C 작업 초안으로 NOTE를 공식화하기 시작했습니다.
2006년 5월에 최초의 W3C 작업 초안이 [20]제출되었습니다.2009년 3월 초안은 "Cross-Origin Resource Sharing"[21]으로 이름이 변경되었으며, 2014년 1월에는 W3C [22]권고안으로 승인되었습니다.
CORS vs JSONP
CORS는 JSONP 패턴의 현대적인 대안으로 사용될 수 있습니다.CORS의 이점은 다음과 같습니다.
- JSONP가 지원하는 것은
GET요구 방식, CORS는 다른 유형의 HTTP 요청도 지원합니다. - CORS를 통해 웹 프로그래머는 일반 XMLHttpRequest를 사용할 수 있습니다.이것에 의해, JSONP보다 뛰어난 에러 처리가 서포트됩니다.
- JSONP는 외부 사이트가 침해되었을 때 사이트 간 스크립팅(XSS) 문제를 일으킬 수 있지만 CORS를 사용하면 웹 사이트에서 응답을 수동으로 해석하여 [3]보안을 강화할 수 있습니다.
JSONP의 주요 장점은 CORS 지원 이전의 레거시 브라우저(Opera Mini 및 Internet Explorer 9 이전)에서 작업할 수 있다는 것입니다.CORS는 현재 대부분의 최신 [23]웹 브라우저에서 지원됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b c on July 6, 2009 by Arun Ranganathan (2009-07-06). "cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog". Hacks.mozilla.org. Retrieved 2012-07-05.
- ^ "Same-origin policy / Cross-origin network access". MDN.
- ^ a b "Cross-domain Ajax with Cross-Origin Resource Sharing". NCZOnline. Retrieved 2012-07-05.
- ^ "Fetch Living Standard".
- ^ "WebAppSec Working Group Minutes".
- ^ "Cross-Origin Resource Sharing".
- ^ "cross-site xmlhttprequest with CORS". MOZILLA. Retrieved 2012-09-05.
- ^ [1] W3.org 。2021-31-07에 취득.
- ^ a b "Blink". QuirksBlog. April 2013. Retrieved 4 April 2013.
- ^ "Google going its own way, forking WebKit rendering engine". Ars Technica. April 2013. Retrieved 4 April 2013.
- ^ "HTTP access control (CORS) - MDN". Developer.mozilla.org. Archived from the original on 2010-05-27. Retrieved 2012-07-05.
- ^ "Gecko - MDN". Developer.mozilla.org. 2012-06-08. Retrieved 2012-07-05.
- ^ Tony Ross; Program Manager; Internet Explorer (2012-02-09). "CORS for XHR in IE10". MSDN. Retrieved 2012-12-14.
- ^ David Honneffer, Documentation Specialist (2012-06-14). "12.00 for UNIX Changelog". Opera. Archived from the original on 2012-06-18. Retrieved 2012-07-05.
- ^ David Honneffer, Documentation Specialist (2012-04-23). "Opera Software: Web specifications support in Opera Presto 2.10". Opera.com. Retrieved 2012-07-05.
- ^ "59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass". Osvdb.org. Archived from the original on 2012-07-19. Retrieved 2012-07-05.
- ^ "Microsoft Edge deverloper's guide".
- ^ "Voice Extensible Markup Language (VoiceXML) 2.1". W3.org. 2004-03-23. Retrieved 2012-07-05.
- ^ "Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0". W3.org. Retrieved 2012-07-05.
- ^ "Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0 W3C - Working Draft 17 May 2006". W3.org. Retrieved 17 August 2015.
- ^ "Cross-Origin Resource Sharing - W3C Working Draft 17 March 2009". W3.org. Retrieved 17 August 2015.
- ^ "Cross-Origin Resource Sharing - W3C Recommendation 16 January 2014". W3.org. Retrieved 17 August 2015.
- ^ "When can I use... Cross Origin Resource Sharing". caniuse.com. Retrieved 2012-07-12.