Post

02. URL & Resource

02. URL & Resource

URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리키며, URL을 이용해 사람과 어플리케이션이 인터넷 상의 수십억 개의 리소스를 찾고 사용하며 공유할 수 있다.

2. URL and Resource

1. 인터넷의 리소스 탐색하기

URL(Uniform Resource Locator)는 URI의 부분집합이다. URI는 URL, URN 등을 포함하는 개념이다. URN은 이름으로 해당 리소스를 식별하는데 비해, URL은 리소스의 위치를 통해 리소스를 설명한다.

URL은 스킴, 호스트, 패스로 구분할 수 있다.

  • 스킴(Scheme) : 리소스에 접근하기 위해 사용하는 프로토콜 표현
  • 호스트(Host) : 리소스가 어디에 호스팅 되어있는지 표현
  • 패스(Path) : 리소스가 위치한 경로를 표현

URL은 HTTP 말고도 다른 프로토콜을 사용할 수 있다. 아래와 같이 스킴://호스트/경로 라는 일관된 구조로 리소스를 식별할 수 있다.

  • mailto:president@whitehouse.gov
  • ftp://ftp.lots-o-books.com/pub/complete-price-list.xls
  • rtsp://www.joes-hardware.com:554/interview/cto_video

2. URL 문법

URL로 인터넷 상의 모든 리소스를 찾을 수 있지만, 그 리소스들은 다른 스킴을 통해 접근할 수 있으며, URL 문법은 스킴에 따라 달라지는 것으로 보인다.

다른 스킴을 사용하더라도 다른 문법을 사용하는 것은 아니다. 서로 다른 URL 스킴도 형태와 문법 면에서 매우 유사하다. 대부분의 URL 스킴은 문법은 일반적으로 9개 부분으로 나뉜다.

<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>

컴포넌트설명필수 여부기본값
스킴 (Scheme)리소스에 접근하기 위한 프로토콜✅ 필수없음
사용자이름 (Username)인증을 위한 사용자 이름❌ 선택anonymous
비밀번호 (Password)인증을 위한 비밀번호❌ 선택없음
호스트 (Host)서버의 주소 (도메인명 또는 IP)✅ 필수없음
포트 (Port)서버에 접속할 포트 번호❌ 선택스킴에 따라 다름 (http → 80 등)
경로 (Path)리소스의 위치 경로(경로 컴포넌트의 문법은 서버와 스킴에 따라 다르다)❌ 선택/ 또는 빈 문자열
파라미터 (Path Parameter)경로 뒤에 붙는 세미콜론(;) 기반 파라미터❌ 선택없음
질의 (Query)요청 시 전달되는 키=값 형식의 데이터❌ 선택없음
프래그먼트 (Fragment)리소스 조각이나 일부분을 가리키는 이름❌ 선택없음

스킴: 사용할 프로토콜

스킴은 주어진 리소스에 어떻게 접근해야 하는지 알려주는 정보다. 이는 URL을 해석하는 어플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려준다.

호스트와 포트

어플리케이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 리소스에 접근할 수 있는 서버가 어디에 있는지 정보를 알아야 한다.

호스트 컴포넌트는 리소스를 호스팅하는 인터넷 상의 호스팅 장비를 가리킨다. 호스트 명이나 IP 주소를 사용할 수 있다. 포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다. 내부적으로 HTTP는 기본 포트로 80을, HTTPS는 443을 사용한다.

사용자 이름과 비밀번호

일부 서버는 리소스 접근을 위해서 인증을 요구한다. 아래 몇 가지 예가 있다.

  • ftp://ftp.prep.ai.mit.edu/pub/gnu
  • ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
  • ftp://anonymous:password@ftp.prep.ai.mit.edu/pub/gnu
  • http://joe:joespasswd@www.joes-hardware.com/sales_info_val.txt

첫 번째 예는 사용자 이름과 비밀번호 정보 없이 스킴, 호스트, 경로만 있다. 이와 같은 경우에는 사용자 이름과 비밀번호에는 기본 값을 사용한다.

세 번째 예와 네 번째 예에서는 사용자 이름과 비밀번호가 : 구분자로 분리하여 기술된 것을 확인할 수 있다.

경로

URL의 경로는 리소스가 서버의 어디에 위치한지 알려준다. 경로 컴포넌트는 / 문자를 기준으로 경로 조각으로 나뉜다. 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.

파라미터

많은 스킴이 객체에 대한 호스트, 경로 정보만으로는 리소스를 찾지 못한다. URL의 파라미터 컴포넌트는 어플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다. 이 컴포넌트는 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ; 문자로 구분하여 URL에 기술한다. 앞서 말했듯, 경로 컴포넌트는 경로 조각으로 나눌 수 있다. 각 조각은 자체 파라미터를 가질 수 있다.

