0

이 개념은 내가 이해했다고 생각했지만 최근에는 모두 잘못되었다는 것을 알았습니다. 나는 인터넷을 둘러 보면서 작은 세부 사항과 코드 스 니펫에 대한 많은 예제를 찾았지만, 여전히 그것이 무엇을 방해하는지, 왜 그것을 막는 지에 대한 이해가 부족합니다. 그래서 이것은 질문보다 높은 수준의 설명을 요구하는 것입니다.교차 출처 xhr 및 동일 출처 정책

것은이 전 도메인 A.com 및 도메인 B.com 있다고 가정 해 봅시다 :

은 어쨌든, 여기에 내가 그것에 대해 이해 무슨 생각입니다. 각각은 자신의 IP 주소를 가진 자신의 아파치 서버에있다. 도메인 A.com에서 브라우저로 html 파일을로드합니다. 브라우저는 POST XMLHttpRequest에서 B.com/doStuff.php로 실행합니다. 동일한 도메인 정책이 설정되어있어 실패합니다.

그래서 : 누가 동일한 도메인 정책과 관련이 있습니까? 나는 대답이 B.com/doStuff.php라고 생각하는데 ... 맞습니까? 그래서 A가 요청을 보냈을 때 B는 요청 헤더에서 출발지를 확인한 후 "whoops, different domain, hear not you"라고 말합니다. 또는 A가 요청을 보내고 B가 "same-domain-policy"를 지정하는 헤더로 응답 한 다음 브라우저는 same-domain-policy가 지정되었고 A 요청의 헤더에서 도메인이 일치하지 않는지 확인합니다 BROWSER가 xhr을 발송하기를 거부 한 B 요청의 사람?

그렇다면 "출처를 초월한 요청을 허용하지 않는 이유는"내 API에 액세스하는 다른 사람을 원하지 않기 때문입니다. 그게 다야? 왜냐하면 당신은 어떤 종류의 인증으로 대신 그것을 해결하기를 원하지 않으니 까? 누군가가 가짜 기원 헤더 (단순히 거짓말)로 HTTP 요청을 구성 할 수 없습니까?

또는 어떻게 든 사용자를 보호하기로되어 있습니까? 그렇다면 API를 다른 사람을 보호하도록 전화하는 것을 어떻게 막을 수 있습니까?

난 너무 혼란 스러워요

...

+0

예를 들어 말풍선을 사용하여 기계가 URL을 가져 오는 것을 멈추지 않으며 브라우저 기반의 가져 오기를 중지하려고 시도합니다. non-js 위협을 차단하려면 인증해야합니다. 핵심은 명시 적으로 허용하지 않고 사이트의 콘텐츠를 서명되지 않은 JS로 다시 포함시킬 수 없다는 점입니다. – dandavis

+0

@dandavis는 그다지 피하는 것이 쉽지 않습니까?그냥 자바 스크립트 요청을 귀하의 서버 (예 : 곱슬)와 그것을 가져옵니다 다음 다시 자바 스크립트에 전달 ... 요점은 무엇입니까? – Phildo

+0

요점은 통제와 책임입니다 : 서버/PHP 코드는 신용 카드에 등록되어 있습니다. 일반 오래된 웹 페이지는 아닙니다. 귀하의 예에서는 컬을 수행하는 서버를 쉽게 식별하고 차단할 수 있지만 트래픽이 광고 삽입 자바 스크립트에서 오는 경우 요청은 모든 곳에서 올 수 있습니다 ... – dandavis

답변

0

아이디어는 자바 스크립트를 통해 서버 A에서 서버 B에 접근하지 않는다는 것입니다. API와 상호 작용하는 경우 javascript를 사용하여 자체 서버의 백엔드 코드를 호출하면 다른 서버를 호출하게됩니다.

+0

하지만 왜? "나는 누군가가 자바 스크립트에서 내 API에 액세스하는 것을 원하지 않지만 PHP에서 확인한 경우"이 인프라를 정당화하는 완전히 피상적 인 이유처럼 보인다 ... – Phildo

1
Who's same-domain-policy is relevant? 

요청을 수신하는 서버를 결정합니다.

... the BROWSER refuses to send out the xhr? 

아니, 서버가 응답을 거부합니다. 더 정확하게 말하자면, 현대의 브라우저에서는 preflighted requests으로 끝납니다. 이것은 각 교차 출처 요청에 대해 OPTIONS 요청이 의도 한 요청과 완전히 동일하지만 요청 본문이없는 브라우저의 브라우저에 의해 자동으로 전송된다는 것을 의미합니다. 서버는 헤더로만 응답합니다. 응답의 액세스 제어 헤더는 서버의 정책에 따라 요청이 수행되는지 여부를 클라이언트 브라우저가 알도록합니다. 어떤 점에서 브라우저는 요청을 방지하지만 서버와 요청/응답 쌍을 이미 교환했기 때문에 요청을 시도 할 필요가 없음을 알고 있습니다. 이 경우 요청을 위조해도 서버는 계속 서비스를 거부합니다.

+0

좋습니다. 그 점을 명확히 해 주셔서 감사합니다! 하지만이 모든 일의 유일한 목적은 사용자가 API에 액세스하지 못하도록하는 것이지만 javascript를 통해서만 수행한다는 것입니다. (IE- 귀하의 API는 여전히 다른 어떤 것에 의해 액세스 될 수 있습니다. 브라우저가 JS가 원점 헤더를 편집하는 방법을 지원하지 않기 때문에 javascript가이를 수행 할 수없는 유일한 이유는 무엇입니까?). 그게 누구 보호인가? API에 여전히 액세스 할 수 있습니다. 간단한 해결 방법 만 있으면됩니다 (전화를 걸려면 서버에 알려준 다음 js로 다시 전달하십시오). – Phildo

+0

"간단한 해결 방법 만 필요합니다"는별로 좋지 않은 "그냥"이며, 기본적인 클라이언트 측 웹 보안의 기반이되는 것은 그 차이입니다. PHP 서버를 종료 할 수 있습니다, 루즈 스크립트가 훨씬 더 힘들게 소화하고 컬 또는 PHP와 사람과 그들의 형제가 쓸 수있는 것보다 훨씬 큰 문제를 포즈. – dandavis

+0

@dandavis - 기본 클라이언트 측 웹 보안의 기반! 만약 내가 (안부를 허락 한) 초보자가 쉽게 악용 할 수있는 임시 해결 방법이 있다면 (나는 여전히 기다리고 있거나 교정되기를 바라고 ...) 클라이언트 측 웹이 망가져있다! 기껏해야 이것은 게으른 해커들에게 최전선 장벽이되는 것 같습니다 ...? 그것이 전부라면, 그렇게 될 것입니다. 그러나 나는 이런 종류의 일이 큰 일인 것처럼 나는 계속해서 대화를 듣고있는 것처럼 느낍니다. (그리고 나는 진실로 무례 함을 의미하지 않습니다. 나는 아직도이 모든 것을 이해하기 위해 고심하고 있으며, 나는 여전히 실종되었다고 확신합니다 ...) – Phildo