2011-01-30 8 views
47

이 질문은 출처와 공유 리소스 공유 (CORS, http://www.w3.org/TR/cors/)와 관련이 있습니다.CORS 오류를 잡아낼 수 있습니까?

CORS 요청시 오류가 발생하면 Chrome (및 다른 AFAIK 브라우저에서도 오류 콘솔에 오류가 기록됨). 예제 메시지는 다음과 같습니다.

XMLHttpRequest는 http://domain2.example을로드 할 수 없습니다. Origin http://domain1.example은 Access-Control-Allow-Origin에서 허용되지 않습니다.

프로그래밍 방식으로이 오류 메시지가 표시되는 방법이 궁금합니다. try/catch에서 xhr.send() 호출을 포장하려고 시도했지만 onerror() 이벤트 처리기를 추가하려고 시도했습니다. 어느 쪽도 오류 메시지를 수신하지 않습니다.

+1

이것이 가능한지 의심 스럽지만, 브라우저 기능이므로 자바 스크립트의 범위를 벗어납니다. 그 외에도 스니핑에 사용할 수있는 보안 구멍이 생길 수 있습니다. –

+0

이것에 대해서도 궁금합니다. –

답변

26

참조 : CORS에 대한 XHR 레벨 2에서

...뿐만 아니라 메모 :

이 정보는 의도적으로 거르는.

몇 달 후 편집 : 여기에 추가 답변으로 "이유"가 표시됩니다. 첫 번째 링크의 앵커에 몇 개의 문자가 누락되어 내가 언급했던 문서의 부분을보기가 어려워졌습니다.

이것은 보안상의 문제입니다. 민감한 HTTP 헤더에서 정보가 노출되지 않도록하려는 시도입니다. CORS에 대한 W3C 링크는 말한다 :

사용자 에이전트가의 값 중 하나의 필드 이름이 ASCII의 대소 문자를 구분하지 일치 간단한 응답 헤더 또는이다 그 이외의 모든 응답 헤더를 필터링한다 Access-Control-Expose-Headers 헤더 (있는 경우). CORS API 사양에 정의 된 API에 응답 헤더를 표시합니다.

그 구절은 Cache-Control, Content-Language, Content-Type, 만료, Last-Modified 및 Pragma를 나열하는 "간단한 응답 헤더"에 대한 링크를 포함합니다. 그래서 그것들은지나갑니다. "Access-Control-Expose-Headers headers"부분은 원격 서버가 다른 헤더를 노출 할 수있게합니다. 자세한 내용은 W3C 설명서를 참조하십시오.

하나의 출처가 있습니다. 브라우저에로드 한 웹 페이지로 일부 JavaScript를 실행한다고 가정 해 봅시다. 스크립트는 다른 출처로 요청합니다. 일반적으로 허용되지는 않습니다. 그런 식으로 불쾌한 일을하십시오. 따라서 스크립트를 실행하고 대신 HTTP 요청을 수행하는 브라우저는 게이트 키퍼 역할을합니다.

브라우저는 "다른 출처"서버의 응답을보고 CORS에서 "참여하지 못하는 것"인 경우 - 필요한 헤더가 누락되었거나 형식이 잘못되었습니다 - 그러면 우리는 신뢰 없음. 로컬에서 실행되는 스크립트가 이러한 방식으로 연락 될 것으로 예상되지 않는 서버에 접속하려고 시도하는 것으로 보이기 때문에 성실히 행동하고 있는지 확인할 수 없습니다.브라우저는 필터링없이 스크립트에 전체 응답을 전달함으로써 원격 서버의 중요한 정보를 "누설하지"않아야합니다. 기본적으로 이되며은 원본의 교차 요청을 허용합니다. 정보 유출 취약점이 발생할 수 있습니다.

이로 인해 디버깅이 어려워 질 수 있지만 "사용자"가이 컨텍스트의 개발자이기 때문에 보안이 중요한 우선 순위를 갖기 때문에 보안과 가용성 사이의 균형을 유지해야합니다.

+5

누군가가 왜 그런지 설명했다면 - 즉 4xx 응답의 본문이 의도적으로 필터링 된 이유 -이 답변은 조금 더 좋을 수 있습니다. 링크 된 기사를 통한 빠른 검토는 도움이되지 않았습니다. –

+1

정말 좋고 필요한가요? 스크립트는 오류 메시지를받지 않습니다. 물론 CORS 설정이라고 결론 지을 수 있습니다. 그것은 무엇 일 수 있는가? 유래? 헤더 필드? 나쁜 녀석들이 알고있는 것 같아요. 모르는 우리의 나머지 부분 일뿐입니다. – Leo

+0

이 비슷한 질문에는 오류 메시지가 표시되지 않는 이유에 대한 추가 정보가 있습니다. https://stackoverflow.com/questions/19325314/how-to-detect-cross-origin-cors-error-vs -other-types-of-errors-for-xmlhttpreq – contrebis

관련 문제