URL 재작성 모듈을 위한 재작성 규칙 작성하기

등록일시: 2008-07-02 15:20,  수정일시: 2013-11-16 23:08
조회수: 19,354
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

본문에서는 URL 재작성 모듈의 재작성 규칙을 몇 가지 생성해보고 테스트하는 방법을 살펴봅니다.

전제조건

본문은 다음과 같은 조건들을 전제로 합니다:

  1. ASP.NET 역할 서비스가 설치된 IIS 7.0
  2. URL 재작성 모듈 CTP 버전 설치 *

* URL 재작성 모듈을 다운로드 받을 수 있는 경로는 이전 번역 문서에 소개되었습니다.

테스트 웹 페이지 설정하기

먼저, URL 재작성 모듈이 어떻게 동작하는지 자세히 살펴보기 위한 용도로 사용될 간단한 테스트 ASP.NET 페이지를 작성할 것입니다. 이 페이지에서는 웹 서버 변수를 읽고 그 값을 브라우저에 출력합니다.

다음의 ASP.NET 코드를 복사해서 %SystemDrive%\inetpub\wwwroot\folder에 article.aspx라는 이름의 파일을 만들고 붙여 넣습니다: *

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>URL Rewrite Module Test</title>
</head>
<body>
    <h1>URL Rewrite Module Test Page</h1>
    <table>
        <tr>
            <th>Server Variable</th>
            <th>Value</th>
        </tr>
        <tr>
            <td>Original URL: </td>
            <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
        </tr>
        <tr>
            <td>Final URL: </td>
            <td>
                <%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>
            </td>
        </tr>
    </table>
</body>
</html>

파일을 생성했으면, 웹 브라우저로 http://localhost/article.aspx 파일에 접근해보고 결과가 정상적으로 출력되는지 페이지를 점검합니다.

* 이 코드를 살펴보면 "HTTP_X_ORIGINAL_URL"이라는 다소 생소한 이름의 서버 변수를 발견할 수 있습니다. 이 서버 변수는 사용자가 요청한 본래의 URL 값을 갖고 있으며 URL 재작성 모듈이 내부적으로 생성해 낸 것으로 보입니다.

재작성 규칙 생성하기

다음과 같은 형식으로 URL을 재작성하는 간단한 재작성 규칙을 생성해보겠습니다:

http://localhost/article/342/some-article-title

와 같은 형식의 URL을,

http://localhost/article.aspx?id=342&title=some-article-title

와 같은 형식의 URL로 재작성하게 됩니다.

이번에는 IIS 관리자의 URL 재작성 UI를 사용해서 재작성 규칙을 생성해보도록 하겠습니다. 다음의 단계들을 따라합니다:

  1. IIS 관리자를 실행합니다.
  2. "Default Web Site"를 선택합니다.
  3. "URL Rewrite Module"의 기능 보기를 클릭합니다.
  4. 우측의 "작업" 패인에서 "Add rule..." 링크 버튼을 클릭합니다.

이제 실제로 재작성 규칙을 만들어볼 차례입니다. URL 재작성 모듈의 재작성 규칙은 다음과 같은 네 가지 필수적인 정보를 지정함으로서 이뤄집니다:

  • 규칙 이름
  • URL 문자열과 매칭시켜 볼 패턴
  • 선택적인 추가적인 조건들
  • 패턴이 일치하고 모든 조건을 만족할 때 실행될 동작

규칙 이름 지정

이를테면, "article.aspx로 재작성"처럼 규칙을 식별할 수 있는 이름을 "Name" 텍스트 박스에 입력합니다.

패턴 정의

다음 문자열을 "Pattern" 텍스트 박스에 입력합니다: *

^article/([0-9]+)/([_0-9a-z-]+)

이 문자열은 다음과 같은 조건들을 만족하는 임의의 URL 문자열에 매칭시킬 패턴을 지정하는 정규 표현식입니다:

  1. "article/"라는 문자열로 시작됩니다. **
  2. 그리고, 첫 번째 "/" 문자 뒤에는 하나 이상의 숫자 문자들이 나타납니다.
  3. 마지막으로 두 번째 "/" 문자 뒤에는 하나 이상의 알파벳 문자나 "_" 또는 "-" 문자들이 나타납니다.