http://www.joes-hardware.com/hammers;sales=false/index.html;graphics=true

질의 문자열

데이터베이스 같은 서비스들은 요청받을 리소스 형식의 변화를 좁히기 위해 질문이나 질의를 받을 수 있다. 다음 URL은 특정 아이템의 재고를 확인하는 경우를 나타낸다.

http://www.joes-hardware.com/inventory-check/cji?item=12731&color=blue

? 우측의 있는 값들은 질의 컴포넌트로서, 요청의 범위를 좁히기 위해 사용된다. item 번호가 item=12731 이고, 색상이 파란색 color=blue인 물품 조건을 나타낸다. 위처럼, 여러 질의 컴포넌트는 &로 연결지어 사용할 수 있다.

프래그먼트

HTML 같은 리소스 형식들은 더 잘게 나뉠 수 있다. 프래그먼트 컴포넌트는 리소스의 특정 부분을 가리키기 위해 사용된다. 아래 예처럼, URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있다.

http://www.joes-hardware.com/tools.html#drills

이 예에서 drills 라는 프래그먼트는 tools.html이라는 전체 리소스에서 drills 라는 리소스의 일부분을 가리킨다. 일반적으로는 HTTP 서버는 객체 일부만을 다루지 않으므로 웹 클라이언트는 프래그먼트 부분을 제외하여 리소스 전체를 요청한 뒤, 일부분을 보여주는 방식으로 작동한다.

3. 단축 URL

웹 클라이언트는 몇 단축 URL을 인식하고 사용한다. 상대 URL은 리소스 안에 있는 리소스를 간결하게 기술하는데 사용할 수 있다. 많은 브라우저가 사용자가 기억하는 일부 URL을 입력하면 나머지를 자동으로 입력해주는 자동 확장을 지원한다.

URL은 상대 URL과 절대 URL로 나뉜다. 절대 URL은 리소스 접근에 필요한 모든 정보를 가지고 있다. 그와 달리 상대 URL은 모든 정보를 가지고 있지 않다. 리소스에 접근하기 위한 필요한 모든 정보를 얻기 위해서는 기저(base)라고 하는 다른 URL을 사용해야 한다.

상대 URL

상대 URL은 URL을 짧게 표기하는 방식이다. 아래 예시를 보자.

1
2
3
4
5
6
7
8
<HTML>
<HEAD><TITLE>Joe's Tools</TITLE></HEAD>
<BODY>
<H1> Tools Page </H1>
<H2> Hammers </H2>
<p> Joe's Hardware Online has the largest selection of <A HREF>"./hammers.html"</A> on earth/
</BODY>
</HTML>

