다음을 통해 공유


WinHTTP의 쿠키 처리

HTTP 세션 데이터는 요청 또는 응답의 쿠키 헤더에서 클라이언트와 서버 간에 전달됩니다. 서버는 응답의 Set-cookie 헤더에 있는 클라이언트에 쿠키를 보내고 WinHTTP API는 요청의 쿠키 헤더에 있는 서버에 서버 쿠키를 다시 보냅니다. rfc 2109(HTTP 상태 관리 메커니즘)에 설명된 쿠키 처리 사양은 WinHTTP에서 기본적으로 구현됩니다. rfc 2964에 설명된 최근 쿠키 처리 사양은 WinHTTP에서 지원되지 않습니다.

WinHTTP는 헤더를 Set-Cookie 서버에서 쿠키를 가져와 세션별로 캐시에 저장합니다. 이 쿠키는 대상이 쿠키의 원본과 일치하는 동일한 WinHTTP 세션의 후속 요청에 다시 분개합니다. WinHTTP API는 요청의 각 다리에 대한 요청 쿠키 헤더를 다시 생성합니다.

다음 목록에서는 WinHTTP 클라이언트 애플리케이션이 쿠키를 처리하는 데 사용할 수 있는 몇 가지 옵션을 설명합니다.

  • 자동 쿠키 처리 - WinHTTP는 쿠키를 자동으로 처리하고 클라이언트 애플리케이션은 사용자 지정 쿠키 처리를 수행하지 않습니다.
  • 자동 쿠키 처리 사용 안 함 - WinHTTP API에서 자동 쿠키 처리가 비활성화되고 쿠키가 전송되지 않습니다.
  • 모든 쿠키를 수동으로 지정 – 자동 쿠키 처리가 비활성화되고 클라이언트 애플리케이션이 세션의 각 요청에 대한 모든 쿠키 헤더를 추가하거나 제거합니다.
  • 수동 및 자동 쿠키 처리 - 자동 및 수동 쿠키 처리를 결합합니다.

쿠키 처리를 사용하지 않도록 설정하기 위해 WinHTTP 클라이언트 애플리케이션은 dwOption 매개 변수가 WINHTTP_OPTION_DISABLE_FEATURE 설정되고 lpBuffer 매개 변수가 WINHTTP_DISABLE_COOKIES 설정된 WinHttpSetOption 함수를 호출합니다. hInternet 매개 변수는 요청 핸들이어야 합니다. 이전 요청을 보낸 요청 핸들에서 쿠키 처리를 사용하지 않도록 설정한 경우 클라이언트는 다음 요청을 보내기 전에 WinHttpAddRequestHeaders 함수를 사용하여 기존 요청 쿠키 헤더를 수동으로 제거해야 합니다. 자세한 내용은 쿠키 헤더 제거를 참조하세요.

참고

클라이언트 애플리케이션은 자동 모드를 사용하지 않도록 설정한 후 세션의 모든 쿠키를 설정해야 합니다.

모든 쿠키를 수동으로 지정

자동 쿠키 처리를 사용하지 않도록 설정하면 WinHTTP 클라이언트 애플리케이션에 모든 쿠키를 수동으로 지정하는 옵션이 있습니다. 쿠키를 수동으로 설정하기 위해 애플리케이션은 pwszHeaders 매개 변수에서 쿠키 헤더를 지정하는 WinHttpAddRequestHeaders를 호출합니다. 클라이언트 애플리케이션은 요청을 다시 보내기 전에 모든 쿠키 헤더를 지워야 합니다.

클라이언트 애플리케이션은 요청이 리디렉션될 때 쿠키 헤더도 변경해야 합니다. 리디렉션된 요청에서 쿠키를 변경하기 위해 클라이언트는 리디렉션 콜백 사례에 응답하는 WinHttpSetStatusCallback 을 사용하여 콜백 함수를 지정합니다. 콜백 처리기는 WinHttpAddRequestHeaders를 호출하여 이전에 요청에서 보낸 쿠키를 지워야 합니다. 쿠키 헤더를 제거하는 방법에 대한 자세한 내용은 쿠키 헤더 제거를 참조하세요.

