HTTP 완벽가이드 2장 - URL과 리소스

김명성·2022년 7월 9일
0

HTTP 이해하기

목록 보기
2/2
post-custom-banner

URL은 인터넷의 리소스를 가리키는 표준이름이다.

URL은 리소스가 어디에 있고 어떻게 접근할 수 있는지 알려준다.

인터넷의 리소스 탐색하기

URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리키며
URL을 이용해 사람과 어플리케이션이 인터넷상의 리소스를 찾고 사용하며 공유한다.
그리고 URL을 통해 사람이 HTTP 및 다른 프로토콜에 접근할 수 있다.

URL의 3부분
스킴 : http:// , https:// 리소스에 어떻게 접근하는지 알려준다.
스킴은 http 외에도, mailto , ftp , rtsp 등 다양하다.
서버의 위치: www.google.com 리소스의 호스팅 위치를 가리킨다.
리소스의 경로 : /season/winter.jpg, /something.html 요청받은 리소스를 가리킨다.

URL이 정형화 된 이후로 하나의 인터페이스를 통해 일관된 방식으로 많은 리소스에 접근할 수 있게 되었다.(파일,이메일,뉴스 등)

URL은 사용자와 브라우저가 찾는 정보에 대해 필요한 모든 것을 제공하며 리소스의 위치와 가져오는 방법을 정의한다.

URL 문법

URL로 인터넷상의 모든 리소스를 찾을 수 있지만, 그 리소스들은 다른 스킴을 통해 접근할 수 있으며, URL문법은 스킴에 따라 달라진다.
그렇다고 다른 URL 스킴을 사용한다 해서 전혀 다른 문법을 사용하는 것은 아니며 형태와 문법 면에서 매우 유사하다.

대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉜다.

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

이 모든 컴포넌트를 다 가지는 URL은 거의 없다.
URL의 가장 중요한 세가지 컴포넌트는 스킴, 호스트, 경로이다.

URL 컴포넌트

  • 스킴 : 리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다.
  • 사용자 이름 : 몇몇 스킴은 리소스에 접근하기 위해 사용자 이름을 필요로 한다 - 기본값 anonymous
  • 비밀번호 : 사용자의 비밀번호를 가리키며 사용자 이름에 콜론으로 이어서 기술한다. - 기본값 email address
  • 호스트 : 리소스를 호스팅하는 서버의 호스트 명이나 IP주소
  • 포트 : 리소스를 호스팅하는 서버가 열어놓은 포트 번호. 많은 스킴이 기본 포트를 가지고 있다.(EX: HTTP의 기본 포트는 80)
  • 경로 : 이전 컴포넌트와 /로 구분하여 서버 내 리소스가 어디에 위치하는지 가리킨다. 경로 컴포넌트의 문법은 서버와 스킴에 따라 다르다. URL의 경로를 세그먼트로 나눌 수 있고, 각 세그먼트는 자체 컴포넌트를 가질 수 있다.
  • 파라미터 : 특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용한다.
    파라미터는 이름/값을 쌍으로 가지며 다른 파라미터나 경로의 일부를 세미 콜론으로 구분하여 기술해 여러 개를 가질 수 있다.
  • 쿼리 : 스킴에서 어플리케이션 (DB, 게시판,검색엔진 등)에 파라미터를 전달하는데 쓰인다. URL의 끝에 ?를 붙여 구분짓는다.
  • 프레그먼트 : 리소스의 조각이나 일부분을 가리키는 이름이다. URL이 특정 객체를 가리킬 경우 프레그먼트 필드는 서버에 전달되지 않으며 클라이언트에서만 사용한다. URL의 끝에서 # 문자로 구분한다.

스킴

주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보다 URL을 해석하는 어플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려준다.
스킴 컴포넌트는 알파벳으로 시작해야 하고 URL의 나머지 부분을 :로 구분하며 대소문자를 가리지 않는다.

호스트와 포트

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

호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킨다.
해당 값은 www.google.com과 같이 호스트 명이나 IP주소로 제공한다.

포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다.
내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용한다.

사용자 이름과 비밀번호

많은 서버가 자신이 가지고 있는 데이터에 접근을 허용하기 전에 사용자 이름과 비밀번호를 요구한다.

FTP 서버가 좋은 예다.
ftp://anonymous:mypaswd@ftp.prep.ai.mit.edu/pub/gnu
사용자 이름과 비밀번호를 :으로 분리하여 모두 기술한 예시이다.

경로

경로 컴포넌트는 /season/winter.jpg와 같은 형태로, 유닉스 파일 시스템의 파일 경로와 유사하다.
경로는 서버가 리소스의 위치를 찾는데 사용하는 정보다.
HTTP URL에서 경로컴포넌트는 /을 기준으로 조각으로 나뉜다.
각 경로 조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.

