본문 바로가기

개발

ASP & ASP.NET 쿠키(Cookie) 방식 차이(예제소스)


이전 버전의 Microsoft Active Server Pages(ASP)에서는 쿠키를 쓸 때 UrlEncode 형식으로 인코딩하고 쿠키를 읽을 때 디코딩합니다.
그러나 ASP.NET에서는 기본적으로 쿠키를 UrlEncode 형식으로 인코딩하거나 디코딩하지 않습니다.

따라서 ASP.NET 응용 프로그램에서 예상치 않은 문제가 발생할 수도 있습니다.

[출처] MS 고객지원

기본적으로 ASP에서 쿠키를 구울 당시 내부적으로 URLEncode를 적용하여 보관하지만,
ASP.NET에서는 URLEncode의 과정이 없습니다.

따라서, ASP와 ASP.NET에서 동일한 Key를 사용하여 쿠키를 생성하더라도 실제 생성되는
쿠키는 URLEncode된 것과 되지 않는 두 종류의 쿠키가 생성되게 됩니다. 이 차이를 알지
못하고 무작정 개발하게되면, 순수하게 영문과 숫자로만 생성된 쿠키는 무리없이
공유되고 "_(under-bar)"와 같이 특수문자가 혼합되어 생성된 쿠키는 두개의 독립적인
쿠키로 인식되어 사용될 수 있습니다. ASP.NET에서만 생성되고 사용되는 쿠키라면
상관없겠지만(.NET의 경우는 UTF-8 인코딩이 Default다 보니 한글사용에서도 약간의
문제가 있긴 합니다.), ASP 환경과 공유되는 동시에 서비스 되는 환경에서 동일한 쿠키의
제어가 필요하다면 충분히 고려해야할 대상입니다. 이를 해결하기 위해서는 ASP.NET에서
(ASP에서 쿠키 생성시 URLEncode가 되는 것을 제어할 수 없기 때문에) 쿠키 생성과 내용
조회시 URLEncode, URLDecode 과정을 추가해주어야 합니다.

[출처 : 개인블로그]

[예제소스]
---------------------------
#region 쿠키 키값 인코딩하기
/// <summary>
/// 쿠키 키값 인코딩하기
/// </summary>
/// <param name="Key">쿠키 키값</param>
private static string getEncoding(string Key)
{
    string strBase = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    StringBuilder sb = new StringBuilder();
    foreach (char c in Key.ToCharArray())
    {
        if (strBase.IndexOf(c) < 0)
        {
            sb.Append("%");
            byte[] ascii = Encoding.ASCII.GetBytes(c.ToString());
            foreach (byte b in ascii)
            {
                sb.AppendFormat("{0:x}", b);
            }
        }
        else
        {
            sb.Append(c.ToString());
        }
    }
    return sb.ToString();
}
#endregion
-------------------------
#region 쿠키값 가져오기
/// <summary>
/// 쿠키값 가져오기
/// </summary>
/// <param name="Key1">쿠키 키값1</param>
/// <param name="Key2">쿠키 키값2</param>
public static string getCookieValue(string Key1, string Key2)
{
    HttpContext _context = HttpContext.Current;
    HttpCookieCollection _Cookie = _context.Request.Cookies;
    string rtnValue = string.Empty;
   
    Key1 = getEncoding(Key1);
    Key2 = getEncoding(Key2);
    try
    {
        rtnValue = _Cookie[Key1][Key2].ToString();
    }
    catch { }
   
    return HttpUtility.UrlDecode(rtnValue, System.Text.ASCIIEncoding.Default);
}
#endregion

#region 쿠키값 설정하기 (2단계)
/// <summary>
/// 쿠키값 설정하기 (2단계)
/// </summary>
/// <param name="Key1">쿠키 키값1</param>
/// <param name="Key2">쿠키 키값2</param>
public static void setCookieValue(string Key1, string Key2, string Value)
{
    HttpContext _context = HttpContext.Current;
    Key1 = getEncoding(Key1);
    Key2 = getEncoding(Key2);
    Value = HttpUtility.UrlEncode(Value, System.Text.ASCIIEncoding.Default);
   
    HttpCookie MysiteCookie;
    try
    {
        MysiteCookie = _context.Request.Cookies[Key1];
        MysiteCookie.Domain = "Mysite.com";
        MysiteCookie.Values.Set(Key2, Value);
        _context.Response.Cookies.Set(MysiteCookie);
    }
    catch <- 이 부분은 각자 알아서 예외처리 하시면 됩니다.
    {
        MysiteCookie = new HttpCookie(Key1);
        MysiteCookie.Domain = "Mysite.com";
        MysiteCookie.Values.Set(Key2, Value);
        _context.Response.Cookies.Set(MysiteCookie);
    }
}
#endregion   

=========================================================================

이상입니다.