2012-08-28 2 views
6

내가 실수 (jQuery를 함께) NextBus에 도메인 간 AJAX 호출을 썼다 :이 교차 도메인 아약스 호출이 실제로 작동하는 이유는 무엇입니까?

$.ajax({ 
     url: 'http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=sf-muni&r=1&s=6294', 
     dataType: 'xml', 
     success: function(data) { 
      do_stuff(); 
     } 
}); 

것이 인이 다른 도메인에서 오는에도 불구하고, 모든 브라우저에서 작동합니다. 단일 오리진 정책이 주어진다면 이것이 실제로 작동하는 이유는 무엇입니까?

페이지가 여기에 있습니다 : http://sftransitfirst.org/F/, 풀다운에서 정지를 선택하면 아약스가 트리거됩니다.

예상대로, Google Maps API Web Services에 대한 비슷한 호출은 익숙한 Origin ... is not allowed by Access-Control-Allow-Origin (그리고 jsonp를 지원하지 않음)으로 실패합니다.

+0

Google URL이 "https"이기 때문에 생각하십니까? 확실하지 않음 –

+8

해당 URL의 응답 헤더 집합에'Access-Control-Allow-Origin : *'이 포함되어 있습니다. [CORS] (https://secure.wikimedia.org/wikipedia/en/wiki/Cross-origin_resource_sharing) –

+1

@Rob 답변으로 작성하십시오.) – Christoph

답변

11

는 그들은 명시 적으로 이러한 방식의 뭔가, 크로스 도메인 액세스 허용해야합니다 :

<ifModule mod_headers.c> 
    Header set Access-Control-Allow-Origin: * 
</ifModule> 
+0

SOP가 클라이언트 측 (브라우저) 보안 조치라고 생각했습니다. 그래도. 원격 웹 서비스가 정책을 무효화하는 것은 목적을 무력화시키는 것 같습니다. 그렇지 않습니까? 즉, 다른 도메인의 이전 리소스를 신뢰해서는 안됩니다. – carillonator

+0

@carillonator 우선, SOP는 서로 다른 출처의 스크립트가 서로의 메소드와 속성에 액세스 할 수 없게합니다. 타사 스크립트가 스크립트에서 설정 한 쿠키를 읽지 못하게합니다. – Christoph

+1

@carillonator 보안상의 위험이있는 곳을 알 수 있습니다. 그러나 이러한 종류의 설정은 콘텐츠에 액세스 할 수있는 사이트 (예 : 트위터)에서만 사용 설정해야합니다. 그리고 보안상의 관점에서 보면,보고있는 사이트는 허용 된 모든 출처가 허용 된 해당 사이트로 전화를 걸어야합니다. 그래서 "해커"걱정의 관점에서 볼 때, 다른 사이트에 호출을 삽입하거나 루트에서 액세스를 활성화하려면 이미 액세스가 필요합니다.이 중 하나는 사이트 보안이 이미 크게 손상된 것입니다. –

5

현대의 많은 웹 API를 Cross-Domain Resource Sharing (CORS)를 활성화 :

<?php header('Access-Control-Allow-Origin: *'); ?> 

또는 htaccess로와

. CORS는 웹 사이트가 자발적으로 자신의 페이지를 도메인 간 스크립트에 사용할 수있게하는 방법입니다. 서버의 Access-Control-Allow-Origin HTTP 헤더가 웹 브라우저에 신호를 보내면 Ajax가있는 페이지에 액세스 할 수 있도록 허용합니다. 스크립트가 다른 출처에서 실행중인 경우에도 마찬가지입니다. 서버가 CORS 헤더를 제공하지 않으면 브라우저는 평소와 같이 SOP를 적용합니다.

대부분의 API는 사실상 모든 사용자가 자신의 도메인에서 Ajax를 통해 API에 액세스 할 수 있기를 원하기 때문에 크로스 도메인 스크립트에 페이지를 표시합니다.

관련 문제