파라미터

많은 스킴이 호스트 및 경로 정보만으로 리소스를 찾지 못한다.
파라미터 컴포넌트는 어플리케이션이 서버에 정확히 요청하기위해 필요한 입력 파라미터를 받는데 사용한다.
이 컴포넌트는 이름/값 쌍의 리스트로 URL나머지 부분들로부터 ;로 구분하여 URL에 기술한다.
이를 통해 어플리케이션이 리소스에 접근하는데 필요한 어떤 추가 정보든 전달할 수 있다.

ftp://prep.ai.mit/edu/pub/gnu;type=d

위 예제의 경우 이름은 type이고 값은 dtype=d라는 단 한개의 파라미터를 전달한다.

앞서 언급했듯이 HTTP URL에서의 경로 컴포넌트는 경로 조각으로 나눌 수 있고 각 조각은 자체 파라미터를 가질 수 있다.

http://www.google.com/hammers;sale=true/index.html;graphics=true

위 예제에는 hammers와, index.html이라는 두 개의 경로 조각이 있다.
hammer 경로조각은 값이 true인 sale이라는 파라미터를 가진다.
index.html 경로조각은 값이 true인 graphics라는 파라미터를 가진다

쿼리

데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁히기 위해 쿼리를 받을 수 있다.

만약 어떤 상품들이 비축되어 있는지 조회하려한다고 생각해보자.

다음 URL은 아이템번호 12731의 재고가 있는지 확인 학기 위해 웹 데이터베이스 게이트웨이에 질의하는데 사용된다.

http://www.google.com/inventory-check.cgi?item=12731

물음표 우측에 있는 값들을 쿼리컴포넌트라 부른다.
쿼리 컴포넌트는 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달하고 있다. 보통 게이트웨이는 다른 어플리케이션에 접근하려고 할때 거치는 통로라 할 수 있다.

사용하면 안되는 특정 문자들을 제외하고는 질의 컴포넌트 포멧에 제약사항은 없다.

편의상 많은 게이트웨이가 &로 나뉜 이름=값쌍 형식의 질의 문자열을 원한다.

http://www.google.com/inventory-check.cgi?item=12731&color:red

이와 같이 두 개의 쿼리 컴포넌트를 사용할 수 있다.

프레그먼트

HTML같은 리소스 형식들은 본래의 수준보다 더 작게 나뉠 수 있다.

예를 들어 절(paragraph)이 포함된 용량이, 큰 한개의 텍스트 문서일 경우, 그 리소스에 대한 URL은 텍스트 문서 전체를 가리키겠지만, 이상적으로는 리소스안에 있는 특정 paragraph를 가리킬 수 있어야 한다.

리소스의 특정 부분을 가리킬 수 있도록 URL은 리소스 내의 조각을 가리킬 수 있는 프레그먼트 컴포넌트를 제공한다.

예를 들어 URL은 HTML문서에 있는 특정 이미지나 일부분을 가리킬 수 있다.

프래그먼트는 URL의 오른쪽에 # 문자를 이어서 작성한다.

http://www.google.com/tools.html#keyboard

이 예시에서 keyboard라는 프래그먼트는 google에 위치한 tools.html 웹 페이지의 일부를 가리킨다.

그 부분을 keyboard라고 기술하였다.

일반적으로 HTTP서버는 객체 일부가 아닌 전체만 다루기 때문에
클라이언트는 서버에 프래그먼트를 전달하지 않는다.

브라우저가 서버로부터 전체 리소스를 내려받은 후 프래그먼트를 사용하여 당신이 보고자 하는 리소스의 일부를 보여준다.

a) http://www.google.com/tools.html#drills

  • 사용자가 http://www.google.com/tools.html#drills를 가리키는 링크를 클릭한다.

b) 브라우저는 http://www.google.com/tools.html을 요청한다.

c) 서버는 전체 HTML 페이지를 반환한다.
d) 브라우저는 drills 프래그먼트로 시작하는 HTML 페이지를 보여준다

  • 브라우저는 drills 프래그먼트에 시작부로 스크롤을 내린다

위와 같이 서버는 객체를 전체 단위로만 전송하기 때문에 URL 프래그먼트는 클라이언트에서만 사용된다.

단축 URL

웹 클라이언트는 몇몇 단축 URL을 인식하고 사용할 수 있기에 URL 일부를 입력하면 나머지 부분을 자동으로 입력해주는 URL 자동 확장을 지원한다.

인코딩 체계

안전한 문자 집합을 이용하는 경우 그 표현의 한계를 넘기 위해 URL에 있는 안전하지 않은 문자들을 표현할 수 있는 인코딩 바잇ㄱ이 고안되었다.

