HTTP 완벽 가이드 (2장)

문린이·2023년 5월 22일
0

HTTP 완벽 가이드 책을 읽고 정리한 내용입니다.

URL과 리소스

URL은 인터넷의 리소스를 가리키는 표준이름이다. URL은 전자정보 일부를 가리키고 그것이 어디에 있고 어떻게 접근할 수 있는지 알려준다.

인터넷의 리소스 탐색하기

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

URL은 통합 자원 식별자 혹은 URI라고 불리는 더 일반화된 부류의 부분집합이다. URI는 두 가지 주요 부분집합인, URL과 URN으로 구성된 종합적인 개념이다.

  • URL의 첫 부분인 http는 URL의 스킴이다. 스킴은 웹 클라이언트가 리소스에 어떻게 접근하는지 알려준다.
  • URL의 두 번째 부분인 www.google.com은 서버의 위치다. 이는 웹 클리이언트가 리소스가 어디에 호스팅 되어 있는지 알려준다.
  • URL의 세 번째 부분인 /route/index.html은 리소스의 경로다. 경로는 서버에 존재하는 로컬 리소스들 중에서 요청받은 리소스가 무엇인지 알려준다.

URL이 있기 전 암흑의 시대

URL은 브라우저가 더 영리하게 리소스에 접근하고 그것을 다루게 함으로써 온라인 세상을 단순화시킨다. 애플리케이션은 URL을 사용하여 정보에 쉽게 접근할 수 있다. URL은 당신과 브라우저가 정보 찾는데 필요한 모든 것을 제공하며, 당신이 원하는 리소스가 어디에 위치하고 어떻게 가져오는지 정의한다.

URL 문법

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

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

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

컴포넌트설명기본값
스킴리소를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다.없음
사용자 이름몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름을 필요로 한다.anonymous
비밀번호사용자의 비밀번호를 가리키며, 사용자 이름에 콜론(:)으로 이어서 기술한다.<이메일 주소>
호스트리소스를 호스팅하는 서버의 호스트 명이나 IP 주소.없음
포트리소스를 호스팅 하는 서버가 열어놓은 포트번호.스킴에 따라 다름
경로이전 컴포넌트와 빗금(/)으로 구분되어 있으며, 서버 내 리소스가 어디에 있는지를 가리킨다.없음
파라미터특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용한다.없음
질의스킴에서 애플리케이션에 파라미터를 전달하는데 쓰인다.없음
프래그먼트리소스의 조각이나 일부분을 가리키는 이름이다.없음

스킴: 사용할 프로토콜

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

호스트와 포트

애플리케이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 한다. URL의 호스트와 포트 컴포넌트는 그 두 가지 정보를 제공해준다.
호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킨다.
포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다.

사용자 이름과 비밀번호

사용자 이름과 비밀번호를 기술하지 않고 URL에 접근하면, 기본 사용자 이름 값으로 'anonymous'가, 비빌번호는 브라우저가마다 가지고 있는 기본값을 사용한다.(크롬은 'chrome@example.com')

http://user:password@www.google.com/test.txt

@: 문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리한다.

경로

URL의 경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려준다. HTTP URL에서 경로 컴포넌트는 '/'문자를 기준으로 경로조각으로 나뉜다.

파라미터

URL을 사용하는 애플리케이션이 리소스에 접근하려면 프로토콜 파라미터가 필요하다. URL의 파라미터 컴포넌트는 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다. 이 컴포넌트는 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ';' 문자로 구분하여 URL에 기술한다. 이를 통해 애플리케이션이 리소스에 접근하는데 필요한 어떤 추가 정보든 전달할 수 있다.

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

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

질의 문자열

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

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

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

프래그먼트

리소스의 특정 부분을 가리킬 수 있도록, URL은 리소스 내의 조각을 가리킬 수 있는 프래그먼트 컴포넌트를 제공한다. 예를 들어 URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있다.

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

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

