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

현재 참여하고 있는 프로젝트를 하면서 SSL을 적용하다 보니 로그인 처리에서 문제가 발생했습니다.

 

일반로그인 처리는 해당페이지의 비하인드코드에서 하면 되지만, SSL을 적용하려면 로그인 처리 페이지를 https://로 접근해야 합니다.

 

위와 같은 경우 Get방식으로 로그인정보를 보내어 처리하면 무리는 없지만

Post방식으로 할 경우 단순히 Form태그의 Action만 바꿔서는 안됩니다.

 

보통 aspx페이지에서는 자체 페이지마다 viewstate값을 가지고 있는 hidden 컨트롤이 있습니다.

 

<input type="hidden" name="__VIEWSTATE" value="dDw3NjMwDYbDxpP..." />

 

이 값을 post방식으로 해서 다른페이지에 보내는 경우 다음과 같은 에러가 발생합니다.

에러 내용을 보시면 알겠지만 machinekey 구성을 수정하라고 하는군요...

 

System.Web.HttpException: Authentication of viewstate failed. 

1) If this is a cluster, edit <machineKey> configuration so all servers use the same validationKey and validation algorithm.  AutoGenerate cannot be used in a cluster. 

2) Viewstate can only be posted back to the same page. 

3) The viewstate for this page might be corrupted. -

--> System.Web.HttpException: 데이터가 유효한지 확인할 수 없습니다.

 

수정하시기가 구찮으시다면.. 아래 소스코드 처럼 __VIEWSTATE의 값은 넘기지 않도록 합니다.

 

<SCRIPT language="javascript">
<!--
function LoginCheck( form )
{
   form.__VIEWSTATE.disabled = true;

   // post방식으로 현재페이지의 컨트롤값을 다른페이지로 그대로 넘기는 되는경우

   // aspx에서는 클라이언트에서 접근할수 있는 아이디값이 컴파일후 바뀐다는것을

   // 유념하셔야 합니다. 아래 처럼 별도의 hidden필드를 만들어서 입력한 값이나

   // 클라이언트 아이디를 넘겨서 다음 페이지에서 정상적으로 값을 받을수 있도록 합니다.
   form.Uid.value = idBox.value;
   form.Pwd.value = pwdBox.value;


   var submitUrl = "https://<%=Request.Url.Host%>/LoginProcess.aspx" ;

   form.action = submitUrl;


   form.submit();
   return true;
}
//-->
</SCRIPT>

출처 : http://blog.naver.com/tear230/100014257847

 
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패밀리

1. Get 방식

1) 작은 데이터를 전송하여 처리할 때 주로 사용(제한된 데이터양 ).
2) 브라우저 창에 해당 변수와 변수값을 출력.

 2. Post 방식

1) 입력값이 비교적 많은 데이터를 전송하고 처리할 때 사용(데이터에 제한이 없음).
2) 브라우저 창에 해당 변수와 변수값을 출력하지 않아, 보안적인 측면에서는 post 방식이 좀더 낫다고 할 수 있음. 


※ 주의

ASP.NET에서는 다른페이지로 GET방식을 이용해서 한글을 바로 넘겨 Request로 받으면 영문이나 숫자는 올바르게 보이지만 한글이 깨져서 보입니다. 

그럴때는 한글을 인코딩해서 넘기시는게 가장 간편한 방법입니다.
서버스크립트를 사용해서 넘길때는 HttpUtility.UrlEncode(string) 메소드를 이용하시면 되고,
자바스크립트에서 바로 넘겨서 사용하시려면 escape(string) 함수를 이용하시면 됩니다.

[Server Script]
Response.Redirect("GoodSite.aspx?name=" + HttpUtility.UrlEncode("다음"))

[Javascript]
location.href = "GoodSite.aspx?name=" + escape("다음포털");



Posted by SB패밀리