정규 표현식 중 일부 문자열이 소괄호로 둘러쌓여 있다는 점에 유의하십시오. 이 소괄호들은 잠시 뒤에 규칙내에서 역참조로 참조될 캡춰 그룹을 생성합니다.

동작 정의

이 규칙은 URL 재작성을 전제로 하고 있으므로 "Action" 그룹 박스에서 "Rewrite" 동작 유형을 선택합니다. 그리고, "Rewrite URL:" 텍스트 박스에 다음 문자열을 입력합니다:

article.aspx?id={R:1}&title={R:2}

이 문자열은 원본 URL이 재작성될 새로운 형태의 URL 형식을 지정합니다. 쿼리스트링의 파라메터 값으로 사용된 {R:1}과 {R:2}에 주의하십시오. 이 값들은 규칙 패턴에서 소괄호를 사용해서 정의했던 캡춰 그룹들에 대한 역참조입니다. ***

그 밖의 다른 설정들은 기본값을 그대로 사용합니다. 이제 "Edit Rule" 속성 페이지는 다음과 같은 모습을 하고 있을 것입니다:

마지막으로 우측에 위치한 "Apply" 링크 버튼을 클릭해서 규칙을 저장합니다.

구성 설정 파일에서 재작성 규칙 살펴보기

재작성 규칙은 aplicationHost.config 파일이나 web.config 파일에 저장됩니다. 생성된 규칙의 구성 설정을 확인해보려면 %SystemDrive%\inetput\wwwroot\ 폴더에 존재하는 web.config 파일을 열어보면 됩니다. 이 파일에 규칙의 정의가 기록되어 있는 <rewrite> 섹션이 존재하는 것을 확인할 수 있습니다:

<rewrite>
  <rules>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

규칙 테스트

규칙이 정상적으로 URL 재작성을 수행하는지 테스트해보려면 웹 브라우저를 실행하고 다음과 같은 URL을 입력해봅니다:

http://localhost/article/234/some-title

그러면, 원본 URL이 웹 서버에서 재작성 규칙에 의해 처리되어 쿼리스트링 값, "234"와 "some-title"을 전달받는 article.aspx로 변경되는 것을 확인할 수 있습니다.

* 본문을 올바르게 이해하려면 이 패턴에서 알 수 있는 것처럼 정규 표현식에 대한 이해가 먼저 선행되어야 합니다.

** 전체 URL 문자열에서 도메인에 해당하는 부분이 포함되지 않는다는 점에 주의하시기 바랍니다.

*** 역참조의 인덱스가 0이 아닌 1부터 시작한다는 점도 주의하시기 바랍니다.

재전송 규칙 생성하기

이번에는 다음과 같은 형식의 재전송 규칙을 생성해보겠습니다: *

http://localhost/blog/some-other-title/543

와 같은 형식의 URL을,

http://localhost/article/543/some-other-title

와 같은 형식의 URL로 재전송합니다.

다시 IIS 관리자에서 URL 재작성 기능 보기를 열고 "Add Rule..." 링크 버튼을 클릭합니다. 그리고, "Edit Rule" 페이지에 다음과 같이 입력합니다:

  • Name: "블로그로부터 재전송"
    재전송 규칙의 유일한 이름을 지정합니다.
  • Pattern: "^blog/([_0-9a-z-]+)/([0-9]+)"
    이 패턴은 blog로 시작하는 URL 문자열을 찾아서 / 문자를 기준으로 URL의 두 번째 부분과 세 번째 부분을 역참조를 위해서 캡춰합니다.
  • Action: "Redirect"
    재전송 동작은 웹 브라우저로 재전송 응답을 전송합니다.
  • Redirect URL: "article/{R:2}/{R:1}"
    이 대체 문자열은 원본 URL이 재전송될 새로운 재전송 URL을 구성하기 위해 사용됩니다. 이 대체 문자열에서 패턴 매칭시 캡춰된 원본 URL의 일부분이 역참조로 재배열되어 사용된다는 점에 주의하십시오.

그 밖의 다른 설정들은 기본값을 그대로 사용합니다. 이제 "Edit Rule" 속성 페이지는 다음과 같은 모습을 하고 있을 것입니다:

마지막으로 우측에 위치한 "Apply" 링크 버튼을 클릭해서 규칙을 저장합니다.

규칙 테스트

규칙이 정상적으로 URL 재전송을 수행하는지 테스트해보려면 웹 브라우저를 실행하고 다음과 같은 URL을 입력해봅니다:

