Post

URI, URL, URN은 무엇이 다를까?

URI, URL, URN은 무엇이 다를까?

브라우저 주소창에 입력하는 https://www.example.com을 우리는 보통 URL이라고 부릅니다. 그런데 문서나 코드를 보다 보면 URI라는 말도 자주 나오고 가끔은 URN이라는 말도 보입니다. 이번 글에서는 세 용어가 각각 무엇을 뜻하는지, 그리고 서로 어떤 관계인지 정리해 보겠습니다.

자원을 식별하는 URI

자원(Resource)이란?

자원(Resource)은 네트워크상에서 메시지를 통해 주고받는 대상입니다. HTML 파일일 수도 있고 이미지나 동영상 파일일 수도 있습니다.

즉, 두 호스트가 네트워크를 통해 정보를 주고받을 때 송수신하는 대상이 바로 자원입니다. 그리고 이런 통신은 대부분 HTTP를 기반으로 이루어집니다.

URI: 자원을 식별하는 정보

네트워크상에서 자원을 주고받으려면 먼저 어떤 자원인지 식별할 수 있어야 합니다. 이렇게 자원을 식별하는 정보를 URI(Uniform Resource Identifier)라고 합니다.

그렇다면 URI는 무엇을 바탕으로 자원을 식별할까요? 크게 두 가지 방법이 있습니다.

  • 위치로 식별한다: URL(Uniform Resource Locator)
  • 이름으로 식별한다: URN(Uniform Resource Name)

사람으로 비유하면 URL은 “서울시 OO구 OO로 12에 사는 사람”처럼 사는 곳으로 가리키는 방법이고, URN은 주민등록번호처럼 그 사람에게 붙은 고유한 이름으로 가리키는 방법입니다.

URL: 위치로 자원을 식별한다

URL의 구조

URI의 표준 문서인 RFC 3986은 다음 예시로 URI의 구성 요소를 설명합니다.

foo://example.com:8042/over/there?name=ferret#nose를 scheme, authority, path, query, fragment로 나눈 그림 RFC 3986의 예시로 본 URL의 구성 요소

구성 요소예시의미
schemefoo자원에 접근하는 방법 (주로 프로토콜)
authorityexample.com:8042자원이 있는 호스트와 포트
path/over/there호스트 안에서 자원이 있는 경로
queryname=ferret자원에 함께 전달하는 추가 정보
fragmentnose자원 안의 특정 부분

하나씩 살펴보겠습니다.

scheme

자원에 접근하는 방법을 나타냅니다. 보통 사용할 프로토콜이 들어갑니다. HTTP로 자원에 접근한다면 scheme은 http, HTTPS라면 https입니다.

흔히 http://까지를 한 덩어리로 보지만 정확히는 http가 scheme이고 :는 scheme 뒤에 붙는 구분자입니다. //는 그 뒤에 authority가 온다는 표시입니다. (팀 버너스리가 2009년에 “//”는 사실 없어도 됐다고 말했다는 말이…)

authority

호스트를 특정하는 정보입니다. 보통 IP 주소나 도메인 네임이 들어갑니다. 콜론(:) 뒤에 포트 번호를 덧붙일 수도 있습니다.

포트 번호를 생략하면 scheme의 기본 포트를 씁니다. http는 80번, https는 443번이라서 평소에 주소창에 포트를 적지 않아도 접속이 됩니다.

path

호스트 안에서 자원이 있는 경로입니다. 슬래시(/)를 기준으로 계층적으로 표현하고 최상위 경로도 슬래시(/) 하나로 나타냅니다.

query

HTTP는 요청-응답 기반의 프로토콜입니다. 클라이언트가 URL이 담긴 HTTP 요청 메시지를 보내면 서버는 그에 대한 응답 메시지를 돌려줍니다.

그런데 “특정 상품을 검색한 뒤, 그 결과를 내림차순으로 정렬해서 보여 줘” 같은 요청은 scheme, authority, path만으로는 표현하기 어렵습니다. 이럴 때 쓰는 것이 query입니다. 쿼리 문자열(Query String) 또는 쿼리 파라미터(Query Parameter)라고도 부릅니다.

1
https://shop.example.com/products?keyword=keyboard&sort=desc

query는 ? 뒤에 오며 보통 키=값 쌍을 &로 이어 붙여 씁니다.

fragment

자원의 한 조각을 가리키는 정보입니다. 주로 HTML 문서처럼 긴 자원에서 특정 부분을 가리킬 때 씁니다.

1
2
https://datatracker.ietf.org/doc/html/rfc3986
https://datatracker.ietf.org/doc/html/rfc3986#section-1.1.2

