asp와 asp.net cookie

-- ASP.NET 2009. 12. 18. 13:36
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
ASP와 ASP.NET에서의 쿠키 사용

개발 관련 이야기를 처음으로 작성하네요.
그 첫번째 이야기는 ASP에서ASP.NET으로의 전환에서 개발 도중 나타날 수 있는 쿠키 사용관련 내용입니다. 작은 규모의 사이트 운영에서는 사용자의 인증 처리를 위해서 세션(Session)을 사용하기도 합니다만, 2대 이상의 물리적인 서버/도메인 환경에서는 각기 다른 서버/도메인에서의 사용자 인증을 동일하게 구성하기 위해서 쿠키(Cookie)를 많이 사용하고 있습니다.

물론 대규모의 사이트에서는 SessionState나 SSO(Single Sign On) 등을 사용하기도 하죠.. 쿠키의 단점 중의 하나가 대부분의 브라우져에서 한 도메인 당 사용할 수 있는 쿠키의 개수가 20개로 제한되어 있다는 것입니다. 이를 해결하기 위해서 쿠키를 많이 사용하는 서비스에서는 다중 쿠키를 사용하여 이를 해결하고 있습니다.    

단일 쿠키에서는 그 사용이 ASP와 ASP.NET이 동일하게 동작을 하기 때문에 별 문제가 발생하지 않습니다만, 다중 쿠키의 사용에 있어서 ASP와 ASP.NET의 사용 방법이 다소 차이가 있습니다. 예를 들어 설명을 드리면, ASP와 ASP.NET에서 쿠키의 사용 방법은 다음과 같습니다.
 
1. 1차원 쿠키 사용    
   1.1 ASP       
      [쿠키 쓰기]
Response.Cookies("쿠키명").Domain = "test.com"
Response.Cookies("쿠키명") = "값1"

      [쿠키 읽기]
Response.Write(Request.Cookies("쿠키명"))

   1.2 ASP.NET
      [쿠키 쓰기]
Response.Cookies["쿠키명"].Domain = "test.com";
Response.Cookies["쿠키명"] = "값1";

      [쿠키 읽기]
Response.Write(Request.Cookies["쿠키명"]);

기록되는 쿠키 값:
      쿠키명=값1;.......

2. 2차원 쿠키 사용
   2.1 ASP
      [쿠키 쓰기]
Response.Cookies("쿠키명").Domain = "test.com"
Response.Cookies("쿠키명")("하위키1") = "값1"
Response.Cookies("쿠키명")("하위키2") = "값2"

      [쿠키 읽기]
Response.Write(Request.Cookies("쿠키명")("하위키1"))
Response.Write(Request.Cookies("쿠키명")("하위키2"))

   2.2 ASP.NET
      [쿠키 쓰기]
Response.Cookies["쿠키명"].Domain = "test.com";
Response.Cookies["쿠키명"]["하위키1"] = "값1";
Response.Cookies["쿠키명"]["하위키2"] = "값2";

      [쿠키 읽기]
Response.Write(Request.Cookies["쿠키명"]["하위키1"]);
Response.Write(Request.Cookies["쿠키명"]["하위키2"]);

기록되는 쿠키 값:     
    쿠키명=하위키1=값1&하위키2=값2;......

한 번만 쓰고, 다시는 쿠키값에 대한 재설정(데이터 변경)하는 경우가 없다면 위와 같이 사용하여도 무방합니다.
하지만, ASP.NET에서는 다중 쿠키로 생성된 경우 하위 키 중에서 하나의 값만 수정하고자 할때는 문제가 발생할 수 있습니다.
 
<다중 쿠키에서 일부의 하위키값 변경>
     [ASP]
Response.Cookies("쿠키명")("하위키1") = "값3"
기록되는 쿠키 값:
     쿠키명=하위키1=값3&하위키2=값2;....

     [ASP.NET]
Response.Cookies["쿠키명"]["하위키1"] = "값3";
기록되는 쿠키 값:     
    쿠키명=하위키1=값3;....  // 변경된 이후의 하위 쿠키(하위키2)가 사라짐.

어라? 미쳐버립니다..^^;;; ASP.NET에서는 일반 ASP에서 사용하던 것 처럼, 변경하고자 하는 하위키의 값만 변경하여 저장하면 변경된 하위키의 정보가 날라갑니다. 이것은 ASP.NET에서는 쿠키를 NameValueCollection으로 관리를 하기 때문에 ASP에서 처럼 쿠키의 값을 수정하게되면 해당 Collection이 초기화되기 때문에 기존의 설정된 쿠키가 사라져버리는 것 입니다. 따라서 ASP.NET에서 이를 해결하기 위해서는 다음과 같은 방법으로 쿠키의 값을 변경해 주어야 합니다.
 
HttpCookie cookie = Request.Cookies["쿠키명"];
cookie.Domain = "test.com";
cookie.Values.Set("하위키", "값3");
Response.Cookies.Set(cookie);

기록되는 쿠키 값:     쿠키명=하위키1=값3&하위키2=값2;....

