ASP.NET 쿠키 개요

Visual Studio 2010

업데이트: 2007년 11월

쿠키는 웹 서버와 브라우저 간을 이동하는 요청 및 페이지에 포함된 소규모의 텍스트 비트입니다. 쿠키에는 사용자가 사이트를 방문할 때마다 웹 응용 프로그램에서 읽을 수 있는 정보가 포함되어 있습니다.

이 항목의 내용은 다음과 같습니다.

웹 응용 프로그램에서는 쿠키를 통해 사용자별 정보를 저장할 수 있습니다. 예를 들어 사용자가 사이트를 방문하는 경우 쿠키를 사용하여 사용자 기본 설정 또는 기타 정보를 저장할 수 있습니다. 사용자가 나중에 웹 사이트를 방문하면 응용 프로그램에서는 이전에 저장한 정보를 가져올 수 있습니다.

맨 위로 이동

쿠키는 웹 서버와 브라우저 간을 이동하는 요청 및 페이지에 포함된 소규모의 텍스트 비트입니다. 쿠키에는 사용자가 사이트를 방문할 때마다 웹 응용 프로그램에서 읽을 수 있는 정보가 포함되어 있습니다.

예를 들어 사용자가 사이트에 페이지를 요청하면 응용 프로그램에서는 페이지뿐만 아니라 날짜/시간을 포함하는 쿠키도 보내고, 사용자의 브라우저에서 페이지를 가져오면 사용자 하드 디스크의 폴더에 저장된 쿠키도 가져옵니다.

나중에 사용자가 다시 사이트에 페이지를 요청하는 경우 URL을 입력하면 브라우저는 로컬 하드 디스크에서 이 URL과 관련된 쿠키를 찾습니다. 쿠키가 있으면 브라우저에서는 페이지 요청과 함께 이 쿠키를 사이트에 보냅니다. 그러면 응용 프로그램에서 사용자가 마지막으로 사이트를 방문한 날짜 및 시간을 확인할 수 있습니다. 이 정보를 사용하여 사용자에게 메시지를 표시하거나 만료 날짜를 확인할 수 있습니다.

쿠키는 특정 페이지가 아니라 웹 사이트와 관련되므로 브라우저와 서버는 사용자가 사이트에 요청하는 페이지에 관계없이 쿠키 정보를 교환하게 됩니다. 사용자가 여러 사이트를 방문할 경우 각 사이트에서는 사용자의 브라우저에 쿠키를 보내고 브라우저에서는 모든 쿠키를 개별적으로 저장합니다.

웹 사이트에서는 쿠키를 사용하여 방문자에 대한 정보를 저장합니다. 일반적으로 쿠키는 웹 응용 프로그램에서 연속성을 유지 관리하는 방법, 즉 상태 관리를 수행하는 방법 중 하나입니다. 실제로 정보를 교환하는 짧은 시간을 제외하면 브라우저와 웹 서버는 연결이 끊어져 있습니다. 웹 서버에 대한 사용자의 각 요청은 다른 요청과 별개로 처리됩니다. 그러나 대부분의 경우 사용자가 페이지를 요청할 때 웹 서버에서 사용자를 인식하면 유용합니다. 예를 들어 쇼핑 사이트의 웹 서버는 각 쇼핑객을 추적하므로 사이트에서 장바구니 및 기타 사용자별 정보를 관리할 수 있습니다. 따라서 쿠키는 일종의 명함으로 사용되어 응용 프로그램에서 진행 방법을 알 수 있도록 관련된 식별 정보를 제공합니다.

쿠키는 다양한 용도로 사용되는데 모두 웹 사이트에서 사용자를 기억하도록 하기 위한 것입니다. 예를 들어 투표 사이트에서 사용자가 두 번 투표할 수 없도록 쿠키를 부울 값으로 사용하여 사용자의 브라우저에서 이미 선거에 참여했는지 여부를 나타낼 수 있습니다. 사용자가 로그온해야 하는 사이트에서는 사용자가 자격 증명을 계속 입력할 필요가 없도록 쿠키를 사용하여 해당 사용자가 이미 로그온했음을 나타낼 수도 있습니다.

쿠키 제한 사항

대부분의 브라우저에서는 최대 4096바이트의 쿠키를 지원합니다. 이러한 크기 제한 때문에 쿠키는 적은 양의 데이터 또는 사용자 ID 같은 식별자를 저장하는 데 가장 적합합니다. 그러면 사용자를 식별하거나 데이터베이스 또는 다른 데이터 저장소에서 사용자 정보를 읽을 때 이 사용자 ID를 사용할 수 있습니다. 사용자 정보를 저장하는 경우 주의해야 할 보안 관련 문제에 대한 내용은 아래에 나오는 "쿠키와 보안" 단원을 참조하십시오.

