천객만래 [千客萬來] (It has an interminable succession of visitors)

인터넷 익스플로러에서 세션, 쿠키 공유하지 않기


IE 8의 경우는 session, cookie가 공유되는 현상이 있습니다.


이를 공유하지 않기 위해서는 아래와 같은 방법을 사용하면 됩니다.


레지스트리 설정

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main

SessionMering=0 (DWORD:32)

FrameMerging=0 (DWORD:32)


그 다음으로는 


C:\Program Files\Internet Explorer\iexplore.exe" -nomerge


위와 같은 파라메터 옵션을 추가합니다.






[출처] IE 8 쿠키 레셰어링|작성자 푸하하


Posted by SB패밀리

utf-8 방식을 추구하기 위해 원래는 코드비하인드에서 한글데이터값을 Server.UrlEncode 매서드를 사용해 인코딩해서 쿠키에 넣은후 자바스크립트에서 쿠키값을 읽어와 GET 방식으로 넘겨주려 했지만 GET방식으로 호출한 페이지에서 Server.UrlDecode 매서드를 사용해보았지만 한글데이터가 깨지는 이유로 부득이하게 Cookie가 아닌 Hidden 컨트롤을 사용하였다.

 web.config

utf-8 방식 사용

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />


 

A.cs

Hidden 컨트롤에 인코딩된 데이터를 넣는다.

hidRName.Value = Server.UrlEncode(m_strRname);  <- UrlEncode 매서드를 사용하면 한글데이터를 스크립트단에서 이진데이터로 표시되게 해준다. UrlEncode  매서드를 사용하면 주소창에 한글데이터를 이진데이터로 표시해서 넘겨주는 장점이 있는것 같다.

 

A.aspx

Hidden 컨트롤값을 변수에 담는다.

var vR_NAME = document.getElementById("hidRName").value;

var avs_URL = "B.aspx?R_NAME=" + vR_NAME ;

 

B.aspx 호출

 

B.cs

TextBox 값에 넘어온 파라미터값 셋팅

txtRName.Value = Server.UrlDecode(Request["R_NAME"]);

이렇게하면 UTF-8 방식일경우 한글데이터를 넘겨받을수 있다.  ( txtRName.Value = Request["R_NAME"];  <- 이방법도 가능함. )


 

 

원래 시도하였던 방식의 자바스크립트에서 쿠키값 가져오는 함수. 좀더 보강하면 Cookie 를 사용하더라도 한글데이터가 깨지지않게 넘겨받을수 있을거 같다. (해결방법 : js 파일내에서 escape() 함수를 사용하면 된다)

// *****************************************************
// 내용 : 쿠키값 가져오기
// 작성일자 : 2007.11.29
// 작성자 : 한재준
// name : Cookie Name
// *****************************************************
function getCookie( name )
{
    var tempArr = document.cookie.split("&");
    var nameOfCookie = name + "=";
    var x = 0;
    var y = (nameOfCookie.length);
    var returnValue = "";
   
    for(var i=0; i<tempArr.length; i++)
    {
        if(tempArr[i].substring( x, y ) == nameOfCookie)
        {
            endOfCookie = tempArr[i].length;
            returnValue = unescape(tempArr[i].substring( y, endOfCookie));
            break;
        }
    }
   
    return returnValue;
}

  

Tip !

위와 같은방식으로 UrlEncode 매서드와 HtmlEncode 매서드의 차이점을 확인하기 위해서 HtmlEncode 매서드를 사용해봤으나( hidRName.Value = Server.HtmlEncode(m_strRname); )  B.cs 페이지에서  HtmlDecode 매서드를 사용해 넘어온 파라미터값을 디코딩해보았지만 한글데이터가 깨지는것을 확인하였다.
 결론은 utf-8 방식에서는 한글데이터를 GET 방식으로 넘겨줄때는 항상 UrlEncode 매서드를 사용해야 한다는 것이다

Posted by SB패밀리

펌 - 데브피아

 한글이 포함된 URL로 이동하기 위해 애쓴 경험이 있어 이렇게 써 봅니다.
허접하지만, 도움이 되었으면 하네요~ ^-^;

고민은 했었지만 의외로 쉽게 해결했습니다.

한글이 들어있는 부분만 인코딩 해서 HttpWebRequest 객체에 연결을 했죠.

그냥 전체 URL을 인코딩 한 후 연결할 경우 '.'과 '/' 때문에 예외가 발생하더군요.

 

예) http://www.test.com/test/test.aspx?param1=이름&param2=주소&param3=전화번호

string url = "http://www.test.com/test/test.aspx?param1=이름&param2=주소&param3=전화번호";

int p = url.IndexOf('?');

string url = url.SubString( 0, p );

url = url + System.Web.HttpUtility.UrlEncode( url.SubString(p+1), System.Text.Encoding.GetEncoding("ks_c_5601-1987") );

HttpWebRequest req = (HttpWebRequest)WebRequest.Create( url );

 

너무 간단하죠? ^-^;;;;;

더 좋은 방법이 있을것도 같습니다만, 일단은 저렇게 해서 해결을 봤습니다.

퇴근시간이 임박해서..

다음에 시간나면, Cookie값을 HttpWebRequest에 연결하는 방법을 써보겠습니다

Posted by SB패밀리

