2016-09-03 3 views
1

XMLHttpRequest을 사용하는 아주 간단한 예를 생각해보십시오.브라우저가 xorigin POST를 허용하지만 PUT을 허용하지 않는 이유는 무엇입니까?

다음 게시물 제대로은 http://requestb.in/yckncpyc를로드 할 수 없습니다 콘솔

XMLHttpRequest의에 대한 경고를 출력하지만 (당신은 네트워크 탭 또는 http://requestb.in/yckncpyc에 브라우저를 지시하여 볼 수 있습니다). 아니요 요청한 리소스에 'Access-Control-Allow-Origin'헤더가 있습니다. 따라서 원본 'null'은 액세스가 허용되지 않습니다.

const method = "POST" 
 
const req = new XMLHttpRequest() \t 
 
req.open(method, 'http://requestb.in/yckncpyc') 
 
req.send("foobar") 
 
console.log("sent") 
 
req.addEventListener('load', function() { console.log(req.status, req.response) })

물론

. 알 겠어. 왜 내가 얻지 못하는 것은 단지 PUT으로 사용 된 동사를 바꾸는 것이 전혀 다른 결과를 가져 오는 이유입니다. 전송 된 요청이 OPTIONS 프리 플라이트 요청하고

은 XMLHttpRequest http://requestb.in/yckncpyc를로드 할 수 없습니다 인쇄합니다. 프리 플라이트 요청에 대한 응답으로 액세스 제어 검사를 통과하지 못했습니다. 아니요 요청한 리소스에 'Access-Control-Allow-Origin'헤더가 있습니다. 따라서 원본 'null'은 액세스가 허용되지 않습니다.

const method = "PUT" 
 
const req = new XMLHttpRequest() \t 
 
req.open(method, 'http://requestb.in/yckncpyc') 
 
req.send("foobar") 
 
console.log("sent") 
 
req.addEventListener('load', function() { console.log(req.status, req.response) })

왜 브라우저 * 다르게 이러한 치료 않습니다 ? 보안을 위해 수행되는 것처럼 보이지만 공격자가 PUT 대신 항상 POST를 사용할 수 있기 때문에 실제로는 의미가 없습니다.

여기 논리는 무엇입니까?

  • 은, 크롬 52에서 사파리 9.1.2

답변

1

GET, HEAD 및 (몇 가지 다른 제한) POST 요청이 시도 추가 통신을 교차 기원을 만들 수 있습니다. 응답은 검사 할 수 없지만 요청은 허용됩니다.

다른 경우 프리 플라이트 요청이 허용되는지 여부를 확인하기 위해 대상 사이트의 헤더를 확인해야합니다.

이러한 설정에 대한 이유

HEADGET이며, POST는 역사적으로 HTML 의미의 자연스러운 한 부분으로 브라우저에서 허용되었다. 스크립트 및 CSS 용 태그 및 이미지는 GET 요청을하고 양식은 POST를 수행합니다. 따라서 CORS가 도입되었을 때 사이트는 XHR 세계와 같은 단순한 요청에 더 이상 취약하지 않다는 가정하에 허용되었습니다. 그런 다음 XHR이 아닌 세계에서는 더 단순한 요청이었습니다.

간단한 요청이 허용되며 브라우저는 응답 헤더를보고 크로스 원본 페이지의 요청 코드가 응답 내용을 볼 수 있도록 허용되어야하는지 여부를 결정합니다. 다른 요청의 경우 브라우저는 먼저 OPTIONS 요청을 보내 CORS 응답 헤더를 확인합니다.확인 표시가있는 경우에만 (즉, 응답 헤더에 적절한 "예 (OK)"헤더가있는 경우) XHR을 계속 진행할 수 있습니다.

+0

흠 ...이 사양은 어디에 있습니까? 나는 [사양에서 이것에 대해 아무 것도 안다] (https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6). 그리고 그 문제에 관해서,이 세상에는 그것을위한 추론이 무엇입니까? –

+0

@GeorgeMauer 대답 확장 - [여기 주제에 관한 MDN 기사입니다.] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) – Pointy

+0

흠 ... 그래서 이것들 중 하나입니다. 것들은 사양이 아니지만 브라우저는 어쨌든 그것을합니까? –

관련 문제