브라우저에서는 사이트에서 사용자의 컴퓨터에 저장할 수 있는 쿠키의 수에도 제한을 적용합니다. 대부분의 브라우저에서는 각 사이트마다 20개의 쿠키만 허용하고 더 많이 저장하려고 하면 가장 오래된 쿠키가 삭제됩니다. 또한 일부 브라우저에서는 모든 사이트를 통틀어 허용할 총 쿠키 수도 제한합니다. 일반적으로 이 값은 300개로 설정됩니다.

사용자가 브라우저에서 쿠키를 거부하도록 설정하여 쿠키 사용이 제한될 수도 있습니다. P3P 개인 정보 보호 정책을 정의하여 웹 사이트의 루트에 배치할 경우 대부분의 브라우저에서는 사이트의 쿠키를 허용합니다. 그러나 쿠키를 전혀 사용하지 않고 다른 방법을 통해 사용자별 정보를 저장해야 할 수도 있습니다. 사용자 정보를 저장하는 일반적인 방법은 세션 상태를 사용하는 것이지만 뒷부분에 나오는 "쿠키와 세션 상태" 단원의 설명과 같이 세션 상태는 쿠키에 의존합니다.

ms178194.alert_note(ko-kr,VS.100).gif참고:

상태 관리에 대한 자세한 내용 및 웹 응용 프로그램에서 정보를 저장하는 데 사용할 수 있는 옵션을 보려면 ASP.NET 상태 관리 개요ASP.NET 상태 관리 권장 사항을 참조하십시오.

쿠키는 응용 프로그램에서 매우 유용할 수 있지만 응용 프로그램에서는 쿠키를 저장할 수 있다는 사실에 의존해서는 안 됩니다. 중요한 기능을 지원하는 데 쿠키를 사용하지 마십시오. 응용 프로그램에서 쿠키를 사용해야 할 경우에는 브라우저에서 쿠키를 허용하는지 여부를 확인하도록 테스트할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 나오는 "브라우저의 쿠키 허용 여부 확인" 단원을 참조하십시오.

쿠키 작성

브라우저는 사용자 시스템의 쿠키를 관리해야 합니다. 쿠키는 Cookies라는 컬렉션을 노출하는 HttpResponse 개체를 통해 브라우저에 전달됩니다. Page 클래스의 Response 속성을 통해 HttpResponse 개체에 액세스할 수 있습니다. 브라우저에 보내려는 모든 쿠키는 이 컬렉션에 추가해야 합니다. 쿠키를 만들 때 NameValue를 지정합니다. 각 쿠키에는 나중에 브라우저에서 읽을 때 식별할 수 있도록 고유한 이름을 지정해야 합니다. 쿠키는 이름별로 저장되므로 두 개의 쿠키에 같은 이름을 지정하면 하나를 덮어쓰게 됩니다.

쿠키의 만료 날짜 및 시간도 설정할 수 있습니다. 만료된 쿠키는 사용자가 쿠키를 작성한 사이트를 방문할 때 브라우저에서 삭제합니다. 응용 프로그램에서 쿠키 값을 유효한 값으로 간주하는 동안 쿠키 만료를 설정해야 합니다. 쿠키가 만료되지 않게 하려면 만료 날짜를 지금부터 50년으로 설정하면 됩니다.

ms178194.alert_note(ko-kr,VS.100).gif참고:

사용자는 언제든지 컴퓨터에서 쿠키를 지울 수 있습니다. 만료 시간이 긴 쿠키를 저장하더라도 사용자가 모든 쿠키를 삭제하고 쿠키에 저장된 설정을 지울 수 있습니다.

쿠키 만료를 설정하지 않으면 쿠키가 만들어지지만 사용자의 하드 디스크에 저장되지 않습니다. 대신 쿠키가 사용자 세션 정보의 일부로 유지 관리됩니다. 따라서 사용자가 브라우저를 닫으면 쿠키가 삭제됩니다. 이처럼 비영구 쿠키는 단기간 동안에만 저장해야 하거나 보안상의 이유로 클라이언트 컴퓨터의 디스크에 작성하면 안 되는 정보에 유용합니다. 예를 들어 사용자가 공용 컴퓨터에서 작업 중인 경우 쿠키를 디스크에 작성하지 않으려면 비영구 쿠키가 유용합니다.

여러 가지 방법을 사용하여 Cookies 컬렉션에 쿠키를 추가할 수 있습니다. 다음 예제에서는 쿠키를 작성하는 두 가지 방법을 보여 줍니다.