이 예에서 drills라는 프래그먼트는 죠의 컴퓨터 가게 웹 서버에 위치한 /tools.html 웹페이지의 일부를 가리킨다. 그 부분을 'drills'라고 기술하였다.

  1. 사용자가 http://www.joes-hardware.com/tools.html#drills 를 가리키는 링크를 선택한다.
  2. 브라우저는 http://www.joes-hardware.com/tools.html 을 요청한다. (프래그먼트는 서버로 보내지 않는다.)
  3. 서버는 전체 HTML 페이지를 반환한다.
  4. 브라우저는 'drills' 프래그먼트로 시작하는 HTML 페이지를 보여준다. (브라우저는 'drills' 프래그먼트에 시작부로 스크롤을 내린다.)

단축 URL

상대 URL은 리소스 안에 있는 리소스를 간결하게 기술하는데 사용할 수 있다.

상대 URL

URL은 상대 URL과 절대 URL 두 가지로 나뉜다. 상대 URL은 URL을 짧게 표기하는 방식이다. 상대 URL 문법에 따르면, HTML 작성자는 URL에 스킴과 호스트 그리고 다른 컴포넌트들을 모두 입력하지 않아도 된다. 그 정보는 컴포넌트가 포함된 리소스의 기저 URL에서 알아낼 수 있다.

  • 기저 URL : 변환 과정의 첫 단계는 기저 URL을 찾는 것이다. 기저 URL은 상대 URL의 기준이 된다.
  • 리소스에서 명시적으로 제공 : 어떤 리소스들은 기저 URL을 명확하게 기술하기도 한다. 예를 들어 HTML 문서에서는 그 안에 있는 모든 상대 URL을 변경하기 위해서 기저 URL을 가리키는 <BASE> HTML 태그를 기술할 수 있다.
  • 리소스를 포함하고 있는 기저 URL : 만약 상대 URL이 기저 URL이 명시되지 않은 리소스에 포함된경우, 해당 리소스의 URL을 기저 URL로 쓸 수 있다.
  • 기저 URL이 없는 경우 : 기저 URL이 없는 경우도 있다. 보통 이런 경우는 절대 URL만으로 이루어져 있다는 뜻이다. 하지만 불완전하거나 깨진 URL일 수도 있다.
  • 상대 참조 해석하기
    • 경로는 ./hammers.html. 기저 URL은 http://www.joes-hardware.com/tools.html.
    • 스킴은 비어 있다. 기저 URL의 스킴을 상속받는다. (HTTP)
    • 적어도 한 개의 컴포넌트는 비어 있지 않다. 호스트와 포트 컴포넌트를 상속받는다.
    • 상대 URL(경로: ./hammers.html) 컴포넌트와 상속받은 컴포넌트를(스킴: http, 호스트: www.joes-hardware.com, 포트: 80) 합치면, 새로운 절대 URL인 http://www.joes-hardware.com/hammers.html 을 얻을 수 있다.

URL 확장

어떤 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장한다.

호스트 명 확장

호스트 명 확장 기능을 지원하는 브라우저는 단순한 휴리스틱만을 사용해서 입력한 호스트 명을 전체 호스트 명으로 확장할 수 있다. 예를 들어 주소 입력란에 'yahoo'를 입력하면, 브라우저는 호스트 명에 자동으로 'www.'와 '.com'을 붙여서 'www.yahoo.com'을 만든다.
하지만 호스트 명에 대한 확장 기능은 프락시와 같은 다른 HTTP 애플리케이션에 문자를 발생시킬 수도 있다.

히스토리 확장

사용자가 URL을 입력하는 시간을 줄이고자, 브라우저가 사용하는 또 다른 기술은 과거에 사용자가 방문했던 URL의 기록을 저장해 놓는 것이다. URL을 입력하면, 그 입력된 URL의 앞 글자들을 포함하는 완결된 형태의 URL들을 선택하게 해준다.

안전하지 않는 문자

안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미한다. 전자메일에 사용되는 SMTP 같은 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용한다.
URL 설계자는 사람들이 URL에 이진데이터나 일반적으로 안전한 알파벳 외의 문자도 포함하려고 할 때가 있다는 것을 알게 되었다. 그래서 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 하였다.

URL 문자 집합

US-ASCII는 만들어진 지 오래된 문자 집합이기 때문에, 적은 수의 문자만을 포함하고 있다. 유럽 언어나 비 라틴계 언어들에 존재하는 변형된 문자들까지 지원하지는 않는다. 그뿐만 아니라 URL이 특정 이진 데이터를 포함해야 하는 경우도 있다. 이런 것들을 지원하기 위해서 URL 설계자들은 URL에 이스케이프 문자열을 쓸 수 있게 설계하였다. 이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높였다.