위 HTML 문서에는 ./hammers.html 을 가리키는 하이퍼링크가 있다. 미완성처럼 보이지만, 이 문서의 URL을 기준으로 한 상대 경로로 해석할 수 있다. 기저 URL(이 경우에는 http://www.joes-hardware.com/tools.html)을 기준으로 삼으면, 스킴과 호스트를 추측할 수 있다. 상대 URL은 프래그먼트이거나 URL 일부다. URL을 처리하는 브라우저와 같은 어플리케이션은 상대 URL과 절대 URL을 상호변환할 수 있어야 한다.

URL 확장

많은 브라우저들은 URL을 입력하는 동안 자동으로 URL을 확장하여 사용자가 URL 전체를 입력하지 않아도 되게 돕는다. 이러한 확장 기능은 두 가지로 나뉜다.

  • 호스트명 확장 : 단순 휴리스틱을 활용하여 자동으로 전체 호스트명으로 확장한다. 예를 들어, naver 만을 입력하면 자동으로 www..com을 붙여서 www.naver.com을 완성한다. naver에 해당하는 사이트를 찾지 못하는 경우, 확장을 포기하기 전에 몇 가지 URL을 추가로 제시한다.

  • 히스토리 확장 : 사용자의 방문 기록을 저장한 뒤, 사용자가 URL을 입력할 때 해당 입력 부분을 포함하는 완결된 형태의 URL을 선택하게 하는 것이다.

프록시를 사용하는 경우 URL 자동확장 기능은 다르게 동작할 수 있다는 것을 유념하자.

4. 안전하지 않은 문자

모든 프로토콜은 데이터를 전송하기 위해서 서로 다른 장치를 가지고 있다. 이 때문에, 어떤 인터넷 프로토콜을 통해서든 안전하게 데이터를 주고 받기 위해서 URL을 설계하는 것이 중요했다.

안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미한다. 전자메일에 사용하는 SMTP 같은 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용한다. 문자가 제거되는 일을 피하고자 URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만을 포함하도록 한다. 이진 데이터나, 안전한 알파벳 문자 이외의 문자를 포함하고 싶은 경우에는, 이스케이프라는 기능을 통해서 안전한 문자로 인코딩할 수 있다.

URL 문자 집합

컴퓨터 시스템의 기본 문자 집합은 영어 중심으로 설정되어 있다. 많은 컴퓨터 어플리케이션이 US-ASCII 문자 집합을 사용해왔다. US-ASCII는 문자를 서식화하고 하드웨어상에서 신호를 주고 받기 위해 7비트를 사용하여 영문 자판에 있는 키와 출력되지 않는 몇 가지 제어 문자를 표현한다.

하지만 US-ASCII는 오래된 문자 집합이므로, 적은 수의 문자만을 포함하므로, 많은 사람들이 사용하는 유럽 언어나 비라틴계 언어들에 존재하는 변형 문자까지 포함하지는 않는다. 또한, 특정 이진 데이터를 포함해야 하는 경우도 있다.

이런 것을 지원하기 위해서 URL에 이스케이프 문자열을 사용할 수 있도록 설계하였다.

인코딩 체계

안전한 문자 집합을 이용하는 경우 그 표현의 한계를 넘기 위해 URL의 안전하지 않은 문자까지 표현할 수 있는 인코딩 방식이 고안되었다. 인코딩은 안전하지 않은 문자를 %로 시작해 ASCII로 표현되는 두 개의 16진수 숫자로 이루어진 이스케이프 문자로 바꾼다.

인코딩 문자열의미
%7E~ (물결표)
%20공백 문자 (space)
%25% (퍼센트 기호)

이 외에도 앞서 언급했던 URL 컴포넌트에서 사용하는 문자들 (., .., /, ?, #, &, =…) 들은 이미 선점되어 있는 문자들이므로, 만약 다른 용도로 사용을 원하면 반드시 인코딩 처리가 필요하다.

5. 스킴의 바다

스킴설명기본 형식예시
httpHyperText Transfer Protocol. 웹 페이지를 요청할 때 사용되는 기본 스킴. 포트값 생략 시 기본 포트는 80.http://<호스트>:<포트>/<경로>?<질의>#<프래그먼트>http://example.com/index.html
httpsHTTP Secure. 보안을 강화한 HTTP. TLS/SSL로 암호화됨. 포트값 생략 시 기본 포트는 443.https://<호스트>:<포트>/<경로>?<질의>#<프래그먼트>https://example.com/login
mailtomailto URL은 이메일 주소를 가리킴. 이메일은 다른 스킴과 다르게 동작하므로 표준 URL과는 다른 포맷을 가짐.mailto:<이메일주소>mailto:user@example.com
ftpFile Transfer Protocol. 파일 업로드/다운로드를 위한 프로토콜.ftp://<사용자>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>ftp://user:pass@ftp.example.com/files
rtsp, rtspuReal Time Streaming Protocol. 미디어 스트리밍에 사용. rtspuu는 UDP 프로토콜을 나타냄.rtsp://<사용자>:<비밀번호>@<호스트>:<포트>/<경로>rtsp://media.example.com/video
file주어진 호스트 기기에서 바로 접근할 수 있는 파일 표현. 호스트 생략 시 기기의 로컬 호스트 사용file://<호스트>/<경로>file:///C:/Users/you/readme.txt
news뉴스 그룹 기사 접근을 위한 스킴 (NNTP 기반). 리소스 위치 정보를 충분히 표현하지 않고, 그것을 알아내는 것은 어플리케이션의 몫.news:<뉴스그룹>news:comp.lang.java
telnet원격 터미널 접속용. 보안 취약성으로 현재는 거의 사용되지 않음.telnet://<사용자>:<비밀번호>@<호스트>:<포트>telnet://example.com:23

6. URL의 미래

URL은 편리하다. 하지만 URL은 특정 주소일 뿐, 해당 리소스의 실제 이름은 아니다. 리소스의 위치가 변경되면 더는 사용할 수 없다.

이런 문제를 해결할 수 있는 방법은 객체의 위치와 상관 없이, 그 객체를 가리키는 실제 객체의 이름을 사용하는 것이다. URN은 객체가 옮겨지더라도 항상 객체를 가리킬 수 있는 이름을 제공한다.

지속 통합 자원 지시자 (Persistent Uniform Resource Locator, PURL)을 사용하면 URL로 URN의 기능을 제공할 수 있다. PURL은 리소스 실제 URL 목록을 관리하고 추적하는 리소스 위치 중개 서버를 두고 해당 리소스를 우회적으로 영구 제공한다.

This post is licensed under CC BY 4.0 by the author.