인코딩은 안전하지 않은 문자를 퍼센티지 기호로 시작해 ASCII 코드로 표현되는 두 개의 16 진수 숫자로 이루어진 이스케이프 문자로 바꾼다.

URL에서~%7로 변환된다.
URL에서 빈 문자는 %20으로 변환된다.

문자 제한

몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있다.
그러한 문자를 URL에서 사용된다면 혼동이 되기 마련이다.
아래는 URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면 그 전에 반드시 인코딩해야 하는 문자들이다.

% 인코딩된 문자에 사용할 이스케이프 토큰으로 URL이 선점한다.
/ 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 URL이 선점한다.
. 경로 컴포넌트에서 URL이 선점한다.
.. 경로 컴포넌트에서 URL이 선점한다.
# 프래그먼트 구획 문자로 URL이 선점한다.
? 쿼리 컴포넌트의 문자열의 구획 문자로 URL이 선점한다.
; 파라미터 컴포넌트의 구획 문자로 URL이 선점한다.
: 스킴, 사용자이름/비밀번호 구획, 호스트/포트 구획 문자로 URL이 선점한다.
$,+ : 왜인지는 모르겠지만 URL이 선점한다.
@,&,= 특정 스킴에서 특별한 의미가 있기 때문에 URL이 선점한다.
{}|\[] : 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 떄문에 제한이 된다.
< > 안전하지 않고 URL 범위 바깥에서 역할을 하는 문자이기 떄문에 반드시 인코딩해야 한다.

이러한 문자들을 미리 인코딩하여 URL을 설계해야 하는 이유는

다른 에플리케이션으로부터 특별한 의미를 가지는 문자를 받았을 때 혼동할 걱정 없이 어플리케이션 간에 공유할 수 있는 URL의 원형을 유지할 수 있기 떄문이다.

스킴의 바다

웹에서 쓰이는 일반 스킴들의 포멧.

  1. http: 일반 URL 포멧을 준수하는 HyperTextTransferProtocol 이다.
  • http://host:port/path?query#pregment의 기본 형식.
  1. https: https는 http 스킴과 거의 같다. 다른 점은 HTTP 커넥션의 양 끝단에서 암호화 하기 위해 넷스케이프에서 개발한 보안 소켓 계층(SecureSocketLayer)를 사용한다는 것 뿐이다. 기본 포트값은 443이다.
  2. mailto 이메일 주소를 가리킨다. 이메일은 다른 스킴과는 다르게 동작하며 표쥰 URL과는 다른 포멧을 가진다.
  • mailto:<RFC-822-addr-spec>
  • mailto:joe@joes-hardware.com
  1. ftp 파일 전송 프로토콜은 FTP 서버에 있는 파일을 다운/업로드하고 FTP 서버의 디렉토리에 있는 콘텐츠 목록을 가져오는데 사용할 수 있다.
    FTP는 웹과 URL이 출현하기 전부터 존재했다.
    웹 앱은 데이터에 접근하는 용도의 스킴으로 FTP를 사용한다.
  • ftp://username:password@host:port/path:parameter
  • ftp://anonymous:joy%40google.com@prep.ai.mit.edu:21/pub/gnu
    5.tsp, rtspu 실시간 스트리밍 프로토콜을 통해 읽을 수 있는 오디오 및 비디오와 같은 미디어 리소스 식별자다.
    rtspu 스킴에 있는 u는 리소스를 읽기 위해 UDP프로토콜이 사용됨을 뜻한다.
  • rtsp://username:password@host:port/path
  • rtsp://www.google.com:554/interview/cto_video
    6.file file 스킴은 주어진 호스트 기기에서 바로 접근할 수 있는 파일들을 나타낸다. 각 필드도 일반적인 URL 포멧을 따른다. 만약 호스트가 생략되어있다면 URL을 사용하있는 기기의 로컬 호스트가 기본값이 된다.
  • file://host:path
  • file://OFFICE-FS/policies/casual-friday.doc

그 외에도 new , telnet 등 다양한 스킴과 그에 맞는 형식이 존재한다

2장을 마치며,

URL은 현재 물론 가까운 미래에도 인터넷에 있는 리소스를 명명하는 방법이 될것이다.

그것이 어디에나 쓰일 ㅓㅅ이고 웹이 성공하는데 있어 매우 중요한 부분이 입증될 것이다.

다만 URL은 그 한계를 가진 상태에서 그것을 해결할 수 있는 새로운 표준같은 것들이 나오고 적용될 것이다.(아마도 그 방법은 URN이 될 것이다)

post-custom-banner

0개의 댓글