X-Requested-With 헤더의 요점은 무엇입니까?


224

JQuery와 다른 프레임 워크는 다음 헤더를 추가합니다.

X-Requested-With : XMLHttpRequest

왜 이것이 필요한가요? 서버가 AJAX 요청을 일반 요청과 다르게 취급하려는 이유는 무엇입니까?

업데이트 : 방금 https://core.spreedly.com/manual/payment-methods/adding-with-js 헤더를 사용하여 실제 예제를 찾았습니다 . AJAX없이 결제 프로세서를 요청하면 완료되면 원래 웹 사이트로 다시 리디렉션됩니다. AJAX로 요청하면 리디렉션이 수행되지 않습니다.


7
"[AJAX없이 요청하면 완료되면 원래 웹 사이트로 다시 리디렉션됩니다. AJAX로 요청하면 리디렉션이 수행되지 않습니다." -> 정확히 당신이하고 싶은 이유입니다. :)
Robert Christian

답변:


257

보안상의 이유가 있습니다 . CORS 를 통한 서버의 동의없이이 헤더를 AJAX 요청 크로스 도메인에 추가 할 수 없기 때문에 CSRF 공격을 막을 수 있습니다 .

도메인 간 다음 헤더 만 허용됩니다.

  • 동의하기
  • 언어를 받아들이십시오
  • 내용 언어
  • 마지막 이벤트 ID
  • 컨텐츠 타입

다른 것들은 CORS 지원 브라우저에서 "비행 전"요청을 발생시킵니다.

CORS가 없으면 X-Requested-With교차 도메인 XHR 요청 에 추가 할 수 없습니다 .

서버가이 헤더가 있는지 확인하는 경우, 사용자는 JavaScript를 사용하여 사용자 대신 요청을 시도하는 공격자의 도메인에서 요청이 시작되지 않았 음을 알 수 있습니다. 또한 요청이 일반 HTML 양식에서 POST되지 않았는지 확인합니다. 토큰을 사용하지 않으면 도메인 간이 아닌지 확인하기가 더 어렵습니다. 그러나 오래된 브라우저는 취약하게 유지되지만 지원되는 브라우저에서 헤더를 확인하는Origin 것이 옵션이 될 수 있습니다 .

새로운 플래시 바이 패스 발견

당신은 할 수 있습니다 토큰과 함께이 결합 플래시 OSX에서 Safari에서 실행되는 때문에, 리디렉션 단계가 있다면이 헤더를 설정할 수 있습니다 . Chrome에서도 작동하는 것으로 보이지만 이제는 수정되었습니다. 영향을받는 다른 버전을 포함한 자세한 내용은 여기참조하십시오 .

OWASP이를 Origin 및 Referer check와 결합하는 것이 좋습니다 .

이 방어 기술은 사이트 간 요청 위조에 대한 강력한 방어 섹션 4.3에서 구체적으로 설명됩니다. 그러나 Flash를 사용한 이러한 방어 우회는 2008 년 초와 2015 년 초에 다시 Mathme Karlsson에 의해 Vimeo의 CSRF 결함을 악용 한 것으로 기록되었습니다. 그러나 Flash 공격은 Origin 또는 Referer 헤더를 스푸핑 할 수 없으므로이 두 가지를 모두 확인하여 Flash 바이 패스 CSRF 공격을 방지해야한다고 생각합니다. (참고 : 누구나이 믿음을 확인하거나 반박 할 수 있으면이 기사를 업데이트 할 수 있도록 알려주십시오.)

그러나 이미 논의한 이유로 Origin을 확인하는 것은 까다로울 수 있습니다.

최신 정보

CORS, CSRF 및 X-Requested-With here 에 대한 자세한 블로그 게시물을 작성했습니다 .


14
나는 그것을 얻지 못한다. 침입자가 요청을 작성하고 X-Requested-With헤더를 추가하지 못하게하는 것은 무엇입니까 ?
Greg

