URI, URL, URN

sycho·2024년 1월 4일
0

Network

목록 보기
8/9
  • 자주 헷갈리는 개념이 URI, URL, URN이 무슨 차이냐는 것이다.

  • 여러 글들을 봐봤는데, 잘못 설명하는 곳이 너무 많다고 생각해서 따로 정리했다.

URI

scheme:hier-part[?query][#fragment]
  • Linux 명령어 관련 문서들을 많이 봤으면 알겠지만 여기서 필수적으로 들어가야 하는 요소는 schemehier-part만 해당된다. 다만 hier-part도 실질적으로 비어있는것도 가능하다. 후술.

scheme

  • 일단 알아야 하는게, scheme은 이 사이트에서 말하는 것처럼 자원을 접근하는데 사용되는 protocol만 들어갈 수 있는게 아니다. 물론 해당 사이트에서 나온것처럼 자원 접근에 사용하는 protocol도 scheme에 들어가지만, 일반적인 URI에서 꼭 저 위치에 protocol이 들어가야 한다고 정의되어 있진 않다.

  • 대표적인 scheme이 바로 about: scheme이다. HTTP, FTP 등 네트워크를 통해 자원을 얻는 프로토콜들과는 달리 브라우저 내장 페이지들을 로드하거나, 브라우저 내부 정보들을 습득하는데 사용되는 녀석이다.

  • 예를 들어 about:version을 크롬 브라우저를 통해 요청하면 다음과 같은 정보가 나오게 된다.

  • 네트워크에 요청할 때 사용되는 URI의 schema는 프로토콜이라고 생각하는게 맞긴 하다. https://naver.com/https가 대표적. (사실 저게 곧 URL이기도 하다. 후술)

hier-part

  • 여기는 크게 2가지로 또 나뉘어진다. 바로 authority 부분이랑 path부분.

authority

authority = [userinfo "@" ] host [ ":" port]
  • 존재할수도 있고 안할수도 있는데, 존재시 //로 시작해야 한다. HTTP나 HTTPS 프로토콜을 쓰면서 많이 봤을 것이다.

  • 끝나는 부분은 /이나 ?이나 #이어야 한다.

  • 포함하는 정보는

    • userinfo : 유저 정보. 또 하위 체계가 좀 복잡하게 나뉘어진다. 간단히 얘기하자면 :을 기반으로 유저 정보들을 나눈다고 생각하면 되며 자세히 알고 싶으면 RFC를 보도록 하자.
    useinfo = *(unreserved / pct-encoded / sub-delims / ":")
    • host : 호스트 정보. 호스트의 이름이나 호스트의 IP 주소가 들어갈 수 있다. 이것도 하위 체계가 생각보다 복잡한데 여기선 생략.

    • port : 포트 번호. 존재시 앞의 호스트 정보랑 :로 구별이 된다.

    • 구글 검색시 나오는 https://www.google.com/search?...의 경우 www.google.com 부분까지가 authority라고 생각하면 된다.

    • 즉 URL에서 보통 호스트 정보가 여기에 해당된다.

path

  • authority가 없어도 존재가 가능한 부분이다.

  • authority가 없는데 존재할 경우 무조건 /로 시작해야하지 //로 시작해서는 안되며, authority가 있는 경우에도 비어있거나 /로 시작을 한다.

  • 반대로 authority가 있어도 path는 없어도 될 수 있다. https://192.0.0.1/이 대표적인 예시.

  • 즉 URL에서 보통 호스트 내 파일 경로가 여기에 해당된다.

Query

  • 구글 검색시에 ? 옆에 달라붙는것이 많은걸 볼 수 있다. 보통 이것들은 key=value 형태의 꼴을 가지고 있는데, 이것들이 전부 query 영역에 해당한다.

  • 보통 특정 key가 어떤 값에 대응되는지를 알려주기 위해 사용되는 영역이다.

fragment

  • # 뒤에 붙는 부분은 전부 fragment다.

  • 핵심 자원의 각기 다른 부분들을 나타낼 때 사용된다.

  • 대표적인 예시는 위키백과에서 특정 section을 누른 경우다 => https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax 의 경우 여기서 #Syntax 부분이 fragment component에 해당된다.

URL

  • Uniform Resource Locator의 줄임말

  • 사실 위의 URI 예시들 중 about:에 관한 부분을 제외한 나머지 전부가 URL에 해당된다. (...)

  • 네트워크 상에 있는 자료들의 위치, 그리고 이를 어떻게 구하는지까지 (어떤 protocol을 사용하는지) 전부 지정한 URI가 URL이다.

  • 구조는 URI와 완전히 동일하며, URI의 모든 영역이 사실 URL이기도 하다. 그 URI가 위의 굵음 표시로 된 것을 나타내기만 한다면 말이다.

  • 이 때문에 이 링크에서 구한 밑의 사진에서 나온 것처럼 URI랑 URL를 나누면 안된다. 밑의 URI 전체가 곧 URL이기도 하다. URL은 fragment 부분도 포함을 한다.

  • URI가 어떤 목적으로 사용되냐에 따라 URL로 세부적으로 나뉘어질 수 있는 것이지 URI랑 URL을 위처럼 구조적으로 나누는 것이 애초에 잘못되었다는 것이다...

URN

  • Uniform Resource Name의 줄임말

  • URI 내용을 이해했다면 얘의 정의는 간단하다. URI들 중 schemeurn인 녀석들이 전부 URN이다.

  • 구조는 밑과 같다.

urn:NID:NSS
  • 언제나 위와 같은 구조를 가진다. URN은 scheme 부분을 말하며, NID는 IANA(Internet Asigned Numbers Authority)라는 곳에 등록되어야 하는 namespace identifier, NSS는 해당 namespace 안에서의 파일 식별 코드라고 생각하면 된다. 예시는 밑과 같이 있다.
urn:isbn:0405999832
  • 구조가 URI 표준이랑 매우 다르지 않냐고 할 수 있는데, 사실 scheme부분만 존재하고 path가 empty한 형식의 URI라고 생각해야 한다. 즉 NIDNSS부분까지 전부 URIscheme부분에 해당한다. path가 empty인 경우도 허용하기 때문에 유효한 URI 구문이다.

  • namespace가 뭔지 헷갈릴 수 있는데 Linux를 좀 잘 안다면, Linux namespace를 생각하면 된다. 온갖 파일들이 존재하는 인터넷 세상에서 여러 namespace를 통해 구별을 지어서 관리를 하고 있고, 그 naemspace 안의 어떤 파일을 지칭하고 있는지를 이제 NSS를 통해 파악하는 것이다. 그리고 이 namespace를 IANA에서 총괄해서 관리하고 있다고 생각하면 된다.

  • 즉 약자에서 나온것처럼 온 세상의 파일을 관리하는 체계 속에서 해당 파일이 가지는 이름을 나타내는 녀석이 URN이라고 생각하면 된다.

  • 이 이름은 URL과 다르게 절대적이기 때문에, 파일이 삭제가 되고 다시 등록되지 않는 한 어디로 이동하든 유효한 이름이 된다. 파일이 이동하면 유효해지지 않을 수 있는 URL과는 다르다.

  • 반면 URL과는 다르게 해당 파일을 어떤 방식으로 접근할 수 있는지에 대해서는 명시가 전혀 되어 있지 않다. 그저 그 파일 이름만을 나타낼 뿐.

  • 그럼 대체 어디다가 쓰이냐고 할 수 있는데, 사실 URN resolver 등을 통해 이를 해석해가지고 URL, 혹은 URL이 아니더라도 이를 얻는 방식에 필요한 정보를 취득하는 것이 가능하다. URN resolver은 해당 URN을 제공하는 측에서 보통 자체적으로 구현해가지고 제공을 하고 딱히 통일화된 규격은 없음. 대표적으로 핀란드 국립 도서관의 urn.fi가 있다.

포함관계

  • 검색하면 모두가 공통으로 하는 소리가... URL과 URN은 URI에 속한다는 것이다. 그리고 실제로 맞다. 모든 URN은 URI고, 모든 URL도 URI이며, URI중에 URL, URN이 아닌 녀석도 있다 사실 URL이 URN이 아니고 URN이 URL이 아니니까 각각을 반례로 들면 된다...

  • 위 내용 자체는 제대로 설명하는 곳이 많으나 실제로 어떤 포함관계인지는 제대로 설명하지 못한 곳이 많았는데

    • URI : 그냥 어떤 자원을 나타내는데 사용하는 통일된 형식
    • URL : URI의 일종으로 schema 부분이 '네트워크' 상의 어떤 자원을 어떻게 구하는지를 명시하며 (네트워크 프로토콜), 그 외의 부분이 구하려는 '네트워크' 상의 자원을 구체적으로 명시.
    • URN : URI의 일종으로 schema 부분이 특정 체계 하에서 어떤 자원을 unique하게 명명.
  • URN은 URI의 schema 부분이 urn이면 URN이라고 생각하면 된다. 그리고 전체가 다 URI면서 URN이다.

  • URL은 schema 부분이 네트워크 프로토콜 부분이면 URL이라고 생각하면 된다. 그리고 전체가 다 URL이면서 URI다. URN은 포함 안된다...

  • 위의 두 곳에 해당되지 않는 URI는 about:라는 schema를 사용하는 URI라고 생각하면 된다.

profile
임베디드 시스템 개발자. 관심 분야 : Embed/System/Architecture/Web/AI

0개의 댓글