javascript - 헤더 - set-cookie secure




setRequestHeader를 사용하여 xmlhttprequest를 만드는 동안 쿠키 및 set-cookie 헤더를 설정할 수없는 이유는 무엇입니까? (4)

나는 당신이 작업 초안을 검토 하고 발견했을 것이라고 확신합니다.

위의 헤더는 사용자 에이전트가 전송 측면을 제어 할 수 있도록 사용자 에이전트에 의해 제어됩니다.

먼저 우리는 서로 다른 브라우저 간의 기능 상호 운용성을위한 지침으로 사용되는 표준을 이해해야합니다. 브라우저에 위임 된 것은 아니므로 브라우저는 다른 이유로이 표준을 준수하는 수준이 다릅니다.

둘째, 기술적으로 말하면 사용자 에이전트를 에뮬레이션하고 프로그램을 브라우저로 취급하며 언급 된 표준에 따라 해당 값을 설정할 수 있습니다.

마지막으로 헤더의 덮어 쓰기를 허용하지 않거나 Content-Length , Cookie 와 같은 특정 필드에 대한 헤더를 설정하면 secure design approach 줍니다. 밀수 또는 최소한 HTTP 요청 밀수입 을 저지하려고하는 것입니다.

왜 setRequestHeader를 사용하여 쿠키 헤더를 설정할 수 없는지 궁금합니다. 특정 이유가 있거나 브라우저 자체로 추가 된 것이므로이 헤더는 사용할 수 없습니까? 보안 문제가 있습니까?

--편집하다

나는 node.js에서 일하고 xmlhttprequest 모듈을 사용했다. 다음은 테스트 코드입니다.

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.withCredentials = true;
xhr.setRequestHeader('Cookie', "key=value");
xhr.send(null);

여기에 쿠키 헤더를 node.js' xmlhttprequest 로 설정해야합니다. node.js' xmlhttprequest 는 명시 적으로 쿠키 헤더를 추가하지 않습니다 (브라우저와 마찬가지로). 이렇게하려고하면 xmlhttprequest 가 " Refused to set unsafe header xmlhttprequest "라는 오류 메시지를 표시합니다.

패치를 발견하고 쿠키 헤더를 성공적으로 보낼 수 있었지만. 그러나 왜 쿠키 헤더를 설정하는 것이 불가능했는지 궁금합니다. 어디에서나 내가 데이터 무결성과 보안을 위해 필요하다는 것을 알았지 만,이 경우 침입 할 수있는 보안은 어디서 언급되지 않았는가? 이 데이터 무결성 문제가 패치와 함께 node.js 애플리케이션에도 유효한지 평가하고 싶습니다.


다음 Gist를 사용하여이 문제를 해결할 수있었습니다.
https://gist.github.com/killmenot/9976859

원래 아이디어는 여기에서 가져온 것입니다.
https://gist.github.com/jfromaniello/4087861

나는 몇 가지 문제에 직면했다.

  1. 근원 요점은 구식이고 저를 위해 작동하지 않는다. 예를 들어 "request"lib API가 변경되었습니다.
  2. socket.io-client의 "xmlhttprequest"라이브러리로 작업 할 수 있으며 socket.io-client와 동일한 레벨에 설치하지 마십시오.
  3. Original "socket.io-client"(0.9.16)은 "setDisableHeaderCheck"메소드를 지원하지 않는 "xmlhttprequest"(1.4.2)를 사용합니다 (단 1.6.0은 사용합니다). 그래서, 나는 포크를 만들어 그것을 사용 https://github.com/intspirit/socket.io-client/tree/0.9.16+20140408120400

socket.io-client (1.0.0-pre)는 올바른 버전의 xmlhttprequest를 사용하는 engine.io-client를 사용합니다. 추후에 포크 대신 1.0.0 버전을 사용하고 "xhr-polling"전송을 지정하고 원래 요점처럼 XMLHttpRequest를 모방합니다.


예, 데이터 무결성 및 보안에 필요합니다. 이를 이해하려면 HTTP 요청 방법에서 쿠키의 역할을 이해해야합니다.

쿠키는 사용자, 브라우저, 연결 등을 식별하는 데 중요하며 웹 브라우저에 저장됩니다. JavaScript를 사용하면 브라우저에서 쿠키를 조작 할 수는 있지만 모든 쿠키를 조작 할 수는 없습니다. HTTP 쿠키 는 사용자가 JavaScript를 통해 잘못 사용할 수 없도록 브라우저에서만 설정됩니다.

지원되는 브라우저에서 HttpOnly 세션 쿠키는 HTTP (또는 HTTPS) 요청을 전송할 때만 사용되므로 다른 HTTP API (예 : JavaScript)의 액세스를 제한합니다.

xmlhttprequest를 보내면 HttpOnly 쿠키를 읽고 Cookie 헤더를 통해 서버로 보냅니다. 이제 xhr.setRequestHeader('Cookie', "key=value"); , 서버에 전송 된 쿠키를 변조하려고합니다. setRequestHeader 는 전송 된 쿠키의 무결성을 손상시킬 수있는 추가 key=value 를 추가 key=value .

이것은 서버 (세션, 전자 메일 계정 또는 모든 계정)를 인증하는 데 사용됩니다. 이것은 기본적으로 서버가 쿠키의 오용을 방지하여 서버에 액세스 할 수있게합니다.


이 동작을 비활성화 할 수 있습니다.

var xhr = new XMLHttpRequest();
xhr.setDisableHeaderCheck(true);
xhr.open(...);
...




xmlhttprequest