모든 웹 요청이 브라우저 쿠키를 보내나요?


197

모든 웹 요청이 브라우저의 쿠키를 보내나요?

페이지 뷰를 말하는 것이 아니라 이미지, .js파일 등을 요청하는 것입니다 .

업데이트 웹 페이지에 50 개의 요소가 있으면 50 개의 요청입니다. 각 요청에 대해 SAME 쿠키를 보내는 이유는 무엇입니까?


8
이 상황에서 캐싱이 가능하다고 생각하지 않습니다. 우리는 브라우저가 서버로 데이터를 보내는 것이 아니라 다른 방법으로 데이터를 보내는 것에 대해 이야기하고 있습니다. 여러 가지 이유로 사용자가 하나의 요청을 보낸 후 서버가 "이미 가지고있다"고 확신 할 수 없습니다. 서로 통신하지 않는 많은 서버가있을 수 있습니다. 서버는 이전 요청에 대해 전혀 기억하기를 원치 않거나 공간이 없을 수도 있습니다. HTTP는 상태 비 저장 상태입니다. 모든 요청은 나머지와 독립적이어야합니다. 이러한 이유로 인증 자격 증명과 같은 쿠키는 모든 요청과 함께 전송되어야합니다.
Ian Clelland

: 캐싱 내 대답에 대한 업데이트에서 쿠키에 대한 이해가되지 않습니다 내가 왜 언급 stackoverflow.com/a/1336178/102960
igorsantos07

답변:


198

예, 요청한 URL이 쿠키에 정의 된 동일한 도메인 및 경로 (및 보안, httponly, 만료되지 않은 등의 다른 모든 제한) 내에있는 경우 쿠키는 모든 요청에 ​​대해 전송됩니다.


103
우연히도 Google Page Speed ​​나 Yahoo의 YSlow와 같은 페이지 속도 도구는 쿠키가없는 별도의 도메인에서 정적 콘텐츠를 제공하는 것이 좋습니다.
ceejayoz

업데이트 된 답변에서 별도의 도메인에서 콘텐츠를 제공하는 것에 대해 언급했습니다. stackoverflow.com/a/1336178/102960
igorsantos07

Site1에서 Site2로 HTTP 리디렉션이있을 때 브라우저가 Site2 쿠키를 보내는 것이 사실입니까?
Zeigeist

92

다른 사람들이 말했듯이 쿠키의 호스트, 경로 등의 제한 사항이 충족되면 50 번 전송됩니다.

그러나 쿠키는 HTTP 기능이고 HTTP는 상태 비 저장이기 때문에 이유를 물었습니다. HTTP는 서버가 요청 사이의 상태를 저장하지 않고 작동하도록 설계되었습니다.

실제로 서버는 어떤 사용자가 주어진 요청을 보내는 지 인식하는 확실한 방법이 없습니다. 단일 웹 프록시 (및 IP 주소) 뒤에는 수천 명의 사용자가있을 수 있습니다. 쿠키가 모든 요청을 보내지 않은 경우 서버는 어떤 사용자가 어떤 리소스를 요청하는지 알 수있는 방법이 없습니다.

마지막으로, 서버에 쿠키가 필요한지 여부는 브라우저에 실마리가 없습니다. 서버가 요청을 위해 쿠키를 foo.com에 보내도록 지시했다는 것을 알기 때문에 그렇게합니다. 때로는 이미지 (예 : 사용자별로 동적으로 생성 된 이미지)가 필요하지만 때로는 그렇지는 않지만 브라우저는 알 수 없습니다.


1
멀티플렉싱 체계 인 HTTP 1.1에서도 마찬가지입니까? 즉, 요청은 단일 TCP 연결로 번들됩니다. 물론 모든 요청은 첨부 된 쿠키 사본과 함께 수신됩니다. 그러나 전송 중복 문제가 많은 경우 HTTP 1.1은 최적화 할 위치에 있습니다. 그것이 실제로 있는지 모르겠지만 ...
Chris Noe