http://localhost/blog/some-other-title/323

그러면, 먼저 재전송 규칙이 수행되어 URL이 http://localhost/article/323/some-other-title로 재전송되고, 다시 본문의 첫 부분에서 작성했던 재작성 규칙이 수행되어 그에 대응하는 URL로 재작성되는 것을 확인할 수 있습니다: *

* 본문에서 말하는 재작성(Rewrite)과 재전송(Redirect)이라는 용어의 차이점에 주의하시기 바랍니다. 재작성은 웹 브라우저 측에는 전혀 영향 없이 웹 서버 내부적으로만 응답 컨텐츠가 변경되는 것을 의미하는 반면, 재전송은 웹 브라우저 측의 URL 자체가 변경되는 결과를 가져옵니다. 재작성은 Server.Transfer 메서드와 비슷하고 재전송은 Response.Redirect와 비슷하다고 이해하면 큰 무리가 없을 것입니다.

** 이 캡춰 화면의 테스트 결과는 재전송 규칙만 적용된 상태가 아니라는 점에 주의하시기 바랍니다. 이 두 번째 테스트 자체는 재전송 규칙에 관한 테스트이기는 하지만, 재전송 규칙에 의해 실행된 재전송 결과 URL이 본문의 첫 부분에서 작성했던 재작성 규칙의 패턴과 다시 매칭됩니다. 결과적으로 재전송 규칙의 수행 결과에 더해서 재작성 규칙이 한 번 더 적용되고, 위의 캡춰화면은 바로 그 최종 결과인 것입니다.

접근 금지 규칙 생성하기

마지막으로 생성해 볼 규칙은 웹 사이트에 대한 모든 요청들 중에서 호스트 헤더값이 만족스럽지 않은 경우, 해당 요청을 봉쇄하기 위한 규칙입니다. 이런 종류의 규칙은 호스트 이름 대신 서버의 IP 주소를 사용해서 HTTP 요청을 생성하는 유형의 해킹 시도를 막고자 할 때 유용합니다.

이번에는 IIS 관리자를 사용하지 않고 직접 규칙을 생성해보겠습니다. Web.config 파일을 열고 <rewrite> 섹션을 찾습니다. 그리고, 다음과 같은 규칙을 추가합니다:

<rule name="Fail bad requests">
  <match url=".*"/>
  <conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
  </conditions>
  <action type="AbortRequest" />
</rule>

이 새로운 규칙을 <rules> 컬렉션의 가장 첫 번째 규칙으로 추가합니다. 이제 <rewrite> 섹션은 다음과 같은 모습을 보일 것입니다:

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url=".*"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Redirect from blog">
      <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
      <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
    </rule>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

그러면, 이 규칙이 수행하는 작업을 이해하기 위해서 차례대로 분석해보도록 하겠습니다.

  • <match url="."/>
    이 항목은 이 규칙이 모든 URL 문자열을 대상으로 동작하도록 지시합니다.
  • <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
    이 항목은 HTTP_HOST 서버 변수를 읽어서 호스트 헤더값을 가져온 다음, "localhost" 패턴과 일치하는지 검사하고, 만약 일치한다면 매칭 결과를 무효화하는 조건을 추가합니다. 즉, 이 조건은 호스트 헤더가 "localhost"와 일치하지 않는지 검사합니다.
  • <action type="AbortRequest" />
    이 항목은 URL 재작성 모듈에게 HTTP 요청을 종료할 것을 지시합니다.

규칙 테스트

이 규칙을 테스트해보려면 웹 브라우저를 실행하고 주소창에 http://127.0.0.1/article/234/some-title을 입력해봅니다. 그러면, 웹 브라우저에 서버로부터 아무런 응답도 받지 못했다는 결과가 나타날 것입니다. 반면, 주소창에 http://localhost/article/234/some-title을 입력해보면 웹 서버가 정상적으로 응답하는 것을 볼 수 있습니다.

요약

본문에서는 IIS 관리자를 사용하거나 수작업으로 web.config 파일을 편집해서 URL 재작성 규칙을 생성하는 방법을 살펴봤습니다. 직접 규칙들을 생성해보면서 정규 표현식 지원, 다양한 형태의 동작, 재작성 의사 결정을 위해 HTTP 헤더나 서버 변수를 활용하는 방법 등 몇 가지 중요한 기능들을 알아봤습니다.