첫 번째 URL은 RFC 3986 문서 전체를 가리키므로 접속하면 문서의 맨 처음이 보입니다. 두 번째 URL은 같은 문서 안의 1.1.2절을 가리키므로 접속하면 바로 그 부분으로 이동합니다.

fragment는 서버로 전송되지 않습니다. 브라우저는 # 앞부분까지만 서버에 요청하고 문서를 받은 뒤 # 뒤의 위치로 직접 이동합니다.

주소에 index.html이 없는데 어떻게 페이지가 열릴까?

주소창에 www.example.com만 입력해도 메인 페이지가 열립니다. 그렇다면 index.html이라는 파일명을 생략해도 된다는 규칙이 URL에 있는 걸까요?

그렇지 않습니다. 실제로 일어나는 일은 다음과 같습니다.

  1. path를 비워 두면 브라우저는 최상위 경로인 /를 요청합니다. (GET / HTTP/1.1)
  2. /는 특정 파일이 아니라 디렉터리(폴더) 를 가리키는 경로입니다.
  3. 서버는 디렉터리를 요청받으면 미리 설정해 둔 기본 파일을 대신 돌려줍니다. 이 기본 파일이 보통 index.html입니다.

즉, index.html을 생략할 수 있는 것은 URL의 규칙이 아니라 서버의 설정 덕분입니다. Nginx의 index, Apache의 DirectoryIndex 같은 설정이 바로 “디렉터리를 요청받으면 어떤 파일을 보여 줄지”를 정합니다.

URN: 이름으로 자원을 식별한다

URL은 위치를 기반으로 자원을 식별합니다. 하지만 자원의 위치는 언제든 바뀔 수 있습니다. 자원이 다른 곳으로 옮겨 가면 기존 URL로는 더 이상 그 자원을 찾을 수 없게 됩니다.

URN은 자원에 고유한 이름을 붙이는 이름 기반 식별자입니다. 그래서 자원의 위치와 상관없이 자원을 식별할 수 있다는 장점이 있습니다.

1
urn:isbn:0451450523

위 URN은 ISBN(국제 표준 도서 번호)으로 특정 책 한 권을 가리킵니다. 그 책이 어느 도서관, 어느 서점에 있든 이 이름은 바뀌지 않습니다.

다만 URN은 아직 URL만큼 널리 쓰이지 않습니다. 이름만으로는 자원이 어디에 있는지 알 수 없어서, 실제로 자원을 가져오려면 이름을 위치로 바꿔 주는 별도의 장치가 필요하기 때문입니다.

URI, URL, URN의 관계

정리하면 URI가 가장 넓은 개념이고 URL과 URN은 URI 안에 포함되는 두 가지 방식입니다.

URI 안에 위치로 식별하는 URL과 이름으로 식별하는 URN이 포함된 관계도 URL과 URN은 모두 URI에 속한다

그래서 모든 URL은 URI이지만, 모든 URI가 URL인 것은 아닙니다.

실무에서 URN을 만날 일은 드물기 때문에, 웹 주소를 가리킬 때는 URL과 URI를 거의 같은 뜻으로 섞어 씁니다. 둘 중 무엇이라고 불러도 틀린 것은 아니지만, “식별자 전체”를 말할 때는 URI, “웹 주소”를 말할 때는 URL이라고 부르는 경우가 많습니다.

정리하면

  • URI는 자원을 식별하는 정보이고 식별 방법에 따라 URL(위치)과 URN(이름)으로 나뉩니다.
  • URL은 scheme, authority, path, query, fragment로 구성됩니다.
  • fragment는 서버로 전송되지 않고 브라우저가 문서 안의 위치를 찾는 데 씁니다.
  • 주소에서 index.html을 생략할 수 있는 것은 URL 규칙이 아니라 서버 설정 덕분입니다.
  • URN은 위치가 바뀌어도 자원을 식별할 수 있지만 URL만큼 널리 쓰이지는 않습니다.

마무리를 하면서

요즘 네트워크의 굵직한 개념들을 하나씩 정리해서 블로그에 글로 남기고 있습니다. 사실 이런 내용은 이제 AI에게 물어보기만 해도 더 잘 정리해서 알려 주기 때문에, 굳이 글로 쓸 필요가 있을까 싶기도 합니다.. 그래도 CS 지식은 개발의 기본이라고 생각해서, 직접 공부하고 공부한 내용을 정리하는 방식으로 계속 이어 가 보려고 합니다. 그 첫 시작이 네트워크입니다.

당분간은 네트워크 공부에 집중해 보겠습니다.