Response.Cookies["userName"].Value = "patrick";
Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

이 예제에서는 이름이 각각 userNamelastVisit인 두 개의 쿠키를 Cookies 컬렉션에 추가합니다. 첫 번째 쿠키의 경우 Cookies 컬렉션의 값이 직접 설정됩니다. CookiesNameObjectCollectionBase 형식의 특수 컬렉션에서 파생되므로 이 방식으로 컬렉션에 값을 추가할 수 있습니다.

두 번째 쿠키의 경우 코드에서는 HttpCookie 형식의 개체 인스턴스를 만들고 속성을 설정한 다음, Add 메서드를 통해 Cookies 컬렉션에 추가합니다. HttpCookie 개체를 인스턴스화하는 경우에는 쿠키 이름을 생성자의 일부로 전달해야 합니다.

두 예제는 모두 브라우저에 쿠키를 작성하는 같은 작업을 수행합니다. 만료 값은 두 방법에서 모두 DateTime 형식이어야 합니다. 그러나 lastVisited 값은 날짜 및 시간 값도 됩니다. 모든 쿠키 값은 문자열로 저장되므로 날짜 및 시간 값을 String 형식으로 변환해야 합니다.

둘 이상의 값을 포함하는 쿠키

쿠키 하나에 값 하나를 저장할 수 있습니다(예: 사용자 이름 또는 마지막 방문일). 또한 쿠키 하나에 이름/값 쌍을 여러 개 저장할 수도 있습니다. 이러한 이름/값 쌍을 하위 키라고 합니다. 하위 키는 URL의 쿼리 문자열처럼 배치됩니다. 예를 들어 userNamelastVisit이라는 서로 다른 두 개의 쿠키를 만드는 대신 userNamelastVisit 하위 키를 포함하는 userInfo 쿠키 하나를 만들 수 있습니다.

몇 가지 이유 때문에 하위 키를 사용할 수 있습니다. 먼저, 관련된 정보 또는 비슷한 정보를 쿠키 하나에 포함하면 편리합니다. 또한 모든 정보가 하나의 쿠키 안에 있으므로 만료와 같은 쿠키 특성이 모든 정보에 적용됩니다. 반대로 정보 유형에 따라 다른 만료 날짜를 할당하려면 별도의 쿠키에 정보를 저장해야 합니다.

하위 키를 포함하는 쿠키를 사용하면 쿠키 파일의 크기를 제한하는 데에도 도움이 됩니다. 앞부분에 나온 "쿠키 제한 사항" 단원에서 설명했듯이 일반적으로 쿠키는 4096바이트로 제한되고 각 사이트마다 최대 20개의 쿠키를 저장할 수 있습니다. 하위 키를 포함하는 단일 쿠키를 사용하면 사이트에 할당된 20개의 쿠키보다 적은 수의 쿠키를 사용하게 됩니다. 또한 단일 쿠키에는 오버헤드(만료 정보 등)에 대한 50개 정도의 문자와 쿠키에 저장되는 값의 길이가 포함됩니다. 이 값은 모두 4096바이트 제한에 거의 근접한 값입니다. 5개의 쿠키를 개별적으로 저장하는 대신 하위 키 5개를 저장하면 개별 쿠키로 인한 오버헤드를 줄여 약 200바이트를 절약할 수 있습니다.

하위 키를 포함하는 쿠키를 만들려면 단일 쿠키를 작성하는 구문을 변형하여 사용할 수 있습니다. 다음 예제에서는 각각 두 개의 하위 키를 포함하여 같은 쿠키를 작성하는 두 가지 방법을 보여 줍니다.

Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

쿠키 범위 제어

기본적으로 사이트의 모든 쿠키는 클라이언트에 함께 저장되고 해당 사이트에 대한 요청과 함께 서버에 전달됩니다. 즉, 사이트의 모든 페이지는 해당 사이트에 대한 모든 쿠키를 가져옵니다. 그러나 다음과 같은 두 가지 방법을 사용하여 쿠키 범위를 설정할 수 있습니다.

  • 쿠키 범위를 서버의 폴더로 제한합니다. 이렇게 하면 쿠키를 사이트의 응용 프로그램으로 제한할 수 있습니다.

  • 쿠키 범위를 도메인으로 설정합니다. 이렇게 하면 도메인에서 쿠키에 액세스할 수 있는 하위 도메인을 지정할 수 있습니다.

쿠키를 폴더 또는 응용 프로그램으로 제한

쿠키를 서버의 폴더로 제한하려면 다음 예제와 같이 쿠키의 Path 속성을 설정합니다.

HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "/Application1";
Response.Cookies.Add(appCookie);
ms178194.alert_note(ko-kr,VS.100).gif참고:

이전 예제에서와 같이 Cookies 컬렉션에 쿠키를 직접 추가하는 방법으로 쿠키를 작성할 수도 있습니다.

경로는 사이트 루트 아래의 실제 경로 또는 가상 루트가 될 수 있습니다. 이렇게 하면 Application1 폴더 또는 가상 루트의 페이지에서만 쿠키를 사용할 수 있습니다. 예를 들어 사이트가 www.contoso.com인 경우, 이전 예제에서 만든 쿠키는 http://www.contoso.com/Application1/ 경로의 페이지와 해당 폴더 아래에 있는 모든 페이지에서 사용할 수 있습니다. 그러나 http://www.contoso.com/Application2/ 같은 다른 응용 프로그램이나 http://www.contoso.com/ 사이트 자체의 페이지에서는 쿠키를 사용할 수 없습니다.

ms178194.alert_note(ko-kr,VS.100).gif참고:

일부 브라우저에서는 경로의 대/소문자를 구분합니다. 사용자가 브라우저에 URL을 입력하는 방식을 제어할 수 없지만 응용 프로그램이 특정 경로와 관련된 쿠키에 의존할 경우에는 하이퍼링크의 URL이 Path 속성 값과 대/소문자가 일치해야 합니다.

쿠키 도메인 범위 제한

기본적으로 쿠키는 특정 도메인과 연결되어 있습니다. 예를 들어 사이트가 www.contoso.com인 경우 사용자가 이 사이트에서 페이지를 요청하면 작성된 쿠키가 서버에 전달됩니다. 여기에는 특정 경로 값이 설정된 쿠키가 포함되지 않을 수도 있습니다. 사이트에 contoso.com, sales.contoso.com, support.contoso.com 같은 하위 도메인이 있으면 쿠키를 특정 하위 도메인과 연결할 수 있습니다. 이렇게 하려면 다음 예제와 같이 쿠키의 Domain 속성을 설정합니다.

Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "support.contoso.com";

이런 방식으로 도메인을 설정하면 지정된 하위 도메인의 페이지에서만 쿠키를 사용할 수 있습니다. 또한 다음 예제와 같이 Domain 속성을 사용하여 여러 하위 도메인에서 공유할 수 있는 쿠키를 만들 수도 있습니다.

Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "contoso.com";

그러면 sales.contoso.com 및 support.contoso.com 도메인뿐만 아니라 주 도메인에서도 쿠키를 사용할 수 있습니다.

쿠키 읽기

브라우저에서는 서버에 요청할 때 해당 서버에 대한 쿠키를 요청과 함께 보냅니다. ASP.NET 응용 프로그램에서 HttpRequest 개체를 사용하여 쿠키를 읽을 수 있습니다. 이 개체는 Page 클래스의 Request 속성으로 사용할 수 있습니다. 기본적으로 HttpRequest 개체의 구조는 HttpResponse 개체의 구조와 같으므로 HttpResponse 개체에 쿠키를 작성한 것과 거의 같은 방식으로 HttpRequest 개체에서 쿠키를 읽을 수 있습니다. 다음 코드 예제에서는 username 쿠키의 값을 가져온 다음 Label 컨트롤에 이 값을 표시할 수 있는 두 가지 방법을 보여 줍니다.

if(Request.Cookies["userName"] != null)
    Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);

if(Request.Cookies["userName"] != null)
{
    HttpCookie aCookie = Request.Cookies["userName"];
    Label1.Text = Server.HtmlEncode(aCookie.Value);
}

쿠키의 값을 가져오기 전에 먼저 쿠키가 있는지 확인해야 합니다. 쿠키가 없으면 NullReferenceException 예외가 발생합니다. 또한 페이지에 쿠키 값을 표시하기 전에 HtmlEncode 메서드를 호출하여 쿠키 내용을 인코딩했습니다. 이렇게 하면 악의적인 사용자가 실행 스크립트를 쿠키에 추가할 수 없습니다. 쿠키 보안에 대한 자세한 내용은 "쿠키와 보안" 단원을 참조하십시오.

ms178194.alert_note(ko-kr,VS.100).gif참고:

브라우저에 따라 쿠키를 저장하는 방식이 다르므로 같은 컴퓨터의 각 브라우저에서 다른 브라우저의 쿠키를 읽지 못할 수도 있습니다. 예를 들어 처음에 Internet Explorer를 사용하여 페이지를 테스트하는 경우 다음에 다른 브라우저를 사용하여 다시 테스트하면 두 번째 브라우저는 Internet Explorer에서 저장한 쿠키를 찾을 수 없습니다.

