교차 출처 리소스 공유
교차 출처 리소스 공유(Cross-origin resource sharing, CORS), 교차 출처 자원 공유는 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다.[1] 웹페이지는 교차 출처 이미지, 스타일시트, 스크립트, iframe, 동영상을 자유로이 임베드할 수 있다.[2]
다만 특정 교차 도메인 간(cross-domain) 요청, 특히 Ajax 요청은 동일-출처 보안 정책에 의해 기본적으로 금지된다.
CORS는 교차 출처 요청을 허용하는 것이 안전한지 아닌지를 판별하기 위해 브라우저와 서버가 상호 통신하는 하나의 방법을 정의한다.[3] 순수하게 동일한 출처 요청보다 더 많은 자유와 기능을 허용하지만 단순히 모든 교차 출처 요청을 허용하는 것보다 더 안전하다. CORS의 사양은 원래 W3C 권고안으로 배포되었으나[4] 해당 문서는 쓸모 없어진(obsolete) 상태이다.[5] 현재 CORS를 재정의하면서 활발히 유지보수된 사양은 WHATWG의 Fetch Living Standard이다.[6]
CORS의 동작 원리
다른 도메인을 가리키거나 허용 목록에 포함되지 않은 헤더를 포함하는 <form> 태그를 사용하여 수행할 수 없는 자바스크립트에서 생성된 HTTP 요청의 경우 사양에서는 브라우저가 요청을 "사전 실행"(preflight)하여 HTTP를 사용하여 서버에서 지원되는 메서드를 요청하도록 규정한다. OPTIONS 요청 메소드를 사용하고 서버에서 "승인"되면 실제 HTTP 요청 메소드로 실제 요청을 보낸다. 또한 서버는 요청과 함께 "자격 증명"(쿠키 및 HTTP 인증 데이터 포함)을 보내야 하는지 여부를 클라이언트에게 알릴 수 있다.[7]
헤더
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
지원 브라우저
- 블링크 및 크로미엄 기반 브라우저(크롬 28+[8][9], 오페라 15+[8], Amazon Silk, 안드로이드의 4.4+ WebView 및 Qt의 WebEngine)
- 게코 1.9.1(Firefox 3.5[10], SeaMonkey 2.0[11]) 이상.
- MSHTML/Trident 6.0(Internet Explorer 10)은 기본적으로 지원된다.[12] MSHTML/Trident 4.0 및 5.0(Internet Explorer 8 및 9)은 XDomainRequest 개체를 통해 부분적인 지원을 제공한다.[13]
- 프레스토 기반 브라우저(오페라)는 오페라 12.00[14] 및 오페라 모바일 12부터 CORS를 구현하지만 오페라 미니는 구현하지 않는다.[15]
- 웹킷(초기 버전은 불확실함, Safari 4 이상[1], Google Chrome 3 이상, 이전 버전일 수도 있음)[16]
- 마이크로소프트 엣지 모든 버전.[17]
역사
교차 출처 지원(Cross-origin support)은 원래 VoiceXML 브라우저의 안전한 교차 출처 데이터 요청을 허용하기 위해 VoiceXML 2.1[18]에 포함시키기 위해 텔미 네트웍스(Tellme Networks)의 맷 오시리, 브래드 포터, 마이클 보델에 의해 제안되었다. 이 메커니즘은 본질적으로 일반적인 것으로 간주되어 VoiceXML에만 국한되지 않으며 이후에 구현 참고로 분리되었다.[19] 주요 브라우저 공급업체가 참여한 W3C의 웹앱스(WebApps) 워킹 그룹은 공식적인 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를 사용하면 웹 프로그래머가 JSONP보다 더 나은 오류 처리를 지원하는 일반 XMLHttpRequest를 사용할 수 있다.
- JSONP는 외부 사이트가 손상될 때 XSS(교차 사이트 스크립팅) 문제를 일으킬 수 있지만 CORS는 웹사이트에서 응답을 수동으로 구문 분석하여 보안을 강화할 수 있도록 한다.
JSONP의 가장 큰 장점은 CORS 지원 이전의 레거시 브라우저(Opera Mini 및 Internet Explorer 9 이하)에서 작동할 수 있다는 것이다. CORS는 이제 대부분의 최신 웹 브라우저에서 지원된다.
같이 보기
각주
- ↑ 가 나 on July 6, 2009 by Arun Ranganathan (2009년 7월 6일). “cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog”. Hacks.mozilla.org. 2012년 7월 5일에 확인함.
- ↑ “Same-origin policy / Cross-origin network access”. MDN.
- ↑ “Cross-domain Ajax with Cross-Origin Resource Sharing”. NCZOnline. 2012년 7월 5일에 확인함.
- ↑ “Cross-Origin Resource Sharing”.
- ↑ “WebAppSec Working Group Minutes”.
- ↑ “Fetch Living Standard”.
- ↑ “Cross-Origin Resource Sharing (CORS) - HTTP | MDN”. 《developer.mozilla.org》. 2023년 5월 10일. 2023년 6월 7일에 확인함.
- ↑ 가 나 “Blink”. QuirksBlog. April 2013. 2013년 4월 4일에 확인함.
- ↑ “Google going its own way, forking WebKit rendering engine”. Ars Technica. April 2013. 2013년 4월 4일에 확인함.
- ↑ “HTTP access control (CORS) - MDN”. Developer.mozilla.org. 2010년 5월 27일에 원본 문서에서 보존된 문서. 2012년 7월 5일에 확인함.
- ↑ “Gecko - MDN”. Developer.mozilla.org. 2012년 6월 8일. 2012년 8월 3일에 원본 문서에서 보존된 문서. 2012년 7월 5일에 확인함.
- ↑ Tony Ross; Program Manager; Internet Explorer (2012년 2월 9일). “CORS for XHR in IE10”. MSDN. 2012년 12월 14일에 확인함.
- ↑ “cross-site xmlhttprequest with CORS”. MOZILLA. 2012년 9월 5일에 확인함.
- ↑ David Honneffer, Documentation Specialist (2012년 6월 14일). “12.00 for UNIX Changelog”. Opera. 2012년 6월 18일에 원본 문서에서 보존된 문서. 2012년 7월 5일에 확인함.
- ↑ David Honneffer, Documentation Specialist (2012년 4월 23일). “Opera Software: Web specifications support in Opera Presto 2.10”. Opera.com. 2012년 7월 5일에 확인함.
- ↑ “59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass”. Osvdb.org. 2012년 7월 19일에 원본 문서에서 보존된 문서. 2012년 7월 5일에 확인함.
- ↑ “Microsoft Edge deverloper's guide”. 2023년 12월 21일.
- ↑ “Voice Extensible Markup Language (VoiceXML) 2.1”. W3.org. 2004년 3월 23일. 2012년 7월 5일에 확인함.
- ↑ “Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0”. W3.org. 2012년 7월 5일에 확인함.
- ↑ “Authorizing Read Access to XML Content Using the <?access-control?> Processing Instruction 1.0 W3C - Working Draft 17 May 2006”. W3.org. 2015년 8월 17일에 확인함.
- ↑ “Cross-Origin Resource Sharing - W3C Working Draft 17 March 2009”. W3.org. 2015년 8월 17일에 확인함.
- ↑ “Cross-Origin Resource Sharing - W3C Recommendation 16 January 2014”. W3.org. 2015년 8월 17일에 확인함.
외부 링크
- Fetch Living Standard (the current specification for CORS)
- 잘못된 파일 링크가 포함된 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- Ajax
- W3C 표준