우리가 주로 사용하는 웹 사이트의 주소를 말할 때는 URL이라는 표현을 많이 쓴다. 그러나 개발 쪽 학습을 진행하다 보면 URI와 혼용하여 사용하기 때문에 개념적으로 헷갈리때가 많다. 이번 기회에 두 가지 개념을 정리해 보도록 하자.
URI (Uniform Resource Identifier)
URI는 Uniform Resource Identifier의 약자로, 한국어로는 '통합 자원 식별자'라고 한다.
- Uniform은 리소스를 식별하는 통일된 방식을 의미한다.
- Resource란, URI 로 식별이 가능한 모든 종류의 자원를 의미하며, 웹 브라우저의 파일뿐 아니라 정보(일기예보, 교통정보 등), 서비스와 같이 웹에서 사용되는 모든 자원을 지칭한다.
- Identifier는 다른 항목과 구분하기 위해 필요한 정보이다.
즉, URI는 인터넷상에서의 리소스를 고유하게 식별하고, 위치를 지정하는 문자열 시퀀스이다.
URI에는 두 가지 형태가 있는데 이것이 URL과 URN이다.
URL(Uniform Resource Locator)
URL은 Uniform Resource Locator의 약자이며, 한국어로는 통합 지원 지시자라고 한다. Locator로 표현되는 것처럼 URL은 네트워크상에서 통합자원(리소스)의 "위치"를 나타내기 위한 문자열(규약)이다.
즉, URL은 웹 사이트의 주소 + 컴퓨터 네트워크 상의 자원(리소스)을 모두 나타내는 표기법이다.
특정 웹 페이지의 주소에 접속하기 위해서는 웹 사이트의 주소뿐만 아니라 프로토콜(https, http, sftp, smp 등)을 함께 알아야 접속이 가능한데, 이들을 모두 나타 내는 것이 URL이다.
URL 표기법
URL 스킴의 문법은 일반적으로 아래와 같이 총 9개 컴포넌트로 나뉜다.
<scheme>://<user>:<password>@<host>:<port>/<path>?<query>#<fragment>
스킴(Scheme)
리소스에 접근하기 위해 사용되는 프로토콜을 나타낸다. 즉, 리소스에 어떻게 접근하는지 기술하는 부분이다. 스킴은 알파벳으로 시작해야 하고, 다른 부분과 : 문자로 구분된다. 또한 대소문자를 가리지 않는다.
(http, https, ftp, telnet, gopher 등...)
사용자 이름과 비밀번호
일부 스킴은 리소스 접근을 위해 사용자 이름과 비밀번호를 요구한다. 유저 이름과 비밀번호는 : 로 구분하여 기술한다. 뒤에 @ 문자를 붙여 다른 컴포넌트와 구분한다.
- ex ) ftp://victolee:12345@호스트/asd.xls
호스트(Host)
서버의 인터넷 주소(IP or 도메인)를 나타낸다. 리소스가 어디에 호스팅 되어 있는지 알려준다.
포트(Port)
서버가 열어놓은 포트를 의미한다. 일반적으로 스킴은 기본 포트를 가지고 있으며, HTTP는 80, HTTPS 443이다.
경로(Path)
호스트에서 제공하는 리소스의 경로를 나타낸다. 찾고자 하는 리소스가 서버의 어디에 있는지 알려준다. 경로는 / 문자로 다시 작은 경로 조각으로 나뉜다.(계층적 구조)
질의(Query)
요청받을 리소스의 범위를 좁히기 위해서 사용된다. URL의 끝에서 ? 뒤에 이어 기술한다. 질의를 작성하는 공통 포맷은 존재하지 않는다. HTTP의 경우? key1=value1&key2=value2 형식으로 기술한다.
프래그먼트(Fragment)
리소스의 일부분을 가리키는 이름이며, 서버에는 전달되지 않고 클라이언트에서만 사용된다. URL의 끝에서 # 뒤에 이어서 기술한다. URL에 프래그먼트를 전달하면 페이지가 해당 id가 있는 곳으로 스크롤이 이동하게 된다.
URN(Uniform Resource Name)
URN은 Uniform Resource Name의 약자로, 한국어로는 통합 자원 이름이라고 한다. URL은 리소스의 위치를 문자열로 나타내기 때문에 리소스의 위치가 변경되면 URL도 변경되어야 한다.
기존 URL : https://jh7722.tistory.com/17
변경된 URL : https://jh7722.tistory.com/system/17
다른 사람이 노출된 검색 콘텐츠에 접근 시 노출된 페이지는 찾을 수 없게 된다.
이러한 단점으로 리소스가 옮겨지면 해당 URL을 더는 사용할 수 없다는 것이다.
그리고 그 시점 기존 URL이 가지고 있던 객체를 찾을 방법이 없어진다.
이것이 한계이다.
하지만 URN은 한 리소스의 위치에 상관없이 유일하게 식별하는 이름을 사용하는 방식이다. 예를 들어, urn:isbn:1234567과 같이 특정 서적의 ISBN 정보를 표시할 수 있다. URN에는 ISBN, UCI, IPFS 등이 있다.
이름으로 식별되기 때문에 URL의 한계를 극복하긴 하지만 URN은 아직 실험 중이고, 널리 채택되어 사용되고 있지 않다.
URI와 URL의 차이
<URI와 URL, URN의 관계> 이미지와 같이 URI와 URL은 서로 대립되는 관계가 아닌 포함관계이며 URI는 URL의 상위 개념이라 표현할 수 있다.
모든 URI는 URN 또는 URL이다.
모든 URL은 URI이다.
모든 URI는 URL이 아니다.
URI와 URL의 중요한 차이점은 URL은 리소스의 위치를 가리키는 반면, URI는 리소스를 식별하는 데 사용된다.
다시 말해, URL은 '어디에' 해당 자원이 있는지를 나태내고, URI는 '무엇인지'를 나타낸다.
예를 들어, https://www.example.com/index.html 은 URL과 URI 둘 다이다.
이 주소는 파일의 위치를 정확하게 나타내므로 URL이고, 해당 파일을 고유하게 식별하므로 URI이다.
반면 mailto:john:doe@example.com는 URI이다. 이메일 주소는 식별하지만 위치를 나타내지 않음으로 URL이 아니다.
둘의 차이점을 찾다가 많은 블로그에서 URI와 URL를 구분 짓는 게 쿼리스트링이나 /식별자 포함 여부로 언급되어 있다.
예를 들어, https://www.example.com/test.html 까지는 URL이 맞지만, https://www.example.com/test.do?id=1234&id2=5678 처럼 구체적인 리소스를 찾아가기 위한 파라미터가 포함되면 더 이상 URL은 아니라고 표현되어 있다.
위에 URL의 표기법에도 정의했듯이 쿼리스트링도 URL의 일부이다. 결론적으로, URL과 URI의 차이는 쿼리스트림의 유무의 차이가 아니다. URL은 리소스의 위치와 접근 방법을 특정하는 반면, URI는 리소스를 고유하게 식별하는 것에 중점을 둬서 알아둬야 된다.
'Knowledge > 네트워크' 카테고리의 다른 글
[네크워크] HTTP Status Code(HTTP 상태 코드) (1) | 2023.12.14 |
---|---|
[네크워크] CORS란? (+ Spring Boot에서 설정하기) (0) | 2023.12.12 |
[네트워크] 세션(Session) vs 쿠키(Cookie) vs 토큰(Token) (0) | 2023.12.07 |
[스친초5기/네트워크] HTTP와 HTTP 메서드 (0) | 2023.11.07 |
[네트워크] 인터넷과 웹의 관계 (1) | 2023.10.23 |