쿠키에서 하위 키의 값을 읽는 방법은 값을 설정하는 것과 비슷합니다. 다음 코드 예제에서는 하위 키의 값을 가져오는 한 가지 방법을 보여 줍니다.

if(Request.Cookies["userInfo"] != null)
{
    Label1.Text = 
        Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);

    Label2.Text =
        Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}

위의 예제의 경우 코드에서는 이전에 DateTime 값을 문자열 표현으로 설정한 lastVisit 하위 키의 값을 읽습니다. 쿠키에는 값이 문자열로 저장되므로 lastVisit 값을 날짜로 사용하려면 다음 예제와 같이 이 값을 적절한 형식으로 변환해야 합니다.

DateTime dt;
dt = DateTime.Parse(Request.Cookies["userInfo"]["lastVisit"]);

쿠키의 하위 키는 NameValueCollection 형식의 컬렉션으로 형식화됩니다. 따라서 각 하위 키를 가져오려면 다음 예제와 같이 하위 키 컬렉션을 가져온 다음 이름별로 하위 키 값을 추출하면 됩니다.

if(Request.Cookies["userInfo"] != null)
{
    System.Collections.Specialized.NameValueCollection
        UserInfoCookieCollection;
       
    UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
    Label1.Text = 
        Server.HtmlEncode(UserInfoCookieCollection["userName"]);
    Label2.Text =
        Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
}

쿠키 만료 날짜 변경

브라우저에서는 쿠키를 관리해야 하고 쿠키의 만료 날짜 및 시간을 사용하면 브라우저에서 쿠키 저장을 관리하는 데 도움이 됩니다. 따라서 쿠키의 이름과 값은 읽을 수 있지만 만료 날짜와 시간은 읽을 수 없습니다. 브라우저에서는 서버에 쿠키 정보를 보낼 때 만료 정보를 포함하지 않습니다. 쿠키의 Expires 속성은 항상 날짜 및 시간 값 0을 반환합니다. 쿠키 만료 날짜가 문제가 되는 경우에는 만료 날짜를 다시 설정해야 합니다. 이에 대한 내용은 "쿠키 수정 및 삭제" 단원을 참조하십시오.

ms178194.alert_note(ko-kr,VS.100).gif참고:

쿠키를 브라우저에 보내기 전에 HttpResponse 개체에 설정한 쿠키의 Expires 속성을 읽을 수 있습니다. 그러나 HttpRequest 개체로 다시 만료 값을 가져올 수 없습니다.

쿠키 컬렉션 읽기

때때로 페이지에서 사용할 수 있는 모든 쿠키를 읽어야 할 경우가 있습니다. 페이지에서 사용할 수 있는 모든 쿠키의 이름과 값을 읽으려면 다음과 같은 코드를 사용하여 Cookies 컬렉션을 반복하면 됩니다.

System.Text.StringBuilder output = new System.Text.StringBuilder();
HttpCookie aCookie;
for(int i=0; i<Request.Cookies.Count; i++)
{
    aCookie = Request.Cookies[i];
    output.Append("Cookie name = " + Server.HtmlEncode(aCookie.Name) 
        + "<br />");
    output.Append("Cookie value = " + Server.HtmlEncode(aCookie.Value)
        + "<br /><br />");
}
Label1.Text = output.ToString();

ms178194.alert_note(ko-kr,VS.100).gif참고:

이 코드를 실행하면 ASP.NET_SessionId라는 쿠키를 볼 수 있습니다. 이 쿠키는 ASP.NET에서 세션의 고유 식별자를 저장하는 데 사용됩니다. 세션 쿠키는 하드 디스크에 저장되지 않습니다. 세션 쿠키에 대한 자세한 내용은 이 항목의 뒷부분에 나오는 "쿠키와 세션 상태" 단원을 참조하십시오.

위의 예제에서는 쿠키에 하위 키가 있을 경우 이 하위 키가 단일 이름/값 문자열로 표시된다는 제한이 적용되어 있습니다. 쿠키의 HasKeys 속성을 읽어 쿠키에 하위 키가 있는지 여부를 확인할 수 있습니다. 하위 키가 있으면 하위 키 컬렉션을 읽어 각 하위 키의 이름과 값을 가져올 수 있습니다. 인덱스 값을 기준으로 Values 컬렉션에서 직접 하위 키 값을 읽을 수 있습니다. 해당하는 하위 키 이름은 Values 컬렉션에서 문자열 배열을 반환하는 AllKeys 멤버에서 사용할 수 있습니다. Values 컬렉션의 Keys 멤버를 사용할 수도 있습니다. 그러나 AllKeys 속성은 처음 액세스될 때 캐시됩니다. 반대로 Keys 속성은 액세스될 때마다 배열을 구성합니다. 따라서 같은 페이지 요청의 컨텍스트 내에서 다음에 액세스할 때는 AllKeys 속성을 사용하면 훨씬 빠릅니다.