1
그러면 문제는 "브라우저가 쿠키를 첨부하려는 요청은 무엇입니까?" 서버는 쿠키로 정책을 설정하여 쿠키를 다시 보내야 할 도메인과 URL 경로를 결정하지만 잊어 버립니다. 연결의 특정 요청에 쿠키가 있고 다른 요청에는 쿠키가 없도록 지정하는 방법이 필요합니다. 모든 요청에 ​​명시 적으로 포함시키는 것을 제외하고는 HTTP / 1.1에는 분명히 존재하지 않습니다. 솔직히, 대역폭을 줄이기위한 더 나은 (표준 호환) 솔루션은 클라이언트 측 gzip 컨텐츠 인코딩 일 것입니다. 그러나 아직 아무도이를 지원하지 않습니다.
Ian Clelland

1
@Ian Clelland : 클라이언트가 첫 번째 메시지를 보내야하므로 서버가 Accept-Encoding을 위해 무엇을 보내야하는지 알 수 없습니다 (서버가 해당 필드를 보내야한다고 HTTP / 1.1 §14.3에 요청 헤더가 표시되어 있음). 문제는 동일한 서버에서도 URL에 따라 다를 수 있으며 시간이 지남에 따라 변경 될 수 있으므로 작동하는 것은 쉽지 않다는 것입니다.
derobert

1
@Chris : 아니요, keepalive는 TCP 연결 설정 / 티어 다운 오버 헤드 만 저장하면됩니다. 모든 요청에 ​​대해 전체 헤더가 계속 전송됩니다. 그러나 파이프 라이닝 (응답을 기다리지 않고 여러 요청을 전송)이 크게 도움이 될 수 있습니다. HTTP / 1.1 §8.1에 자세한 내용이 있습니다.
derobert

21

예. 모든 요청은 동일한 도메인에 속하는 쿠키를 보냅니다. HTTP는 상태 비 저장이므로 캐시되지 않습니다. 즉, 모든 요청은 서버가 처리 할 작업을 파악하기에 충분해야합니다. 특정 사용자 만 액세스 할 수있는 이미지가 있다고 가정하십시오. 당신은 해야한다 서버가 그것이 점점 요청의 풀 사이에 당신이 아닌 다른 사람, 또는 손님, 알고있다, 그래서 그 (50 개) 요청을 모두 사용하여 인증 쿠키를 보냅니다.

그러나 HTTPS 설정, 경로 또는 도메인과 같은 다른 응답에 언급 된 다른 제한이 주어지면 쿠키가 전송되지 않을 수 있습니다. 특히 중요한 점은 쿠키가 도메인간에 공유되지 않는 것입니다. 이는 언급 한 이미지 및 스크립트와 같은 정적 파일에 대한 HTTP 호출 크기를 줄이는 데 도움이됩니다.
예 : 쿠키가 4 개 있습니다 www.stackoverflow.com. 에 요청하면 www.stackoverflow.com/images/logo.png4 개의 쿠키가 모두 전송됩니다.
그러나 stackoverflow.com/images/logo.png(하위 도메인 변경에 대한 통지) 또는를 요청하면 images.stackoverflow.com/logo.png해당 쿠키 4 개가 존재하지 않지만 해당 도메인과 관련된 쿠키는 존재합니다.

쿠키 및 이미지 요청에 대한 자세한 내용은 예를 들어이 StackOverflow 블로그 게시물에서 확인할 수 있습니다.


10

아니요. 모든 요청이 쿠키를 보내는 것은 아닙니다. 쿠키 구성 및 클라이언트-서버 연결에 따라 다릅니다.

예를 들어 쿠키 secure옵션이로 설정된 true경우 보안 HTTPS 연결을 통해 쿠키를 전송해야합니다. HTTP 프로토콜을 사용하는 웹 사이트를 볼 때 보안 플래그가 true이므로 브라우저에서 쿠키를 보내지 않습니다.


7

쿠키에는 "경로"속성이 있습니다. "path = /"인 경우 대답은 예입니다.


예, 쿠키가 필요한 모든 URL이 유사하거나 그와 유사한 사이트 / 앱 구조를 /app/인식 할 수 있습니다. 중복 오버 헤드를 제거하기 위해 별도의 하위 도메인이 없어도 이식성이 유지됩니다. 또는 이제 쓸모없는 Google 웹 로그 분석을 버릴 수도 있습니다. 쿠키 헤더가 너무 길어서 할머니가 뜨개질을했는지 궁금합니다.
Jake

