Published:
Updated:

HTTP 완벽 가이드 책을 보고 정리한 글입니다.


URL 문법

  • URL로 인터넷상의 모든 리소스를 찾을 수 있지만
    • 그 리소스들은 다른 스킴(예를 들어 HTTP, FTP, SMTP)을 통해 접근할 수 있으며
    • URL 문법은 스킴에 따라서 달라짐
  • 대부분의 URL은 일반 URL 문법을 따르며
    • 서로 다른 URL 스킴도 형태와 문법 면에서 매우 유사함
  • 대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉨
    • <스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>


스킴: 사용할 프로토콜

  • 스킴은 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보
    • 이는 URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려줌
  • 스킴 컴포넌트는 알파벳으로 시작해야 하고 URL의 나머지 부분들과 첫 번째 : 문자로 구문함
  • 스킴 명은 대소문자를 가리지 않으므로 http://HTTP://는 같음


호스트와 포트

  • 애플리케이션이 인터넷에 있는 리소스를 찾으려면
    • 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어딘지 알아야 함
    • URL의 호스트와 포트 컴포넌트는 이 두가지 정보를 제공해줌
  • 호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킴
    • 해당 값은 위에서와 같이 호스트 명이나 IP 주소로 제공함
  • 포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킴
    • 내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트를 80을 사용함


사용자 이름과 비밀번호

  • 더 흥미로운 컴포넌트는 사용자 이름과 비밀번호 컴포넌트임
    • 많은 서버가 자신이 가지고 있는 데이터에 접근을 허용하기 전에 사용자 이름과 비밀버호를 요구함
  • FTP 서버가 좋은 예이고 아래와 같음
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous@ftp.prep.ai.mit.deu/pub/gnu
ftp://anonymous:my_passwd@ftp.prep.ai.mit.deu/pub/gnu
http://joe:joespasswd@www.joes-hardware.com/sales_info.txt
  • 첫 번째 예는 사용자 이름이나 비밀번호 컴포넌트가 없이 표준 스킴, 호스트, 경로만 존재
    • 애플리케이션이 FTP와 같이 사용자 이름과 비밀번호를 요구하는 URL 스킴을 사용한다면
      • 그 값들이 삽입되어 있지 않을 경우 기본 사용자 이름과 비밀번호 값을 넣어놓을 것임
    • 예를 들어, 사용자 이름과 비밀번호를 기술하지 않고 FTP URL에 접근하면
      • 기본 사용자 이름 값으로 anonymous가, 비밀번호는 브라우저마다 가지고 있는 기본값을 사용
  • 두 번째 예에서는 사용자 이름이 anonymous로 되어 있음
  • 호스트 컴포넌트와 나란히 기술되어 있는 사용자 이름은 단순한 이메일 주소처럼 보이기도 함
    • @ 문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리함
  • 세 번째 예는 사용자 이름(anonymous)과 비밀번호(my_passwd)를 : 문자로 분리하여 모두 기술함


경로

  • URL의 경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려줌
    • 해당 경로는 아래 예와 같이 파일 시스템 경로와 유사한 구조를 가짐
http://www.joes-hardware.com:80/seasonal/index-fail.html
  • 이 URL 경로는 /seasonal/index-fail.html로 유닉스 파일 시스템의 파일 경로와 유사함
    • 경로는 서버가 리소스의 위치를 찾는데 사용하는 정보
  • HTTP URL에서 경로 컴포넌트는 / 문자를 기준으로 경로 조각으로 나뉨
    • 각 경로 조각은 자체만의 파라미터 컴포넌트를 가질 수 있음


파라미터

  • 많은 스킴이 객체에 대한 호스트 및 경로 정보만으로는 리소스를 찾지 못함
    • 서버가 어떤 포트를 열어놓고 있는지, 리소스에 접근하기 위해 사용자 이름과 비밀번호를 명시했는지 여부 외에도 많은 프로토콜이 더 많은 정보를 요구함
  • URL을 사용하는 애플리케이션이 리소스에 접근하려면 프로토콜 파라미터가 필요함
    • 프로토콜 파라미터가 없으면, 다른 한편에 있는 서버는 그 요청을 잘못 처리하거나 처리를 하지 않을 것임
  • URL의 파라미터 컴포넌트는 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는 데 사용
    • 이 컴포넌트는 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ; 문자로 구분하여 URL에 기술
      • 이를 통해 애플리케이션이 리소스에 접근하는 데 필요한 어떤 추가 정보든 전달할 수 있음


질의 문자열

  • 데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁히기 질문이나 질의를 받을 수 있음
http://www.joes-hardware.com/inventory-check.cgi?item=12731
  • ?의 우측에 있는 값들을 질의 컴포넌트라고 부름
    • URL의 질의 컴포넌트는 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달하고 있음
  • 보통 게이트웨이는 다른 애플리케이션에 접근하려고 할 때 거치는 통로라고 할 수 있음