다음은 위의 예제에서 약간 수정한 예제입니다. 이 예제에서는 HasKeys 속성을 사용하여 하위 키가 있는지 테스트하고, 하위 키가 있으면 Values 컬렉션에서 하위 키를 가져옵니다.

for(int i=0; i<Request.Cookies.Count; i++)
{
    aCookie = Request.Cookies[i];
    output.Append("Name = " + aCookie.Name + "<br />");
    if(aCookie.HasKeys)
    {
        for(int j=0; j<aCookie.Values.Count; j++)
        {
            subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);
            subkeyValue = Server.HtmlEncode(aCookie.Values[j]);
            output.Append("Subkey name = " + subkeyName + "<br />");
            output.Append("Subkey value = " + subkeyValue + 
                "<br /><br />");
        }
    }
    else
    {
        output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
            "<br /><br />");
    }
}
Label1.Text = output.ToString();

또는 다음 예제와 같이 하위 키를 NameValueCollection 개체로 추출할 수도 있습니다.

System.Text.StringBuilder output = new System.Text.StringBuilder();
HttpCookie aCookie;
string subkeyName;
string subkeyValue;

for (int i = 0; i < Request.Cookies.Count; i++)
{
    aCookie = Request.Cookies[i];
    output.Append("Name = " + aCookie.Name + "<br />");
    if (aCookie.HasKeys)
    {
        System.Collections.Specialized.NameValueCollection CookieValues = 
            aCookie.Values;
        string[] CookieValueNames = CookieValues.AllKeys;
        for (int j = 0; j < CookieValues.Count; j++)
        {
            subkeyName = Server.HtmlEncode(CookieValueNames[j]);
            subkeyValue = Server.HtmlEncode(CookieValues[j]);
            output.Append("Subkey name = " + subkeyName + "<br />");
            output.Append("Subkey value = " + subkeyValue + 
                "<br /><br />");
        }
    }
    else
    {
        output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
            "<br /><br />");
    }
}
Label1.Text = output.ToString();

쿠키 수정 및 삭제

쿠키를 직접 수정할 수는 없습니다. 대신 새 값을 사용하여 쿠키를 새로 만든 다음 브라우저에 전달하여 클라이언트의 이전 버전을 덮어쓰는 방식으로 쿠키를 변경해야 합니다. 다음 코드 예제에서는 사용자가 사이트에 방문한 횟수를 저장하는 쿠키의 값을 변경하는 방법을 보여 줍니다.

int counter;
if (Request.Cookies["counter"] == null)
    counter = 0;
else
{
    counter = int.Parse(Request.Cookies["counter"].Value);
}
counter++;

Response.Cookies["counter"].Value = counter.ToString();
Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);

쿠키 삭제

쿠키를 수정하는 방법을 변형하여 쿠키를 삭제(실제로 사용자의 하드 디스크에서 제거)할 수 있습니다. 쿠키는 사용자의 컴퓨터에 있으므로 직접 제거할 수는 없습니다. 그러나 브라우저에서 자동으로 쿠키가 삭제되도록 할 수 있습니다. 삭제할 쿠키와 이름이 같은 새 쿠키를 만들고 쿠키의 만료 날짜를 오늘 이전으로 설정하면 됩니다. 브라우저에서는 쿠키의 만료 날짜를 확인할 때 오래된 쿠키를 삭제합니다. 다음 코드 예제에서는 응용 프로그램에 있는 모든 쿠키를 삭제하는 방법을 보여 줍니다.

HttpCookie aCookie;
string cookieName;
int limit = Request.Cookies.Count;
for (int i=0; i<limit; i++)
{
    cookieName = Request.Cookies[i].Name;
    aCookie = new HttpCookie(cookieName);
    aCookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(aCookie);
}

하위 키 수정 또는 삭제

다음 예제와 같이 각 하위 키를 수정하는 방법은 하위 키를 만드는 방법과 동일합니다.

Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