13
@Greg : 브라우저-도메인 간을 허용하지 않습니다.
SilverlightFox

2
오, 같은 도메인에있는 한 CORS 구성이 필요하지 않다는 것을 알지 못했습니다. 당신이 그것에 대해 생각할 때 그것은 분명하다. 감사 !
Greg

10
@ vol7ron : 그들을 막을 수있는 것은 없지만, 요청에 희생자의 쿠키를 가지고 있지 않아 요청하는 대상을 물리 치지 않습니다. CSRF가 성공하기 위해서는 공격자가 브라우저에 요청에 쿠키를 자동으로 첨부해야하기 때문에 브라우저가 없으면 CSRF 공격이 없습니다.
SilverlightFox

3
@ vol7ron : 전자. CSRF는 혼란스런 대리 문제입니다. 브라우저는 혼란스런 대리인이며 사용자가 스스로하지 않은 요청에 대해 쿠키를 보내는 데 속입니다.
SilverlightFox

25

SilverlightFox의 답변을 읽으십시오. 더 중요한 이유를 강조합니다.

그 이유는 대부분 요청의 출처를 알고 있다면 약간 사용자 정의 할 수 있기 때문입니다.

예를 들어 레시피가 많은 웹 사이트가 있다고 가정 해 보겠습니다. 또한 사용자 지정 jQuery 프레임 워크를 사용하여 클릭하는 링크를 기준으로 레시피를 컨테이너에 밀어 넣습니다. 링크는www.example.com/recipe/apple_pie

일반적으로 전체 페이지, 머리글, 바닥 글, 레시피 콘텐츠 및 광고를 반환합니다. 그러나 누군가 웹 사이트를 탐색하는 경우 해당 부분 중 일부가 이미로드되어 있습니다. 따라서 AJAX를 사용하여 사용자가 선택한 레시피를 얻을 수 있지만 시간과 대역폭을 절약하기 위해 머리글 / 바닥 글 / 광고를로드하지 않습니다.

이제 데이터에 대한 보조 엔드 포인트를 작성할 수 www.example.com/recipe_only/apple_pie있지만 다른 사람과 유지 관리 및 공유하기가 더 어렵습니다.

그러나 요청을 한 다음 데이터의 일부만 반환하는 아약스 요청임을 감지하는 것이 더 쉽습니다. 이렇게하면 사용자가 적은 대역폭을 낭비하고 사이트의 응답 성이 향상됩니다.

일부 프레임 워크는 어떤 요청이 아약스인지 아닌지를 추적하는 것이 유용 할 수 있기 때문에 프레임 워크는 헤더를 추가합니다. 그러나 이러한 기술을 사용하는 것은 전적으로 개발자에게 달려 있습니다.

실제로는 Accept-Language헤더 와 비슷합니다 . 브라우저가 웹 사이트를 요청할 수 있습니다 URL에 / ru / 등을 삽입하지 않고도이 웹 사이트의 러시아어 버전을 보여주세요.


30
와우, 그것은 끔찍한 정비 악몽처럼 들립니다. 동일한 페이지의 다른 표현을 리턴하려면 Accept헤더에 다른 컨텐츠 유형을 제공해야합니다 . 이 사용자 정의 헤더를 사용하면 잘못된 방법으로 들립니다.
길리

10

일부 프레임 워크는 xhr 요청을 감지하기 위해이 헤더를 사용합니다. 예를 들어 grails spring security는이 헤더를 사용하여 xhr 요청을 식별하고 json 응답 또는 html 응답을 응답으로 제공합니다.

대부분의 Ajax 라이브러리 (v2.1부터 프로토 타입, JQuery 및 Dojo)에는 일반 하이퍼 링크 또는 양식 제출 단추를 클릭하여 트리거되는 대신 XMLHttpRequest에 의해 요청이 작성되었음을 나타내는 X-Requested-With 헤더가 포함되어 있습니다.

출처 : http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.