위와 같이 하면, ASP.NET 환경에서도 다중 쿠키를 무리없이 사용할 수 있습니다. 위와는 상관없는 얘기이지만, 하위키와 값들을 임의의 Delimiter를 이용하여 하나의 문자열로 생성한 뒤에 단일 쿠키로 사용할 수도 있습니다. 더불어 생성된 단일 문자열을 암호화 처리하게 되면, 웹 사이트에 대한 보안 레벨이 한 층 높아질 수 있지요..^^ 

쿠키의 값은 아무런 암호화 진행없이 일반 Text 형태로 노출이 되기 때문에 사이트 해킹 등을 시도할 때 가장 먼저 스캔하는 데이터 입니다..^^ (이전에 어떤 사이트에서는 사용자 비밀번호를 쿠키에 저장해서 문제가 된 적이 있습니다..ㅡㅡ;;)  

단, 사용자가 많거나/ 하위 키에 대한 값이 자주 변경되거나 하는 경우에는 자제해야 하는 방법입니다. 단일 문자열에 Delimter를 사용하는 것은 처리하는 매커니즘에 따라 달라지겠지만 반복적으로 배열이나 객체를 사용하게 되는데, 이것은 서버 자원의 낭비를 가져오는 것이겠죠..^^

하나 추가적으로 ASP와 ASP.NET에서는 쿠키에 저장되는 데이터가 다릅니다. 동일한 키를 사용하였는데, ASP에서 구워진 쿠키가 ASP.NET에서는 가져오지 못하는 경우가 있습니다.

출처 : http://turtledaddy.tistory.com/33

ASP와 ASP.NET에서의 쿠키 정보 공유

지난 포스트에서 ASP와 ASP.NET의 쿠키 사용에 대해서 간단하게 살펴봤습니다. 이번에는 ASP와 ASP.NET에서의 쿠키 데이터 공유에 대해서 알아보겠습니다. 시작하기 전에 이런 의문이 생기실 수 있습니다.

'똑같은 쿠키인데 그냥 조회하고 사용하면 되는 거 아닌가?'

흠..결론부터 말씀드리면, 그냥은 안됩니다..ㅠ,.ㅠ 기본적으로 ASP에서 쿠키를 구울 당시 내부적으로 URLEncode를 적용하여 보관하지만, ASP.NET에서는 URLEncode의 과정이 없습니다. 예를 들어 설명 드리면,
 
ASP에서 다음과 같이 쿠키를 저장하였습니다.    

    Response.Cookies("user_info")("Name") = "인아애비"
    Response.Cookies("user_info")("Email") = "man.namkung@gmail.com"
    Response.Cookies("user_data") = "abcdefghijklmnopqrstuvwxyz0123456789"
    Response.Cookies("Specialkey") = "~!@#$%^&*(),./;'[]\-=<>?:{}|_+"

이럴 경우, 저장되는 쿠키 정보는 다음 과 같습니다.

user%5Fdata=abcdefghijklmnopqrstuvwxyz0123456789; user%5Finfo=Email=man%2Enamkung%40gmail%2Ecom&Name=%C0%CE%BE%C6%BE%D6%BA%F1; Specialkey=%7E%21%40%23%24%25%5E%26%2A%28%29%2C%2E%2F%3B%27%5B%5D%5C%2D%3D%3C%3E%3F%3A%7B%7D%7C%5F%2B


영문, 숫자를 제외한 모든 Data가 Encoding되어 있습니다.

반면에, ASP.NET에서 동일한 정보로 쿠키를 생성하면 다음과 같이 저장됩니다.
 
Specialkey=~!@#$%^&*(),./; user_info=Name=인아애&Email=man.namkung@gmail.com; user_data=abcdefghijklmnopqrstuvwxyz0123456789

ASP에서 처럼 URLEncode되지 않습니다.

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

public string GetCookieEncode(string strValue) {
    string strBase = "abcd....wxyzABCD....WXYZ0123....89";
    StringBuilder sb = new StringBuilder();
    foreach (char c in strValue.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();
}

기본적으로 URLEncode 메소드를 이용하여 인코딩 할 경우, "_(언더바)"와 같은 문자는 인코딩되지 않습니다. 그렇기 때문에 영문, 숫자를 제외한 모든 문자에 대해서 인코딩을 진행하는 함수를 생성하였습니다.

ASP에서는 Key 또한 인코딩되기 때문에, ASP.NET에서 사용하기 위해서 Key를 인코딩 해주어 사용해야 합니다.
우선 샘플로 하나의 키 값만 조회하면, ASP.NET에서는 다음과 같이 사용할 수 있습니다.
 
 Response.Write(HttpUtility.UrlDecode(Request.Cookies[GetCookieEncode
             ("user_info")].Value));
             // 위애서 생성한 함수로 Key를 인코딩 하여 전달.

따라서, 위에서 생성한 함수를 이용하여 쿠키에 사용될 key와 value를 Encoding하여 사용한다면 무리없이 ASP와 ASP.NET에서의 쿠키 정보를 공유할 수 있을 것 입니다.

출처 : http://turtledaddy.tistory.com/34
posted by 어린왕자악꿍