HttpOnly 쿠키는 AJAX 요청과 어떻게 작동합니까?


195

쿠키를 기반으로 한 액세스 제한이있는 사이트에서 AJAX를 사용하는 경우 JavaScript는 쿠키에 액세스해야합니다. HttpOnly 쿠키는 AJAX 사이트에서 작동합니까?

편집 : Microsoft는 HttpOnly가 지정된 경우 쿠키에 대한 JavaScript 액세스를 허용하지 않음으로써 XSS 공격을 방지하는 방법을 만들었습니다. FireFox는 나중에 이것을 채택했습니다. 그래서 내 질문은 : 당신이 StackOverflow와 같은 사이트에서 AJAX를 사용하는 경우 HTTP 전용 쿠키가 옵션입니까?

편집 2 : 질문 2. HttpOnly의 목적이 쿠키에 대한 JavaScript 액세스를 방지하는 것인데 XmlHttpRequest 객체를 통해 JavaScript를 통해 쿠키를 검색 할 수 있다면 HttpOnly의 요점은 무엇 입니까?

편집 3 : 다음은 Wikipedia의 인용문입니다.

브라우저가 이러한 쿠키를 받으면 다음 HTTP 교환에서 평소와 같이 쿠키를 사용해야하지만 클라이언트 측 스크립트에서는 볼 수 없게됩니다. [32] HttpOnly플래그는 모든 표준의 일부가 아니며, 모든 브라우저에서 구현되지 않습니다. 현재 XMLHTTPRequest를 통해 세션 쿠키를 읽거나 쓰는 것을 막을 수는 없습니다. [33].

나는이 이해 document.cookie는 Http 만을 사용할 때 차단됩니다. 그러나 XMLHttpRequest 객체에서 쿠키 값을 계속 읽을 수있어 XSS를 허용합니다. HttpOnly는 어떻게 당신을 더 안전한가요? 쿠키를 기본적으로 읽기 전용으로 만들었습니까?

귀하의 예에서는에 쓸 수 없지만 document.cookieXMLHttpRequest 객체를 사용하여 쿠키를 훔쳐 내 도메인에 게시 할 수 있습니다.