7

3 년이 지났습니다

브라우저가 쿠키를 보내지 않는 또 다른 이유가 있습니다. 태그에 crossOrigin속성을 추가 <script>하고에 값을 추가 할 수 있습니다 "anonymous". 쿠키가 대상 서버로 전송되지 않습니다. 시간의 99.9 %에서 자바 스크립트는 정적 파일이며 요청 쿠키를 기반으로 해당 js 코드를 생성하지 않습니다. 1KB의 쿠키가 있고 페이지에 200 개의 리소스가있는 경우 사용자가 200KB를 업로드하는 중이며 3G에 시간이 걸리고 결과 페이지에 아무런 영향을 미치지 않을 수 있습니다. 참조를 위해 HTML 속성 : crossorigin 을 방문하십시오 .


설명 해주십시오.
Jake

4
@Jake 당신은 <script> 태그에 crossOrigin 속성을 추가하고 그 값을 "anonymous"로 추가 할 수 있습니다. 쿠키가 대상 서버로 전송되지 않습니다. 시간의 99.9 %에서 자바 스크립트는 정적 파일이며 요청 쿠키를 기반으로 해당 js 코드를 생성하지 않습니다. 1KB의 쿠키가 있고 페이지에 200 개의 리소스가있는 경우 사용자가 200KB를 업로드하는 중이며 3G에 시간이 걸리고 결과 페이지에 아무런 영향을 미치지 않을 수 있습니다. 참고로 developer.mozilla.org/en-US/docs/Web/HTML/… 을 방문하십시오 .
gilm

4

나는 이것이 오래된 실이라는 것을 안다. 그러나 마지막 점을 추가하면 대부분의 브라우저가 도메인에 쿠키를 보내지 않는 것으로 나타났습니다. 예를 들어에 http://example.com.설정된 쿠키는받지 않습니다 .example.com. 반면에 Apache는 그것들을 동일한 호스트로 취급합니다. 내가 포함하는 외부 리소스에 대해 교차 도메인 추적을 더 어렵게 만드는 데 유용하지만 성능상의 이유로 사용할 수 있습니다. 이로 인해 https인증서 유효성 검사가 중단됩니다. 브라우저 샷과 내 장치를 사용하여 몇 가지 테스트를 실행했습니다. 이 해킹은 요청에 쿠키를 포함하는 사파리 (모바일 및 데스크톱)를 제외한 거의 모든 브라우저에서 작동합니다.


"내가 포함하는 외부 리소스에 대해 교차 도메인 추적을 더 어렵게 만드는 방법"은 무엇입니까? 우연히 로그인 한 사용자의 탐색을 추적하는 Farcebook Like 및 이러한 위젯에 대해 이야기하고 있습니까?
Jake

예. 대부분의 브라우저는 쿠키를 보내지 않기 때문에 더 어려워 질 것입니다. 예를 들어 google.com의 항목을 포함하고 Google에 로그인 한 경우 Google은 두 요청을 연결할 수 없습니다. 이것은 확실하지는 않지만 일부 브라우저는 쿠키를 보냈으며 여전히 작동하는 사용자 (IP 주소와 같은)를 식별하는 데 덜 신뢰할 수 있고 덜 사용되는 방법이 있습니다. 가장 큰 단점은 오늘날 HTTPS를 사용할 수 없다는 점입니다.
Gellweiler

0

짧은 대답은 예입니다. 아래 줄은 JS 문서 에서 가져온 것입니다.

쿠키는 한 번 일반적인 클라이언트 측 스토리지에 사용되었습니다. 이것이 클라이언트에 데이터를 저장하는 유일한 방법 일 때는 합법적 인 것이었지만 이제는 최신 스토리지 API를 사용하는 것이 좋습니다. 쿠키는 모든 요청과 함께 전송되므로 성능이 저하 될 수 있습니다 (특히 모바일 데이터 연결의 경우).

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