각 하위 키를 삭제하려면 하위 키가 포함된 쿠키의 Values 컬렉션을 조작해야 합니다. 먼저 Cookies 개체에서 쿠키를 가져오는 방법으로 쿠키를 다시 만듭니다. 그런 다음 Values 컬렉션의 Remove 메서드를 호출하고 삭제할 하위 키의 이름을 Remove 메서드에 전달합니다. 마지막으로, 수정된 형식의 쿠키가 브라우저에 다시 전달되도록 Cookies 컬렉션에 쿠키를 추가합니다. 다음 코드 예제에서는 하위 키를 삭제하는 방법을 보여 줍니다. 이 샘플에서는 제거할 하위 키의 이름이 변수에 지정되었습니다.

string subkeyName;
subkeyName = "userName";
HttpCookie aCookie = Request.Cookies["userInfo"];
aCookie.Values.Remove(subkeyName);
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

쿠키와 보안

쿠키와 관련된 보안 문제는 클라이언트에서 데이터 가져오기와 관련된 보안 문제와 비슷합니다. 응용 프로그램에서 쿠키는 또 다른 형태의 사용자 입력이므로 검사 및 스푸핑 대상이 됩니다. 사용자의 컴퓨터에 쿠키가 있기 때문에 사용자는 최소한 쿠키에 저장되는 데이터를 볼 수 있습니다. 또한 사용자는 브라우저에서 쿠키가 전달되기 전에 이러한 쿠키를 변경할 수도 있습니다.

사용자 이름, 암호, 신용 카드 번호 등과 같은 중요한 데이터는 쿠키에 저장하면 안 됩니다. 사용자 또는 쿠키를 도용할 수 있는 다른 사람에게 전달하면 안 되는 정보는 쿠키에 저장하지 마십시오.

마찬가지로 쿠키에서 가져오는 정보를 신뢰하지 마십시오. 처음에 작성한 내용과 이 데이터가 다르다고 가정하고, 사용자가 웹 페이지에 입력한 데이터에 적용하는 보호 수단과 같은 방법을 사용하여 쿠키 값 작업을 수행해야 합니다. 이 항목의 앞부분에 나온 여러 예제에서는 사용자가 입력하는 정보를 표시하기 전에 수행했던 것과 마찬가지로 페이지에 값을 표시하기 전에 쿠키의 내용을 HTML로 인코딩하는 방법을 보여 주었습니다.

쿠키는 브라우저와 서버 간에 일반 텍스트로 전달되므로 웹 트래픽을 가로챌 수 있는 모든 사용자가 쿠키를 읽을 수 있습니다. SSL(Secure Sockets Layer)을 사용하여 연결하는 경우에만 쿠키를 전송하도록 쿠키 속성을 설정할 수 있습니다. SSL을 사용하면 사용자 컴퓨터에 있는 쿠키를 읽거나 조작할 수는 있지만 전송되는 동안에는 쿠키가 암호화되어 있으므로 읽을 수 없습니다. 자세한 내용은 웹 응용 프로그램의 기본 보안에 대한 유용한 정보를 참조하십시오.

브라우저의 쿠키 허용 여부 확인

사용자는 브라우저에서 쿠키를 거부하도록 설정할 수 있습니다. 쿠키를 작성할 수 없는 경우 오류가 발생하지 않습니다. 또한 브라우저에서 현재 쿠키 설정에 대한 정보를 서버에 보내지 않습니다.

ms178194.alert_note(ko-kr,VS.100).gif참고:

Cookies 속성은 쿠키 사용 여부를 나타내지 않습니다. 대신 현재 브라우저에서 기본적으로 쿠키를 지원하는지 여부만 나타냅니다.

쿠키를 작성한 다음 다시 읽어 보면 쿠키가 허용되는지 여부를 확인할 수 있습니다. 작성한 쿠키를 읽을 수 없는 경우 브라우저에서 쿠키가 해제되어 있다고 가정합니다.

다음 코드 예제에서는 쿠키 허용 여부를 테스트할 수 있는 방법을 보여 줍니다. 이 샘플은 두 페이지로 구성되어 있습니다. 첫 번째 페이지에서는 쿠키를 작성한 다음 브라우저를 두 번째 페이지로 리디렉션합니다. 두 번째 페이지에서는 쿠키를 읽은 다음 테스트 결과를 포함하는 쿼리 문자열 변수를 URL에 추가하여 브라우저를 다시 첫 번째 페이지로 리디렉션합니다.

첫 번째 페이지를 실행하는 코드는 다음과 같습니다.

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Request.QueryString["AcceptsCookies"] == null)
        {
            Response.Cookies["TestCookie"].Value = "ok";
            Response.Cookies["TestCookie"].Expires =
                DateTime.Now.AddMinutes(1);
            Response.Redirect("TestForCookies.aspx?redirect=" +
                Server.UrlEncode(Request.Url.ToString()));
        }
        else
        {
            Label1.Text = "Accept cookies = " +
                Server.UrlEncode(
                Request.QueryString["AcceptsCookies"]);
        }
    }
}