<script type="text/javascript">
    var req = null;
    try { req = new XMLHttpRequest(); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    req.open('GET', 'http://stackoverflow.com/', false);
    req.send(null);
    alert(req.getAllResponseHeaders());
</script>

편집 4 : 죄송합니다. XMLHttpRequest를 StackOverflow 도메인으로 보낸 다음 getAllResponseHeaders () 결과를 문자열에 저장하고 쿠키를 정규식으로 저장 한 다음 외부 도메인에 게시 할 수 있음을 의미했습니다. Wikipedia와 ha.ckers가 이것에 관해 나와 동의하는 것처럼 보이지만, 나는 다시 교육 받기를 원할 것입니다 ...

최종 편집 : 아, 분명히 두 사이트 모두 잘못 되었습니다 . 실제로 FireFox버그입니다 . 실제로 IE6 & 7은 현재 HttpOnly를 완벽하게 지원하는 유일한 브라우저입니다.

내가 배운 모든 것을 되풀이하려면 :

  • HttpOnly는 IE7 및 FireFox에서 document.cookie에 대한 모든 액세스를 제한합니다 (다른 브라우저에 대해서는 확실하지 않음)
  • HttpOnly는 IE7의 XMLHttpObject.getAllResponseHeaders ()에있는 응답 헤더에서 쿠키 정보를 제거합니다.
  • XMLHttpObjects는 원래 도메인에만 제출 될 수 있으므로 쿠키의 도메인 간 게시는 없습니다.

편집 :이 정보는 더 이상 최신 정보가 아닙니다.


greasemonkey 스크립트로 예제를 던 졌는데 FF가 더 이상 쿠키를 표시하지 않는 것 같습니다. 훌륭한 연구와 예.

동일 출처 정책을 사용하면 스크립트가 실행되는 것과 동일하지 않은 도메인에 http 요청을 할 수 없습니다. 그러나 window.location을 사용하여 사용자를 페이지로 리디렉션하여 쿠키를 쉽게 전달하고 쿼리 문자열 매개 변수를 통해 정보를 전달할 수 있다고 생각합니다.
Luca Marzi

@LucaMarzi "" 스크립트에서 실행중인 것과 동일하지 않은 도메인에 http 요청을 할 수 없습니다. "사이트 X가 호스트 Y의 이미지를 포함 할 수 없다고 말하고 있습니까? (모자이크 이후의 모든 브라우저에서 지원 된 기능?)
curiousguy

답변:


64

예,이 기능에는 HTTP 전용 쿠키가 적합합니다. 서버에 대한 XmlHttpRequest의 요청이 계속 제공됩니다.

스택 오버플로의 경우 쿠키는 XmlHttpRequest 요청의 일부로 자동 제공됩니다. Stack Overflow 인증 공급자의 구현 세부 정보를 모르지만 해당 쿠키 데이터는 자동으로 "투표"컨트롤러 방법보다 낮은 수준에서 신원을 확인하는 데 사용됩니다.

보다 일반적으로 AJAX 에는 쿠키가 필요 하지 않습니다. XmlHttpRequest 지원 (또는 구형 브라우저의 iframe 원격)도 기술적으로 필요한 모든 것입니다.

그러나 AJAX 지원 기능에 보안을 제공하려는 경우 기존 사이트와 동일한 규칙이 적용됩니다. 각 요청 뒤에있는 사용자를 식별 할 수있는 방법이 필요하며 쿠키는 거의 항상 그 목적을위한 수단입니다.

귀하의 예에서는 document.cookie에 쓸 수 없지만 XMLHttpRequest 객체를 사용하여 쿠키를 훔쳐 내 도메인에 게시 할 수 있습니다.

XmlHttpRequest는 도메인 간 요청을하지 않습니다 (정확한 이유 때문에).

일반적으로 iframe 원격 또는 JSONP를 사용하여 쿠키를 도메인에 보내는 스크립트를 삽입 할 수 있지만 쿠키는 액세스 할 수 없으므로 쿠키 만 다시 보호합니다.

서버 쪽에서 StackOverflow.com을 손상시키지 않으면 쿠키를 훔칠 수 없습니다.

편집 2 : 질문 2. Http-Only의 목적이 쿠키에 대한 JavaScript 액세스를 방지하는 것인데 XmlHttpRequest 객체를 통해 JavaScript를 통해 쿠키를 검색 할 수 있다면 Http-Only의 요점은 무엇입니까?

이 시나리오를 고려하십시오.

  • JavaScript 코드를 페이지에 삽입 할 수있는 방법을 찾았습니다.
  • Jeff가 페이지를로드하고 악의적 인 JavaScript가 쿠키를 수정하여 쿠키를 수정합니다.
  • Jeff는 귀하의 질문에 대한 훌륭한 답변을 제출합니다.
  • 그는 쿠키 데이터 대신 쿠키 데이터를 제출하기 때문에 대답이 내 것이됩니다.
  • 당신은 "나의"별의 대답을 투표하십시오.
  • 내 실제 계정이 포인트를 얻습니다.

HTTP 전용 쿠키를 사용하면 두 번째 단계가 불가능하여 XSS 시도를 물리칩니다.

편집 4 : 죄송합니다. XMLHttpRequest를 StackOverflow 도메인으로 보낸 다음 getAllResponseHeaders () 결과를 문자열에 저장하고 쿠키를 정규식으로 저장 한 다음 외부 도메인에 게시 할 수 있음을 의미했습니다. Wikipedia와 ha.ckers가 이것에 관해 나와 동의하는 것처럼 보이지만, 나는 다시 교육 받기를 원할 것입니다 ...

맞습니다. 그래도 세션 도용이 가능합니다. 그것은 XSS가 당신을 해킹하더라도 XSS를 성공적으로 실행할 수있는 사람들의 무리를 상당히 얇게 만듭니다.

그러나 예제 시나리오로 돌아 가면 HTTP 전용 클라이언트 쿠키 수정에 의존하는 XSS 공격을 성공적으로 차단하는 위치를 확인할 수 있습니다 (흔하지는 않음).

a) 단일 개선만으로는 모든 취약점 을 해결할 수 없으며 b) 시스템이 완전히 안전 하지는 않을 것 입니다 . HTTP-Only XSS를 차단하는 데 유용한 도구입니다.

