C#에서 URL 인코딩과 디코딩 메서드 비교 분석

ASP.NET 환경에서 URL을 다룰 때 문자열의 안전한 전송을 위해 인코딩과 디코딩 작업이 필수적입니다. 특히 웹 폼 기반 애플리케이션에서는 HttpServerUtilityHttpUtility 클래스가 제공하는 메서드들의 차이점을 명확히 이해해야 합니다.

핵심 클래스와 메서드 구조

URL 인코딩 관련 기능은 두 가지 주요 경로로 제공됩니다. 하나는 ASP.NET 페이지의 Server 속성을 통한 접근이며, 다른 하나는 System.Web 네임스페이스의 유틸리티 클래스 직접 호출입니다.

인코딩 메서드: HttpServerUtility.UrlEncode

HttpServerUtility.UrlEncode는 웹 페이지 컨텍스트 내에서 즉시 사용할 수 있는 메서드입니다. 내부적으로는 HttpUtility.UrlEncode를 래핑하여 동일한 기능을 수행합니다.

// 페이지 클래스 내부에서 사용
string 사용자입력 = "파일명: 보고서 & 통계.xlsx";
string 안전한문자열 = Server.UrlEncode(사용자입력);
// 결과: "파일명%3a%20%eb%b3%b4%ea%b3%a0%ec%84%9c%20%26%20%ed%86%b5%ea%b3%84.xlsx"

이 메서드의 핵심 특징은 다음과 같습니다:

  • 현재 요청의 응답 인코딩 설정을 자동으로 참조
  • ASCII가 아닌 문자(한글, 일본어 등)를 UTF-8 바이트 시퀀스로 변환
  • RFC 3986 규격에 따라 예약 문자를 퍼센트 인코딩 처리

디코딩 메서드: HttpUtility.UrlDecode

반대로 수신 측에서는 HttpUtility.UrlDecode를 활용해 원본 문자열을 복원합니다. 이 메서드는 인코딩 과정의 역연산을 수행합니다.

// 쿼리스트링에서 값 추출 후 디코딩
string 수신값 = Request.QueryString["document"];
string 복원된값 = HttpUtility.UrlDecode(수신값);
// 결과: "파일명: 보고서 & 통계.xlsx"

실제 활용 시나리오

다음은 페이지 간 복잡한 데이터를 전달하는 완전한 흐름 예시입니다.

송신 측 구현

protected void 전송버튼_클릭(object 발신자, EventArgs 이벤트인자)
{
    var 검색조건 = new 
    {
        키워드 = "C# & ASP.NET",
        범위 = "2024-01-01 ~ 2024-12-31",
        필터 = "상태=완료"
    };
    
    string 직렬화데이터 = $"{검색조건.키워드}|{검색조건.범위}|{검색조건.필터}";
    string 인코딩결과 = Server.UrlEncode(직렬화데이터);
    
    Response.Redirect($"결과페이지.aspx?q={인코딩결과}");
}

수신 측 구현

protected void Page_Load(object 발신자, EventArgs 이벤트인자)
{
    if (!IsPostBack && Request.QueryString["q"] != null)
    {
        string 인코딩된쿼리 = Request.QueryString["q"];
        string 복원된문자열 = HttpUtility.UrlDecode(인코딩된쿼리);
        
        var 세그먼트 = 복원된문자열.Split('|');
        var 해석결과 = new
        {
            키워드 = 세그먼트[0],
            범위 = 세그먼트[1],
            필터 = 세그먼트[2]
        };
    }
}

대안적 접근 방식

특정 상황에서는 System.Uri 클래스의 정적 메서드들이 더 적합할 수 있습니다.

메서드 적합한 사용 맥락 주의사항
Uri.EscapeDataString 쿼리스트링 값 부분만 인코딩 전체 URL이 아닌 데이터 부분에만 적용
Uri.EscapeUriString 전체 URI의 시각적 안정성 확보 예약 문자의 일부를 보존
Uri.UnescapeDataString EscapeDataString의 역연산 잘된 형식 시 FormatException 발생
// Uri 클래스 활용 예시
string 원본데이터 = "제품명: 노트북/데스크톱";
string escape처리 = Uri.EscapeDataString(원본데이터);
// 결과: "%EC%A0%9C%ED%92%88%EB%AA%85%3A%20%EB%85%B8%ED%8A%B8%EB%B6%81%2F%EB%8D%B0%EC%8A%A4%ED%81%AC%ED%86%B1"

string unescape복원 = Uri.UnescapeDataString(escape처리);

주요 고려사항

인코딩 일관성: 송신과 수신 측이 동일한 문자 인코딩(권장: UTF-8)을 사용해야 합니다. HttpUtility.UrlDecode의 오버로드 중 하나로 명시적 인코딩 지정이 가능합니다.

// 명시적 인코딩 지정
byte[] 바이트배열 = Convert.FromBase64String(인코딩된값);
string 수동디코딩 = HttpUtility.UrlDecode(바이트배열, Encoding.UTF8);

보안 측면: URL 디코딩 후에도 출력 전에 적절한 HTML 인코딩(HttpUtility.HtmlEncode)을 적용해야 XSS 공격을 방지할 수 있습니다.

성능 최적화: 대량의 인코딩/디코딩 작업이 필요한 경우 StringBuilder와 결합하거나, ASP.NET Core 환경에서는 WebUtility 클래스의 Span 기반 메서드를 고려하세요.

태그: C# ASP.NET URL Encoding HttpUtility HttpServerUtility

6월 8일 03:41에 게시됨