프래그먼트

  • HTML 같은 리소스 형식들은 본래의 수준보다 더 작게 나뉠 수 있음
  • 리소스의 특정 부분을 가리킬 수 있도록, URL은 리소스 내의 조각을 가리킬 수 있는 프래그먼트 컴포넌트를 제공함
    • 예를 들어 URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있음
  • 프래그먼트는 아래와 같이 URL의 오른쪽에 # 문자에 이어서 옴
http://www.joes-hardware.com/tools.html#drills
  • 위 예에서 drills라는 프래그먼트는 죠의 컴퓨터 가게 웹 서버에 위치한 /tools.html 웹페이즈의 일부를 가리킴
  • 일반적으로 HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에, 클라이언트는 서버에 프래그먼트를 전달하지 않음
  • 브라우저가 서버로부터 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 당신이 보고자 하는 리소스의 일부를 보여줌


단축 URL

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


상대 URL

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


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


  • 상대 URL은 프래그먼트이거나 URL 일부임
  • URL을 처리하는 브라우저 같은 애플리케이션은 상대 URL과 절대 URL 간에 상호 변환을 할 수 있어야 함
    • 상대 URL을 사용하면 리소스 집합(HTML 페이지 같은)을 쉽게 변경할 수 있음
  • 문서 집합의 위치를 변경하더라도, 새로운 기저 URL에 의해서 해석될 것이기 떄문에 위치를 변경하더라도 잘 동작할 것임
    • 이는 마치 다른 서버에 있는 콘텐츠를 미러링 할 수 있게 허용하는 것과 유사함

기저 URL

  • 변환 과정의 첫 단계는 기저 URL을 찾는 것
  • 기저 URL은 상대 URL의 기준이 됨
  • 이것을 가져오는 몇 가지 방법이 있음


  • 리소스에서 명시적으로 제공
    • 어떤 리소스들은 기저 URL을 명확하게 기술하기도 함
    • HTML 문서에서는 그 안에 있는 모든 상대 URL을 변경하기 위해서 기저 URL을 가리키는 <base> HTML 태그를 기술할 수 있음


  • 리소스를 포함하고 있는 기저 URL
    • 만약 상대 URL이 기저 URL이 명시되지 않은 리소스에 포함된 경우, 해당 리소스의 URL을 기저 URL로 쓸 수 있음


  • 기저 URL이 없는 경우
    • 이런 경우는 절대 URL만으로 이루어져 있다는 뜻임
  • 하지만 불완전하거나 깨진 URL일 수도 있음


상대 참조 해석하기

  • 상대 URL을 절대 URL로 변환하기 위한 다음 단계는 상대 URL과 기저 URL을 각각의 컴포넌트 조각으로 나누는 것
    • 이것은 URL을 파싱하는 것에 불과하지만, 컴포넌트 단위로 분리한다는 점에서 이 작업을 URL 분해하기라고 부르기도 함
  • 기저 URL과 상대 URL을 컴포넌트로 분해하고 나면, 변환을 끝내기 위해 어떤 알고리즘을 사용함 (39쪽)
    • 이 알고리즘은 상대 URL을 리소스를 참조하는 데 사용할 수 있는 절대 경로 형태로 변환함


URL 확장

  • 어떤 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장함
    • 이는 사용자가 URL을 빠르게 입력할 수 있게 도와줌
    • 자동으로 URL이 확장되기 때문에 URL 전체를 입력하지 않아도 됨
  • 이러한 확장 기능은 두 가지로 나뉨

호스트 명 확장

  • 호스트 명 확장 기능을 지원하는 브라우저는 단순한 휴리스틱만을 사용해서 입력한 호스트 명을 전체 호스트 명으로 확장할 수 있음
    • 예를 들어 주소 입력란에 yahoo를 입력하면, 브라우저는 호스트 명에 자동으로 www..com을 붙여서 www.yahoo.com을 만듦.
  • 브라우저는 이런 간단한 기능을 제공하여 사용자의 시간을 절약하고 혼란을 막아줌
    • 하지만 호스트 명에 대한 확장 기능은 프록시와 같은 다른 HTTP 애플리케이션에 문제를 발생시킬 수 있음

히스토리 확장

  • 사용자가 URL을 입력하는 시간을 줄이고자 브라우저가 사용하는 또 다른 기술은
    • 과거에 사용자가 방문했던 URL의 기록을 저장해 놓는 것
  • URL을 입력하면, 그 입력된 URL의 앞 글자들을 포함하는 완결된 형태의 URL들을 선택하게 해줌
  • 따라서 http://www.joes-와 같이 이전에 방문했던 URL의 시작 부분을 입력하면
    • 브라우저는 http://www.joes-hardware.com을 보여줄 것임
    • 그러면 사용자는 전체 URL을 입력하는 대신 선택만 하면 됨
  • 프록시를 사용할 경우 URL 자동확장 기능은 다르게 동작할 수 있다는 것을 유념해야 함

Leave a comment