페이지에서는 먼저 다시 게시 여부를 테스트하고 다시 게시가 아닐 경우에는 테스트 결과가 포함된 쿼리 문자열 변수 AcceptsCookies를 찾습니다. 쿼리 문자열 변수가 없으면 테스트가 완료되지 않은 것이므로 코드에서는 TestCookie라는 쿠키를 작성합니다. 쿠키를 작성한 후에는 이 샘플에서 Redirect를 호출하여 TestForCookies.aspx 테스트 페이지로 이동합니다. 테스트 페이지의 URL에는 현재 페이지의 URL이 포함된 쿼리 문자열 변수 redirect가 추가되고 이로 인해 테스트를 수행한 후에 이 페이지로 다시 리디렉션할 수 있습니다.

테스트 페이지는 코드로만 구성될 수 있으며 컨트롤을 포함할 필요가 없습니다. 다음 코드 예제에서는 테스트 페이지를 보여 줍니다.

protected void Page_Load(object sender, EventArgs e)
{
    string redirect = Request.QueryString["redirect"];
    string acceptsCookies;
    if(Request.Cookies["TestCookie"] ==null)
        acceptsCookies = "no";
    else
    {
        acceptsCookies = "yes";
        // Delete test cookie.
        Response.Cookies["TestCookie"].Expires = 
            DateTime.Now.AddDays(-1);
    }
    Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,
    true);
}

redirect 쿼리 문자열 변수를 읽은 후에는 코드에서 쿠키를 읽습니다. 쿠키가 있는 경우에는 관리 목적을 위해 즉시 삭제됩니다. 테스트가 끝나면 코드에서는 redirect 쿼리 문자열 변수를 통해 전달된 URL을 사용하여 새 URL을 작성합니다. 새 URL에도 테스트 결과가 포함된 쿼리 문자열 변수가 있습니다. 마지막 단계에서는 새 URL을 사용하여 브라우저를 원래 페이지로 리디렉션합니다.

이 예제를 기초로 하여 사용자가 원래 페이지를 볼 때마다 테스트를 반복할 필요가 없도록 쿠키 테스트 결과를 데이터베이스 같은 영구 저장소에 보관하는 방식으로 개선할 수 있습니다. 기본적으로 테스트 결과를 세션 상태에 저장하려면 쿠키가 필요합니다.

쿠키와 세션 상태

사용자가 사이트를 탐색하는 경우 서버에서는 이 사용자가 방문하는 동안 지속되는 고유 세션을 만듭니다. 각 세션에 대해 ASP.NET에서는 응용 프로그램이 사용자별 정보를 저장할 수 있는 세션 상태 정보를 유지 관리합니다. 자세한 내용은 ASP.NET 세션 상태 개요 항목을 참조하십시오.

ASP.NET에서는 사용자를 서버의 세션 상태 정보에 매핑할 수 있도록 각 사용자의 세션 ID를 추적해야 합니다. 기본적으로 ASP.NET에서는 비영구 쿠키를 사용하여 세션 상태를 저장합니다. 그러나 사용자가 브라우저에서 쿠키를 사용할 수 없도록 한 경우에는 세션 상태 정보를 쿠키에 저장할 수 없습니다.

ASP.NET에서는 쿠키가 없는 세션 형식의 대체 기능을 제공합니다. 쿠키가 아니라 사이트의 페이지 URL에 세션 ID를 저장하도록 응용 프로그램을 구성할 수 있습니다. 응용 프로그램이 세션 상태를 기반으로 할 경우에는 쿠키가 없는 세션을 사용하도록 응용 프로그램을 구성할 수도 있습니다. 그러나 일부 제한된 환경에서는 사용자가 다른 사용자와 URL을 공유하는 경우, 예를 들면 사용자 세션이 활성화되어 있는 동안 다른 사용자에게 URL을 보내는 경우 두 사용자 모두 같은 세션을 공유하게 되어 예기치 않은 결과가 발생할 수 있습니다. 응용 프로그램에서 쿠키가 없는 세션을 사용하도록 구성하는 데 대한 자세한 내용은 ASP.NET 상태 관리 개요 항목을 참조하십시오.

맨 위로 이동

HttpCookie

개별 HTTP 쿠키를 만들고 조작할 수 있는 형식이 안전한 방법을 제공합니다.

Cookies

응답 쿠키 컬렉션을 가져옵니다.

Cookies

클라이언트에서 보낸 쿠키 컬렉션을 가져옵니다.

맨 위로 이동

표시: