비고
이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.
URI(Uniform Resource Identifier)는 인트라넷 또는 인터넷에서 애플리케이션에서 사용할 수 있는 리소스의 압축 표현입니다. 클래스는 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:// 체계를 사용하여 명시적 파일 경로로 변환합니다.
- 예약된 용도가 없는 이스케이프된 문자(백분율로 인코딩된 옥텟이라고도 함)는 디코딩됩니다(언이스케이프라고도 함). 이러한 예약되지 않은 문자에는 대문자와 소문자(%41-%5A 및 %61-%7A), 10진수(%30-%39), 하이픈(%2D), 마침표(%2E), 밑줄(%5F), 타일드(%7E)가 포함됩니다.
- 계층 URI의 경로를 표준화하여
/./및/../과 같은 시퀀스를 이스케이프 여부에 관계없이 압축합니다. 이러한 시퀀스가 압축되지 않는 몇 가지 구성표가 있습니다. - 계층적 URI의 경우 호스트가 슬래시(/)로 종료되지 않으면 URI가 추가됩니다.
- 기본적으로 URI의 예약 문자는 RFC 2396에 따라 이스케이프됩니다. 이 동작은 RFC 3986 및 RFC 3987에 따라 URI의 예약 문자가 이스케이프되는 경우 국가별 리소스 식별자 또는 국제 도메인 이름 구문 분석이 사용하도록 설정된 경우 변경됩니다.
일부 구성표에 대한 생성자의 정식화의 일부로 점 세그먼트(/./ 및 /../)가 압축됩니다(즉, 제거됨). 세그먼트를 압축하는 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 주소를 대괄호로 묶는 것을 잊지 마세요.
국가별 리소스 식별자 지원
웹 주소는 일반적으로 매우 제한된 문자 집합으로 구성된 URI를 사용하여 표현됩니다.
- 영어 알파벳의 대문자 및 소문자 ASCII 문자입니다.
- 0에서 9까지의 숫자입니다.
- 소수의 다른 ASCII 기호입니다.
URI 사양은 IETF(인터넷 엔지니어링 태스크 포스)에서 게시한 RFC 2396, RFC 2732, RFC 3986 및 RFC 3987에 설명되어 있습니다.
영어 이외의 언어를 사용하여 리소스를 식별하고 비 ASCII 문자(유니코드/ISO 10646 문자 집합의 문자)를 허용하는 식별자를 URI(International Resource Identifier)라고 합니다. IRIs의 사양은 IETF에서 게시한 RFC 3987에 문서화되어 있습니다. IRIs를 사용하면 URL에 유니코드 문자가 포함될 수 있습니다.
.NET Framework 4.5 이상 버전에서는 IRI가 항상 사용하도록 설정되어 있으며 구성 옵션을 사용하여 변경할 수 없습니다. machine.config 또는 app.config 파일에서 구성 옵션을 설정하여 IDN(Internationalized Domain Name) 구문 분석을 도메인 이름에 적용할지 여부를 지정할 수 있습니다. 다음은 그 예입니다.
<configuration>
<uri>
<idn enabled="All" />
</uri>
</configuration>
IDN을 사용하도록 설정하면 도메인 이름의 모든 유니코드 레이블이 해당하는 Punycode 레이블로 변환됩니다. Punycode 이름은 ASCII 문자만 포함하며 항상 xn-- 접두사로 시작합니다. 대부분의 DNS 서버는 ASCII 문자만 지원하므로 인터넷에서 기존 DNS 서버를 지원하기 때문입니다(RFC 3940 참조).
IDN을 사용하도록 설정하면 속성 값에 영향을 줍니다 Uri.DnsSafeHost . IDN을 사용하도록 설정하면 Equals, OriginalString, GetComponents, 및 IsWellFormedOriginalString 메서드의 동작도 변경할 수 있습니다.
사용되는 DNS 서버에 따라 IDN에 대한 세 가지 가능한 값이 있습니다.
IDN 활성화됨 = 모두
유니코드 도메인 이름을 해당하는 Punycode(IDN 이름)로 변환합니다.
idn 활성화됨 = 내부 네트워크 제외 모두
로컬 인트라넷에 없는 모든 유니코드 도메인 이름을 변환하여 IDN 이름(Punycode 등가물)을 사용합니다. 이 경우 로컬 인트라넷에서 국가별 이름을 처리하려면 인트라넷에 사용되는 DNS 서버가 유니코드 이름 확인을 지원해야 합니다.
idn 활성화 상태 = 없음
Punycode를 사용하도록 변환된 유니코드 도메인 이름은 없습니다. 기본값입니다.
정규화 및 문자 검사는 RFC 3986 및 RFC 3987의 최신 IRI 규칙에 따라 수행됩니다.
Uri 클래스에서 IRI 및 IDN 처리는 System.Configuration.IriParsingElement, System.Configuration.IdnElement, System.Configuration.UriSection 구성 설정 클래스들을 사용하여 제어할 수 있습니다. 이 설정은 System.Configuration.IriParsingElement 클래스에서 Uri IRI 처리를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 System.Configuration.IdnElement 클래스에서 Uri IDN 처리를 사용하거나 사용하지 않도록 설정합니다.
첫 번째 System.Configuration.IriParsingElement 클래스가 생성될 때, System.Configuration.IdnElement 및 System.Uri에 대한 구성 설정이 한 번 읽힙니다. 해당 시간 이후의 구성 설정 변경 내용은 무시됩니다.
System.GenericUriParser 또한 IRI 및 IDN을 지원하는 사용자 지정 가능한 파서 만들기를 허용하도록 클래스가 확장되었습니다. System.GenericUriParser 개체의 동작은 System.GenericUriParserOptions 열거형에서 사용할 수 있는 값들을 비트 조합으로 하여 System.GenericUriParser 생성자에 전달함으로써 지정됩니다. 이 형식은 GenericUriParserOptions.IriParsing 파서가 RFC 3987 for International Resource Identifiers(IRI)에 지정된 구문 분석 규칙을 지원했음을 나타냅니다.
이 형식은 GenericUriParserOptions.Idn 파서가 호스트 이름의 IDN(Internationalized Domain 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로 해석합니다.
보안 고려 사항
보안상의 이유로 애플리케이션은 신뢰할 수 없는 원본에서 Uri 인스턴스를 수락할 때 주의해야 하며, dontEscape가 true로 설정된 상태에서 생성자와 함께 사용해야 합니다. 메서드를 호출 IsWellFormedOriginalString 하여 URI 문자열의 유효성을 확인할 수 있습니다.
신뢰할 수 없는 사용자 입력을 처리할 때 속성을 신뢰하기 전에 새로 만든 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\");
디자인 및 보안 고려 사항에 UriUriBuilder대한 자세한 내용은 다음 위협 모델 문서를 검토하세요.
성능 고려 사항
URI가 포함된 Web.config 파일을 사용하여 애플리케이션을 초기화하는 경우 스키마 식별자가 비표준인 경우 URI를 처리하는 데 추가 시간이 필요합니다. 이러한 경우 시작 시간이 아닌 URI가 필요할 때 애플리케이션의 영향을 받는 부분을 초기화합니다.
.NET