글을 작성하게 된 계기
사람들과 스프링 서버를 만들어보는 프로젝트를 진행하며 URI와 URL의 차이에 대해 질문받았습니다. 알고는 있었지만 두루뭉술하게 알았던 내용을 확실하게 정리하고 넘어가고 싶어 해당 글을 작성하게 되었습니다.
프로젝트는 해당 링크에서 보실 수 있습니다.
1. URI와 URN
URI(Uniform Resource Identifier)는 웹에 존재하는 자원을 식별하기 위한 식별자로, URL과 URN을 포괄합니다.
URI는 scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]와 같은 구조를 지닙니다.
URL(Uniform Resource Locator)은 자원의 위치를 나타내며, 클라이언트가 해당 자원에 접근할 수 있는 정보를 제공합니다. 이는 프로토콜(Protocol), 도메인 이름(Domain), 경로(Path), 쿼리 문자열(QueryString) 등으로 구성되며, 이를 통해 자원에 접근할 수 있습니다.
URI는 자원의 위치(URL)뿐만 아니라 그 자원을 구체적으로 식별하는 query string과 같은 추가적인 정보를 포함할 수 있습니다. URL은 URI의 한 형태로 볼 수 있으며, 포함관계를 보면 다음 그림과 같습니다.
http://www.google.com 을 통해 간략한 예제를 살펴보겠습니다.
http://www.google.com는 Google의 메인 페이지를 가리키는 URL입니다.http://www.google.com/search?query=hello에서 http://www.google.com/search는 검색 서비스를 제공하는 페이지 위치를 나타내는 URL 입니다. 반면 ?query=hello는 고유한 자원을 검색할 때 사용되는 식별자입니다.http://www.google.com/search?query=hello&world=world에서는 &를 통해 추가적인 식별자를 사용하고 있습니다.
2. URI로 검색했을 때 값이 여러개라면?
URI는 웹에 존재하는 자원을 식별하기 위해 사용된다고 했습니다. 그런데 www.google.com/users/3?page=1&size=10으로 검색했을 때, 결과가 여러 개가 나올 수 있는데, 이는 URI의 정의를 어기는 것일까요? 즉, 유일하다고 판단하고 검색을 했는데 결과가 여러개 나온다면 이는 옳은 것일까요?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
"data": [
{
"userId": 1,
"title": "A"
},
{
"userId": 1,
"title": "B"
},
{
"userId": 1,
"title": "C"
},
{
"userId": 1,
"title": "D"
},
{
"userId": 1,
"title": "E"
},
{
"userId": 1,
"title": "F"
},
{
"userId": 1,
"title": "G"
},
{
"userId": 1,
"title": "H"
},
{
"userId": 1,
"title": "I"
},
{
"userId": 1,
"title": "J"
}
]
}
검색 결과가 배열에 담겨 오는 경우와 같이 검색 결과가 여러개인 경우.
www.google.com/search?query=hello가 가리키는 자원은 구체적으로 Google의 검색 결과 페이지입니다. 하지만 해당 URI에 의해 검색되는 개별 검색 결과들은 해당 URI에 의해 직접적으로 식별되지 않습니다.
즉, URI를 통해 식별되는 것은 특정한 검색 결과 페이지 자체이며, 페이지에 나열된 개별 자원들은 해당 URI에 의해 직접적으로 식별되지 않습니다. 개별 자원은 고유한 URL을 통해 식별됩니다.
3. 정리
URI와 URL의 차이에 대해 살펴보았습니다. URI는 URL을 포함하는 더 광범위한 개념인데요, 이는 비슷하며 헷갈리기 쉬우므로, 둘의 차이에 대해 확실하게 정리해 볼 것을 권장해 드립니다. 추가로 URN에 대해서도. 🙂
A Uniform Resource Name (URN) is a Uniform Resource Identifier (URI) that uses the urn scheme.