인코딩 체계

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

  • URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그 전에 반드시 인코딩해야 하는 문자 목록
문자선점 및 제한
%인코딩된 문자에 사용할 이스케이프 토큰으로 선점
/경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점
.경로 컴포넌트에서 선점
..경로 컴포넌트에서 선점
#프래그먼트의 구획 문자로 선점
?질의 문자열의 구획 문자로 선점
;파라미터의 구획 문자로 선점
:스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점
$, +선점
@ & =특정 스킴에서 특별한 의미가 있기 때문에 선점
{} | \ ∙ ~ [] '게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한됨
<> "안전하지 않음. 웹 문서에서 URL을 구분지어 표시하듯이 URL 범위 밖에서 역할이 있는 문자
0x00-0x1F, 0x7F제한됨. 이 16진수 범위에 속하는 문자들은 인쇄되지 않는 US-ASCII 문자다.
> 0x7F제한됨. 이 16진수 범위에 속하는 문자들은 7비트 US-ASCII 문자가 아니다.

좀 더 알아보기

애플리케이션은 정해진 방식대로 구현해야 한다. 어떤 애플리케이션에 어떤 URL을 보내든지, 그 전에 클라이언트 애플리케이션에서 안전하지 않거나 제한된 문자를 변환하는 것이 좋다.
해당 문자들을 직접 입력 받는 애플리케이션이야말로 어떤 문자를 인코딩해야 하는지 결정하기에 가장 좋은 위치이다.

스킴의 바다

  • http : 사용자 이름이나 비밀번호가 없다는 것을 제외하고는, 일반 URL 포맷을 지키는 하이퍼텍스트 전송 프로토콜 스킴이다. 포트값이 생략되어 있으면 기본값은 80이다.
  • https : http 스킴과 거의 같다. 다른 점은 https는 HTTP의 커넥션의 양 끝단에서 암호화하기 위해 넷스케이프에서 개발한 보안 소켓 계층(SSL)을 사용한다는 것이다. 문법은 http와 같고 기본 포트값은 443이다.
  • mailto : mailto URL은 이메일 주소를 가리킨다.
  • ftp : 파일 전송 프로토콜 URL은 FTP 서버에 있는 파일을 내려 받거나 올리고, FTP 서버의 디렉터리에 있는 콘텐츠 목록을 가져오는 데 사용할 수 있다.
  • rtsp, rtspu : RTSP URL은 실시간 스트리밍 프로토콜을 통해서 읽을 수 있는 오디오 및 비디오와 같은 미디어 리소스 식별자이다.
  • file : file 스킴은 주어진 호스트 기기에서 바로 접근할 수 있는 파일들을 나타낸다.
  • news : news 스킴은 RFC 1036에 정의된 바와 같이 특정 문서나 뉴스 그룹에 접근하는데 사용한다.
  • telnet : telnet 스킴은 대화형 서비스에 접근하는데 사용한다.

미래

URL은 강력한 도구다. URL은 세상에 존재하는 모든 객체에 이름을 지을 수 있고, 새로운 포맷을 쉽게 추가할 수 있게 설계됐다. URL은 인터넷 프로토콜 간에 공유할 수 있는 일관된 작명 규칙을 제공한다.
하지만 URL이 완벽한 것은 아니다. 사실 URL은 주소이지 실제 이름은 아니다. 이는 URL이 특정 시점에 어떤 것이 위치한 곳을 알려준다는 것을 뜻한다. URL은 리소스를 찾는데 필요한 포트와 서버 이름을 제공한다. 이런 스킴의 단점은 리소스가 옮겨지면 URL을 더는 사용할 수 없다는 것이다.

URN은 객체가 옮겨지더라도(웹 서버 내에서나 웹 서버 간 모두) 항상 객체를 가리킬 수 있는 이름을 제공한다. 지속 통합 자원 지시자 (PURL)을 사용하면 URL로 URN 기능을 제공할 수 있다.

  1. 실제 URL이 무엇인지 리소스 리졸버에게 묻는다. 리졸버로부터 리소스의 현재 위치를 받는다.
  2. 실제 URL로 리소스를 가져온다.
profile
Software Developer

0개의 댓글