현재 우리 회사 솔루션의 ASP.NET 웹 애플리케이션에는, 빈번하게 사용되는 개인 정보(혹은 설정값)을 담는 용도로 쿠키를 사용하고 있다. 쿠키는 사실 참 편리하다. 서버의 리소스를 점유하지도 않고, 만료기간만 지정해두면 서버가 다운되건 말건 계속 유지도 되고.. 서버사이드, 클라이언트 사이드 어디서나 쉽게 접속할 수 있기도 하고.

하지만, 솔루션에 대한 보안 감사 끝에.. 쿠키를 제거하기로 결정이 되었다. 사실 보안 측면에서 보자면 쿠키라는 것은 꽤 위험하다. 문제는 이 쿠키가 클라이언트에 저장되는 Plain Text파일인데다가, 모든 Web Server에 대한 Request/Response시에 전송이 된다는 것이다. 즉, 클라이언트에서 이 파일을 열어 볼 수도 있고, 네트워크 패킷을 스니핑해서 내용을 볼 수도 있다. 거기다가 위/변조하기도 당연히 쉽다. 또 일부 국가 - 어딘지는 잘 모른다 - 에서는 법적으로 쿠키를 금지하기도 하고, Internet Explorer등의 브라우저에서도 쿠키를 허용하지 않는 옵션을 장착하고 있기 때문에 어떤 사용자들의 경우 쿠키를 아예 사용할 수 없을 가능성도 있는 것이다.

서두가 장황했는데, 암튼 쿠키를 모두 제거하기로 하고 우리가 선택한 대안은 ASP.NET 세션이었다. 사실 빈번하게 사용되는 사용자 개인의 설정값등을 담아둘 수 있는 가장 이상적인 공간이기도 하고, 쿠키와 매우 유사하게 서버사이드에서 사용할 수도 있기 때문이었다. 하지만 이 ASP.NET 세션에는 한 가지 문제가 있다. 그 문제는 바로, 이 ASP.NET 세션이 기본적으로 쿠키를 사용한다는 것이다.

ASP.NET 세션을 사용하면 생성되는 쿠키는 이렇게 생겼다.

ASP.NET_SessionId=d1ucyg30qyjw1f554szadoqy;

즉, ASP.NET 세션에서 각 사용자를 구분하는 것 자체가 이 쿠키를 사용하는 것이다.

그런데, ASP.NET에는 Cookie-less Session이라고 해서, 쿠키를 사용하지 않고 세션을 사용할 수 있게 해주는 모드 또한 있다. 이것은 별도의 코딩이 필요한 것은 아니고 단지 Web.Config의 SessionState 부분에 Cookieless를 True로 바꿔주기만 하면 된다.

<sessionState
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
           
cookieless="true"
            timeout="20"
    />

이 Cookie-less Session에 대한 자세한 내용은 Dino Esposito씨의 다음 Article을 보면 알 수 있다.

위 아티클을 보면 알 수 있겠지만, 이 Cookieless Session은 세션을 쓰면서도 Cookie를 완전히 쓰지 않아도 된다는 점에서 나의 고민을 완벽하게 해주는 것이었다. 그러나 나는 몇 가지 문제를 발견했다..-_-;;

첫째로 이 Cookieless Session을 쓸 경우 모든 URL이 조금씩 바뀌게 된다는 것이다. 즉, 요청한 URL이 이렇다면..

http://localhost/CookielessSessionWebSample/Webform1.aspx

실제로 페이지가 열린 다음에는 이렇게 바뀌게 된다.

http://localhost/CookielessSessionWebSample/(mkwgif552tavi2vtxhgq1a45)/Webform1.aspx

위의 URL에 가운데 부분에 이상하게 끼어든 (mkwgif552tavi2vtxhgq1a45)이 바로 쿠키의 SessionID의 역할을 하는 것이다. 즉 쿠키를 쓰는 대신에 URL에 세션ID를 넣어서 사용한다고 생각하면 되겠다.

두번째로 바로 위 사실 때문에 몇가지 제약 사항이 발생한다. Server.Transfer와 Response.Redirect 등을 사용할 때, Root로부터 시작하는 URL 즉 이런 형태 - /RootDir/Somepage.aspx - 를 사용하지 못하며, Full URL - http://ServerName/RootDir/Somepage.aspx - 를 또한 사용하지 못한다. 이 사실은 EggHeadCafe라는 사이트의 한 게시물에서 알게 되었다.

첫번째 문제가 Accept된다면, 사실 대부분의 경우 큰 문제는 없을 것이다. 두번째처럼 만약 코딩을 했다는 것은, 사실 코딩 상에 문제가 있는 거라고 봐야 하니까. 그런데 내 경우는 우리 회사의 솔루션에 저런 것이 없다고 장담하기가 힘들었다는 것이다. 그래서, 우리 솔루션의 경우는 쿠키의 세션ID는 허용하는 방향으로 가기로 했다.

하지만, 쿠키를 완전히 사용할 수 없는 경우가 발생한다면, Cookie-less Session은 매우 좋은 선택이 될 것이다. 그리고 이 Cookie-less Session을 사용한다면 위에서 언급한 코딩상의 주의 사항은 반드시 지켜야 할 것이다.

출처 : http://lazydeveloper.net/2567069

Posted by SB패밀리