마찬가지로 XmlHttpRequest에 대한 교차 도메인 제한이 모든 XSS 공격을 100 % 성공시키지 못하더라도 여전히 제한을 제거하는 것을 꿈꾸지 않을 것입니다.


많은 프레임 워크가 csrf 쿠키토큰을 넣습니다 . csrfJS가 검색 할 수 있도록 숨겨진 HTML 요소에 csrf 토큰을 넣지 않으면 확인이 필요한 AJAX 호출이 작동하지 않는다고 가정 합니다.
사용자

4

반드시 할 필요는 없습니다. 좀 더 자세히 설명해 주시겠습니까? AJAX는 작동하기 위해 쿠키에 액세스 할 필요가 없으며, 정보를 추출하기 위해 자체적으로 요청을 할 수 있습니다 .AJAX 호출이 수행하는 페이지 요청은 쿠키 데이터에 액세스하고 Javascript가 직접 액세스 할 필요없이 호출 스크립트로 다시 전달할 수 있습니다 쿠키


4

예, Ajax 기반 사이트에 적합한 옵션입니다. 인증 쿠키는 스크립트에 의한 조작이 아니라 서버에 대한 모든 HTTP 요청에 브라우저에 의해 포함됩니다.

스크립트는 세션 쿠키의 내용에 대해 걱정할 필요가 없습니다. 인증 된 경우 사용자 나 스크립트가 시작한 서버에 대한 요청에는 적절한 쿠키가 포함됩니다. 스크립트 자체가 쿠키의 내용을 알 수 없다는 사실은 중요하지 않습니다.

인증 이외의 목적으로 사용되는 쿠키의 경우 스크립트에서 쿠키를 수정하거나 읽을 수있게하려면 HTTP 전용 플래그없이 쿠키를 설정할 수 있습니다. HTTP 전용 쿠키를 선택하고 선택할 수 있습니다. 예를 들어 UI 기본 설정 (정렬 순서, 왼쪽 축소 또는 축소)과 같이 민감하지 않은 쿠키는 스크립트와 쿠키로 공유 할 수 있습니다.

나는 HTTP 전용 쿠키를 정말로 좋아합니다. 그것은 정말 깔끔한 아이디어였던 독점적 인 브라우저 확장 중 하나입니다.


3

이것에 조금 더 있습니다.

Ajax는 쿠키를 엄격하게 요구하지는 않지만 다른 포스터에서 언급했듯이 유용 할 수 있습니다. 스크립트에서 쿠키를 숨기도록 쿠키를 HTTPOnly로 표시하면 모든 브라우저가 쿠키를 지원하는 것이 아니라 일반적인 해결 방법이 있기 때문에 부분적으로 만 작동합니다.

XMLHTTPresponse 헤더가 쿠키를 제공하는 것은 이상합니다. 기술적으로 서버는 응답과 함께 쿠키를 반환 할 필요가 없습니다. 클라이언트에 설정된 후에는 만료 될 때까지 설정된 상태로 유지됩니다. 재사용을 막기 위해 매 요청마다 쿠키가 변경되는 체계가 있지만. 따라서 XMLHTTP 응답에 쿠키를 제공하지 않도록 서버를 변경하여 이러한 해결 방법을 피할 수 있습니다.

그러나 일반적으로 HTTPOnly는주의해서 사용해야한다고 생각합니다. XMLHTTP를 사용하지 않고 간단한 게시물 양식을 사용하여 공격자가 사용자가 다른 사이트에서 발생하는 아약스와 같은 요청을 제출하도록 정렬하는 크로스 사이트 스크립팅 공격이 있으며 브라우저의 쿠키는 요청을 인증합니다.

