ASP.NET 환경에서 URL을 다룰 때 문자열의 안전한 전송을 위해 인코딩과 디코딩 작업이 필수적입니다. 특히 웹 폼 기반 애플리케이션에서는 HttpServerUtility와 HttpUtility 클래스가 제공하는 메서드들의 차이점을 명확히 이해해야 합니다.
핵심 클래스와 메서드 구조
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 기반 메서드를 고려하세요.