WinHTTP 클라이언트 애플리케이션은 WinHTTP 자동 쿠키 처리 메커니즘을 수동 쿠키 처리와 결합할 수 있습니다. 애플리케이션은 WinHttpSendRequest 함수를 사용하여 요청을 보내기 전에 자동으로 생성된 쿠키 헤더에 사용자 지정 쿠키를 추가합니다. 사용자 지정 쿠키는 WinHTTP API가 쿠키를 제대로 캐시하도록 요청하는 첫 번째 쿠키 헤더여야 합니다. 또한 클라이언트 애플리케이션은 동일한 요청 핸들에서 요청을 다시 보내기 전에 이전 요청에서 보낸 쿠키를 제거해야 합니다. 자세한 내용은 쿠키 헤더 제거를 참조하세요.

WinHttpSendRequest 호출 전에 요청에 추가된 쿠키는 다음 WinHttpSendRequestWinHttpReceiveResponse 호출을 대신하여 전송된 모든 WinHTTP 요청에 포함됩니다. 클라이언트 애플리케이션은 요청이 리디렉션될 때 쿠키 헤더를 지워야 할 수 있습니다. 리디렉션된 요청에서 쿠키를 지우기 위해 클라이언트는 리디렉션 콜백 사례에 응답하는 WinHttpSetStatusCallback 을 사용하여 콜백 함수를 지정합니다. 콜백 처리기는 WinHttpAddRequestHeaders를 호출하여 이전에 요청에 전송된 쿠키를 지워야 합니다. 콜백 함수는 리디렉션 콜백에 새 사용자 지정 쿠키를 설정할 수 없습니다. 클라이언트는 다음 WinHttpSendRequest 호출에 대한 새 쿠키를 추가하기 전에 WinHttpReceiveResponse가 완료되기를 기다려야 합니다.

WinHTTP 클라이언트 애플리케이션은 이전 요청에서 전송된 쿠키가 현재 요청에서 다시 전송되지 않도록 요청을 다시 보내기 전에 기존 요청 쿠키를 지워야 할 수 있습니다. 자세한 내용은 다음 참고를 참조하세요. 또한 첫 번째 요청이 요청 핸들에 전송되기 전에 쿠키를 지울 필요가 없습니다. 클라이언트는 pwszHeaders 매개 변수의 빈 쿠키 헤더와 dwModifier 매개 변수에 설정된 WINHTTP_ADDREQ_FLAG_REPLACE 플래그를 사용하여 WinHttpAddRequestHeaders를 호출하여 기존 쿠키를 지울 수 있습니다. 다음 코드 예제에서는 요청에 쿠키 헤더를 지우는 방법을 보여줍니다.

WinHttpAddRequestHeaders(hRequest, 
                         L"Cookie:", 
                         -1, 
                         WINHTTP_ADDREQ_FLAG_REPLACE);

WinHTTP API에는 SP2(서비스 팩 2) 및 Windows Server 2003 SP1(서비스 팩 1)이 있는 Windows XP 이전 버전의 운영 체제에 대한 쿠키 처리 동작이 다릅니다.

**WINDOWS XP SP2 이상 및 Windows Server 2003 SP1 이상: **

WinHTTP API는 요청 핸들에 대한 이전 요청에서 보낸 모든 쿠키를 지웁니다. 클라이언트는 WinHttpSendRequest를 호출하기 전에 새 쿠키 헤더를 수동으로 추가할 수 있습니다. WinHTTP API의 자동 쿠키 처리 기능을 사용하지 않도록 설정하지 않은 경우 WinHTTP API는 서버의 쿠키와 함께 새 쿠키 헤더를 추가합니다(또는 클라이언트 애플리케이션이 수동으로 쿠키를 추가하지 않은 경우 새 쿠키 헤더 추가).

**WINDOWS XP SP2 및 Windows Server 2003 SP1 사용: **

WinHTTP API는 WinHttpReceiveResponse 가 완료된 후 요청 쿠키 헤더를 지우지 않습니다. 이전 요청에서 보낸 쿠키는 WinHttpSendRequest에 대한 후속 호출에서 다시 전송됩니다. WinHTTP 클라이언트 애플리케이션은 요청 핸들에 대한 요청을 다시 보내기 전에 기존 쿠키 헤더를 지워야 합니다.