프리 플라이트 요청을 도입 한 동기는 무엇입니까?
프리 플라이트 요청이 도입되어 브라우저가 특정 요청을 보내기 전에 CORS 인식 서버를 처리하고 있는지 확인할 수 있습니다. 이러한 요청은 잠재적으로 위험하고 (상태 변경) 새로운 요청으로 정의되었습니다 ( 동일한 출처 정책 으로 인해 CORS 이전에는 불가능 ). 프리 플라이트 요청을 사용한다는 것은 서버가 CORS가 수행 할 수있는 잠재적으로 위험한 새 유형의 요청에 대해 프리 플라이트에 적절히 응답하여 옵트 인해야한다는 것을 의미합니다.
이는 이 사양의이 부분의 의미입니다 . "이 사양이 존재하기 전에 특정 사용자 에이전트에서 생성 할 수없는 출처 간 요청으로부터 리소스를 보호하기 위해 리소스가이 사양을 인식 할 수 있도록 프리 플라이트 요청이 수행됩니다."
예를 들어 주시겠습니까?
브라우저 사용자가의 은행 사이트에 로그인했다고 가정 해 보겠습니다 A.com
. 악의있는 사용자를 탐색하면 B.com
해당 페이지에 DELETE
요청을 보내려는 일부 Javascript가 포함 됩니다 A.com/account
. 사용자가에 로그인 했으므로 A.com
해당 요청에는 전송 된 경우 사용자를 식별하는 쿠키가 포함됩니다.
CORS 이전에는 브라우저의 동일한 오리진 정책이이 요청을 보내는 것을 차단했습니다. 그러나 CORS의 목적은 이러한 종류의 교차 출처 통신을 가능하게하는 것이므로 더 이상 적합하지 않습니다.
브라우저 는 단순히를 보내고 DELETE
서버가 처리 방법을 결정하도록 할 수 있습니다. 그러나 A.com
CORS 프로토콜을 모르는 경우 어떻게해야 합니까? 계속해서 위험 할 수 DELETE
있습니다. 브라우저의 동일한 출처 정책으로 인해 그러한 요청을받을 수 없으므로 그러한 공격에 대해 강화 된 적이 없다고 가정했을 수도 있습니다.
이러한 비 CORS 인식 서버를 보호하려면 프로토콜에 따라 브라우저가 먼저 비행 전 요청을 보내야합니다 . 이 새로운 종류의 요청은 CORS를 인식하는 서버 만 제대로 응답 할 수있어 브라우저가 실제를 전송하는 것이 안전한지 여부를 알 수 DELETE
있습니다.
왜이 모든 것이 브라우저에 대한 소란을 불러 일으킬 수 DELETE
있습니까? 공격자 는 자신의 컴퓨터에서 요청을 보낼 수 없습니까?
물론 그러한 요청에는 사용자의 쿠키가 포함되지 않습니다. 이를 방지하기위한 공격은 브라우저가 요청과 함께 다른 도메인에 대한 쿠키 (특히 사용자의 인증 정보)를 전송한다는 사실에 의존합니다.
같은 그 소리 크로스 사이트 요청 위조 사이트에서 양식, B.com
캔 POST
에 A.com
사용자의 쿠키가 피해를.
맞습니다. 이것을 넣는 또 다른 방법은 CORS를 인식하지 않는 서버에 대한 CSRF 공격 영역을 늘리지 않기 위해 프리 플라이트 요청이 생성 된 것입니다.
그러나 프리 플라이트가 필요없는 "단순한"요청 에 대한 요구 사항 을 살펴보면 POST
여전히 허용됩니다. 그것은 상태를 변경하고 DELETE
! 처럼 데이터를 삭제할 수 있습니다 !
사실입니다! CORS는 CSRF 공격으로부터 사이트를 보호하지 않습니다. 다시 CORS가 없으면 CSRF 공격으로부터 보호되지 않습니다. 프리 플라이트 요청의 목적은 CSRF 노출을 CORS 이전의 세계에 이미 존재하는 것으로 제한하는 것입니다.
한숨. 프리 플라이트 요청의 필요성을 간절히 받아들입니다. 그러나 서버의 모든 리소스 (URL)에 대해 왜해야합니까? 서버가 CORS를 처리하거나 처리하지 않습니다.
확실합니까? 여러 서버가 단일 도메인에 대한 요청을 처리하는 것은 드문 일이 아닙니다. 예를 들어, A.com/url1
한 종류의 서버가 요청을 A.com/url2
처리하고 다른 종류의 서버가 요청을 처리하는 경우가 있습니다. 일반적으로 단일 리소스를 처리하는 서버가 해당 도메인의 모든 리소스에 대한 보안을 보장 할 수있는 것은 아닙니다.
좋아. 타협하자. 서버가 말할 수있는 리소스를 정확하게 명시 할 수있는 새로운 CORS 헤더를 만들어 해당 URL에 대한 추가 프리 플라이트 요청을 피할 수 있습니다.
좋은 생각! 실제로 헤더 Access-Control-Policy-Path
는이 목적으로 만 제안되었습니다. 궁극적으로, 그러나, 그것은, 사양에서 제외되었다 분명히 일부 서버가 잘못 브라우저에 안전 보였다 경로에 대한 요청이 실제로 문제가있는 서버에 안전하지 않을 것 등의 방법으로 URI 사양을 구현하기 때문이다.
이는 성능보다 보안에 우선 순위를 두어 브라우저가 기존 서버를 위험에 빠뜨리지 않고 CORS 사양을 즉시 구현할 수있게 해주는 신중한 결정입니까? 아니면 특정 시간에 특정 서버의 버그를 수용하기 위해 인터넷을 대역폭을 낭비하고 대기 시간을 두 배로 늘리는 것이 근시입니까?
의견이 다릅니다.
글쎄, 최소한 브라우저는 단일 URL에 대한 프리 플라이트를 캐시합니까?
예. 아마 그리 오래되지는 않았지만. WebKit 브라우저에서 최대 프리 플라이트 캐시 시간은 현재 10 분 입니다.
한숨. 글쎄, 내 서버가 CORS를 인식하고 사전 비행 요청에 의해 제공되는 보호가 필요하지 않다는 것을 알면이를 피할 수있는 방법이 있습니까?
유일한 옵션은 "간단한"요청에 대한 요구 사항 을 충족시키는 것 입니다. 이는 (예를 들어 X-Requested-With
) 포함 Content-Type
하거나, 그 이상 에 대해 거짓말 을 할 사용자 정의 헤더를 생략하는 것을 의미 할 수 있습니다 .
CORS 사양은 unsafe를 포함하여 "간단한"요청 거부를 다루지 않으므로 적절한 CSRF 보호 기능을 갖추어야합니다 POST
. 사양에서 알 수 있듯이 "단순한 요청이 검색 이외의 의미를 갖는 자원은 사이트 간 요청 위조로부터 자신을 보호해야합니다".