AJAX 요청이 인증되도록하려면 요청 자체와 HTTP 헤더에 쿠키가 포함되어 있어야합니다. 예를 들어 스크립트 또는 고유 한 숨겨진 입력을 사용합니다. HTTPOnly가이를 방해합니다.

일반적으로 HTTPOnly를 원하는 흥미로운 이유는 웹 페이지에 포함 된 타사 컨텐츠가 쿠키를 훔치는 것을 방지하기 위함입니다. 그러나 타사 콘텐츠를 포함하고 신중하게 필터링해야하는 데에는 여러 가지 흥미로운 이유가 있습니다.


1

쿠키는 AJAX 호출을 할 때 브라우저에서 자동으로 처리되므로, 자바 스크립트가 쿠키를 뒤섞을 필요가 없습니다.


1

따라서 JavaScript가 쿠키에 액세스해야한다고 가정합니다.

브라우저의 모든 HTTP 요청은 해당 사이트에 대한 쿠키 정보를 전송합니다. JavaScript는 쿠키를 설정하고 읽을 수 있습니다. 쿠키는 Ajax 애플리케이션에 필요한 정의는 아니지만 대부분의 웹 애플리케이션에 사용자 상태를 유지하는 데 필요합니다.

"AJAX를 사용하는 경우 JavaScript가 쿠키에 액세스해야합니까?"라는 질문에 대한 공식 답변 따라서 "아니오"입니다. 예를 들어 Ajax 요청을 사용하여 자동 제안 옵션을 제공하는 향상된 검색 필드를 생각해보십시오. 이 경우 쿠키 정보가 필요하지 않습니다.


XmlHttpRequest에는 쿠키가 필요합니다. 언급 한 고급 검색이 로그인 페이지 뒤에있을 수 있습니다. 그러나 Javascript가 쿠키 값을 VM에 노출시킬 수 있어야하는지 여부는 다른 질문입니다.
Mr. Shiny and New 安 宇

1

명확하게-서버의 관점에서 AJAX 요청에 의해 요청되는 페이지는 사용자가 링크를 클릭하여 수행되는 표준 HTTP 가져 오기 요청과 본질적으로 다르지 않습니다. 모든 일반 요청 속성 : user-agent, ip, session, cookies 등이 서버로 전달됩니다.


"세션"은 HTTP 개념이 아닙니다. 프레임 워크에 의해 HTTP 개념 위에 구축 된 고급 개념입니다.
curiousguy

0

아니요, AJAX 통화 요청 페이지도 쿠키에 액세스 할 수 있으며 로그인 여부를 확인합니다.

Javascript로 다른 인증을 수행 할 수는 있지만 신뢰할 수는 없습니다. 나는 항상 백엔드에 모든 종류의 인증 검사를 선호합니다.


0

예, 쿠키는 Ajax에 매우 유용합니다.

요청 URL에 인증을 넣는 것은 좋지 않습니다. 지난주 Google 캐시에서 URL의 인증 토큰을 얻는 방법에 대한 뉴스 항목이있었습니다.

아니요, 공격을 방지 할 방법이 없습니다. 이전 브라우저는 여전히 자바 스크립트를 통해 쿠키에 대한 간단한 액세스를 허용합니다. 당신은 http 등을 우회 할 수 있습니다. 당신이 생각해 낸 것은 충분한 노력을 기울이면 얻을 수 있습니다. 비결은 너무 많은 노력을 기울이는 것입니다.

사이트를보다 안전하게 유지하려면 (완벽한 보안은 없음) 만료되는 인증 쿠키를 사용할 수 있습니다. 그런 다음 쿠키를 도난당한 경우 공격자는 쿠키가 만료되기 전에 쿠키를 사용해야합니다. 그렇지 않은 경우 해당 계정에 의심스러운 활동이있는 것입니다. 시간이 짧을수록 보안은 향상되지만 키를 생성하고 유지 관리하는 서버에 더 많은 부하가 가해집니다.

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