다음을 통해 공유


System.Uri 클래스

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

URI는 인트라넷 또는 인터넷에서 애플리케이션에서 사용할 수 있는 리소스의 압축 표현입니다. 클래스는 Uri 구문 분석, 비교 및 결합을 포함하여 URI를 처리하기 위한 속성과 메서드를 정의합니다. 클래스 속성은 Uri 읽기 전용입니다. 수정 가능한 개체를 만들려면 클래스를 UriBuilder 사용합니다.

상대 URI(예: "/new/index.htm")는 절대 URI가 되도록 기본 URI와 관련하여 확장해야 합니다. MakeRelativeUri 필요한 경우 절대 URI를 상대 URI로 변환하기 위해 메서드가 제공됩니다.

문자열이 Uri 스키마 식별자를 포함하는 올바른 형식의 URI인 경우 생성자는 URI 문자열을 이스케이프하지 않습니다.

이 속성은 Uri 이스케이프된 인코딩에서 정식 데이터 표현을 반환하며, 유니코드 값이 127보다 큰 모든 문자는 해당 16진수로 바뀝니다. URI를 정식 형식 Uri 으로 배치하기 위해 생성자는 다음 단계를 수행합니다.

  • URI 구성표를 소문자로 변환합니다.

  • 호스트 이름을 소문자로 변환합니다.

  • 호스트 이름이 IPv6 주소인 경우 정식 IPv6 주소가 사용됩니다. ScopeId 및 기타 선택적 IPv6 데이터가 제거됩니다.

  • 기본 포트 번호와 빈 포트 번호를 제거합니다.

  • file:// 체계가 없는 암시적 파일 경로(예: "C:\my\file")를 file:// 체계를 사용하여 명시적 파일 경로로 변환합니다.

  • 예약된 용도가 없는 이스케이프된 문자(백분율로 인코딩된 8진수라고도 함)는 디코딩됩니다(이스케이프되지 않음이라고도 함). 이러한 예약되지 않은 문자에는 대문자와 소문자(%41-%5A 및 %61-%7A), 소수 자릿수(%30-%39), 하이픈(%2D), 마침표(%2E), 밑줄(%5F), 타일드(%7E)가 포함됩니다.

  • /./, /.와 같은 시퀀스를 압축하여 계층적 URI에 대한 경로를 정식화합니다. /, 및 //(시퀀스가 이스케이프되는지 여부). 이러한 시퀀스가 압축되지 않는 몇 가지 구성표가 있습니다.

  • 계층적 URI의 경우 호스트가 슬래시(/)로 종료되지 않으면 URI가 추가됩니다.

  • 기본적으로 URI의 예약 문자는 RFC 2396에 따라 이스케이프됩니다. 이 동작은 RFC 3986 및 RFC 3987에 따라 URI의 예약 문자가 이스케이프되는 경우 국제 자원 식별자 또는 국제 Do기본 이름 구문 분석이 사용하도록 설정된 경우 변경됩니다.

일부 구성표에 대한 생성자의 정식화의 일부로 점 세그먼트 및 빈 세그먼트(/.//..///)가 압축됩니다(즉, 제거됨). 세그먼트를 압축하는 Uri 구성표에는 http, https, tcp, net.pipe 및 net.tcp가 포함됩니다. 다른 구성표의 경우 이러한 시퀀스는 압축되지 않습니다. 다음 코드 조각은 압축이 실제로 어떻게 보이는지 보여줍니다. 이스케이프된 시퀀스는 필요한 경우 이스케이프되지 않고 압축됩니다.

var uri = new Uri("http://myUrl/../.."); // http scheme, unescaped
OR
var uri = new Uri("http://myUrl/%2E%2E/%2E%2E"); // http scheme, escaped
OR
var uri = new Uri("ftp://myUrl/../.."); // ftp scheme, unescaped
OR
var uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E"); // ftp scheme, escaped

Console.WriteLine($"AbsoluteUri: {uri.AbsoluteUri}");
Console.WriteLine($"PathAndQuery: {uri.PathAndQuery}");

이 코드가 실행되면 다음 텍스트와 유사한 출력을 반환합니다.

AbsoluteUri: http://myurl/
PathAndQuery: /

메서드를 Uri 사용하여 이스케이프 인코딩된 URI 참조에서 읽기 가능한 URI 참조로 클래스의 ToString 내용을 변환할 수 있습니다. 일부 예약된 문자는 메서드의 ToString 출력에서 계속 이스케이프될 수 있습니다. 이는 반환 ToString된 값에서 URI의 명확한 재구성을 지원하기 위한 것입니다.

일부 URI에는 조각 식별자 또는 쿼리 또는 둘 다 포함됩니다. 조각 식별자는 숫자 기호를 포함하지 않고 숫자 기호(#)를 따르는 텍스트입니다. 조각 텍스트가 속성에 Fragment 저장됩니다. 쿼리 정보는 URI의 물음표(?)를 따르는 텍스트입니다. 쿼리 텍스트는 속성에 Query 저장됩니다.

참고 항목

URI 클래스는 IPv4 프로토콜에 대한 쿼드 표기법과 IPv6 프로토콜의 콜론-16진수 모두에서 IP 주소 사용을 지원합니다. http://[::1]에서와 같이 IPv6 주소를 대괄호로 묶는 것을 잊지 마세요.

국가별 리소스 식별자 지원

웹 주소는 일반적으로 매우 제한된 문자 집합으로 구성된 균일한 리소스 식별자를 사용하여 표현됩니다.

  • 영문자의 대문자 및 소문자 ASCII 문자.
  • 0~9의 숫자.
  • 일부 기타 ASCII 기호.

URI 사양은 IETF(인터넷 엔지니어링 태스크 포스)에서 게시한 RFC 2396, RFC 2732, RFC 3986 및 RFC 3987에 설명되어 있습니다.

영어 이외의 언어를 사용하여 리소스를 식별하고 비 ASCII 문자(유니코드/ISO 10646 문자 집합의 문자)를 허용하는 식별자를 URI(International Resource Identifier)라고 합니다. IRI 사양은 IETF에서 게시한 RFC 3987에 설명되어 있습니다. IRI를 사용하면 URL에 유니코드 문자를 포함할 수 있습니다.

.NET Framework 4.5 이상 버전에서는 IRI가 항상 사용하도록 설정되어 있으며 구성 옵션을 사용하여 변경할 수 없습니다. machine.config 또는 app.config 파일에서 구성 옵션을 설정하여 do기본 이름에 IDN(Internationalized Do기본 Name) 구문 분석을 적용할지 여부를 지정할 수 있습니다. 예시:

<configuration>
  <uri>
    <idn enabled="All" />
  </uri>
</configuration>

IDN을 사용하도록 설정하면 do기본 이름의 모든 유니코드 레이블이 해당하는 Punycode로 변환됩니다. Punycode 이름에는 ASCII 문자만 사용되며 항상 xn-- 접두사로 시작합니다. 대부분의 DNS 서버는 ASCII 문자만 지원하므로(RFC 3940 참조) 이렇게 해야 인터넷에서 기존 DNS 서버를 지원할 수 있습니다.

IDN을 사용하도록 설정하면 속성 값에 영향을 줍니다 Uri.DnsSafeHost . IDN을 사용하도록 설정하면 , OriginalStringGetComponentsIsWellFormedOriginalString 메서드의 Equals동작도 변경할 수 있습니다.

사용되는 DNS 서버에 따라 IDN에 사용할 수 있는 세 가지 값이 있습니다.

  • idn enabled = All

    이 값은 유니코드 do기본 이름을 IDN 이름(Punycode 등가물)으로 변환합니다.

  • idn enabled = AllExceptIntranet

    이 값은 로컬 인트라넷에 없는 모든 유니코드 도메인 이름을 변환하여 IDN 이름(Punycode 등가물)을 사용합니다. 이 경우 로컬 인트라넷에 있는 국가별 이름을 처리하기 위해 인트라넷에 사용되는 DNS 서버가 유니코드 이름 확인을 지원해야 합니다.

  • idn enabled = None

    이 값은 Punycode를 사용하도록 유니코드 do기본 이름을 변환하지 않습니다. 기본값입니다.

정규화 및 문자 검사 RFC 3986 및 RFC 3987의 최신 IRI 규칙에 따라 수행됩니다.

클래스의 Uri IRI 및 IDN 처리는 , System.Configuration.IdnElementSystem.Configuration.UriSection 구성 설정 클래스를 System.Configuration.IriParsingElement사용하여 제어할 수도 있습니다. System.Configuration.IriParsingElement 설정은 Uri 클래스에서 IRI 처리를 사용하거나 사용하지 않도록 설정합니다. System.Configuration.IdnElement 설정은 Uri 클래스에서 IDN 처리를 사용하거나 사용하지 않도록 설정합니다.

첫 번째 System.Uri 클래스가 System.Configuration.IriParsingElementSystem.Configuration.IdnElement 생성될 때 한 번 읽는 구성 설정입니다. 해당 시점 후의 구성 설정 변경 내용은 무시됩니다.

또한 System.GenericUriParser 클래스는 IRI 및 IDN을 지원하는 사용자 지정 가능한 파서를 만들 수 있도록 확장되었습니다. System.GenericUriParser 개체의 동작은 System.GenericUriParserOptions 열거형에서 사용 가능한 값의 비트 조합을 System.GenericUriParser 생성자에 전달하여 지정합니다. GenericUriParserOptions.IriParsing 형식은 파서가 RFC 3987에 지정된 IRI(International Resource Identifier)에 대한 구문 분석 규칙을 지원함을 나타냅니다.

이 형식은 GenericUriParserOptions.Idn 파서가 호스트 이름의 IDN(Internationalized Do기본 Name) 구문 분석을 지원한다는 것을 나타냅니다. .NET 5 이상 버전(.NET Core 포함) 및 .NET Framework 4.5 이상에서는 항상 IDN이 사용됩니다. 이전 버전에서 구성 옵션은 IDN이 사용되는지 여부를 결정합니다.

암시적 파일 경로 지원

Uri 를 사용하여 로컬 파일 시스템 경로를 나타낼 수도 있습니다. 이러한 경로는 file:// 스키마로 시작하는 URI에서 명시적으로 표시될 수 있으며 file:// 체계가 없는 URI에서 암시적으로 나타낼 수 있습니다. 구체적인 예로, 다음 두 URI는 모두 유효하며 동일한 파일 경로를 나타냅니다.

Uri uri1 = new Uri("C:/test/path/file.txt") // Implicit file path.
Uri uri2 = new Uri("file:///C:/test/path/file.txt") // Explicit file path.

이러한 암시적 파일 경로는 URI 사양을 준수하지 않으므로 가능하면 피해야 합니다. Unix 기반 시스템에서 .NET Core를 사용하는 경우 절대 암시적 파일 경로가 상대 경로와 구별할 수 없으므로 암시적 파일 경로가 특히 문제가 될 수 있습니다 . 이러한 모호성이 있는 Uri 경우 기본적으로 경로를 절대 URI로 해석합니다.

보안 고려 사항

보안 문제로 인해 애플리케이션은 신뢰할 수 없는 원본에서 인스턴스를 수락하고 UridontEscape 생성자에 설정된 true상태에서 주의해야 합니다. 메서드를 호출하여 유효성을 위해 URI 문자열을 IsWellFormedOriginalString 검사 수 있습니다.

신뢰할 수 없는 사용자 입력을 처리할 때 속성을 신뢰하기 전에 새로 만든 Uri 인스턴스에 대한 가정을 확인합니다. 이 작업은 다음과 같은 방법으로 수행할 수 있습니다.

string userInput = ...;

Uri baseUri = new Uri("https://myWebsite/files/");

if (!Uri.TryCreate(baseUri, userInput, out Uri newUri))
{
    // Fail: invalid input.
}

if (!baseUri.IsBaseOf(newUri))
{
    // Fail: the Uri base has been modified - the created Uri is not rooted in the original directory.
}

이 유효성 검사는 단순히 다음을 변경 baseUri하여 UNC 경로를 처리할 때와 같은 다른 경우에 사용할 수 있습니다.

Uri baseUri = new Uri(@"\\host\share\some\directory\name\");

성능 고려 사항

URI가 포함된 Web.config파일을 사용하여 애플리케이션을 초기화하는 경우 스키마 식별자가 비표준인 경우 URI를 처리하는 데 추가 시간이 필요합니다. 이러한 경우 시작 때가 아니라 Uri가 필요할 때 애플리케이션의 영향을 받는 파트를 초기화 합니다.