[HTTP 완벽 가이드 - ch.2] - URL과 리소스

늘보·2022년 1월 17일
1

HTTP 완벽 가이드

목록 보기
2/2
  • URL은 Uniform Resource Locator의 약자로, 인터넷의 리소스를 가리키는 표준 이름이다.

  • URL은 웹 상의 리소스가 어디에 있고 어떻게 접근할 수 있는지 알려주는 역할

인터넷의 리소스 탐색하기

URL을 사용하면 리소스를 일관된 방식으로 지칭할 수 있다. 대부분의 URL은 동일하게 '스킴://서버위치/경로' 구조로 이루어져 있다. 따라서 인터넷상의 모든 리소스를 가리키고 가져오기 위해, 그리고 모든 사람이 같은 방식으로 이름을 써서 리소스를 찾을 수 있도록, 단일 방식의 작명 규칙을 가진 것이다. 하지만 처음부터 일관된 명명 방식이 있던 것은 아니었다.

URL 문법

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

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

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

  • 스킴: 리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다. (기본값 X)

  • 사용자 이름: 몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름을 필요로 한다. (기본값 anonymous)

  • 비밀번호: 사용자의 비밀번호 (기본값 <이메일 주소>)

  • 호스트: 리소스를 호스팅하는 서버의 호스트명이나 IP 주소 (기본값 X)

  • 포트: 리소스를 호스팅하는 서버가 열어놓은 포트번호. 많은 스킴이 기본 포트를 가지고 있다. HTTP의 기본 포트는 80이다. (기본값: 스킴에 따라 다름)

  • 경로: 서버 내 리소스가 어디 있는지 가리킴(스킴에 따라 다름)

  • 파라미터: 특정 스킴들에서 파라미터를 기술하는 용도로 사용한다. 이름/값을 쌍으로 가진다. (기본값 X)

  • 질의: 스킴에서 애플리케이션에 파라미터를 전달하는데 쓰인다. URL의 끝에 '?'로 구분한다. (기본값 X)

  • 프래그먼트: 리소스의 조각이나 일부분을 가리키는 이름이다. 클라이언트에서만 사용하고, URL의 끝에 '#' 문자로 구분한다.

1. 스킴: 사용할 프로토콜

  • 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보

  • 스킴 컴포넌트는 알파벳으로 시작해야 하고 URL의 나머지 부분들과 ':'문자로 구분한다.

  • 스킴명은 대소문자를 가리지 않는다.

2. 호스트와 포트

애플리케이션이 인터넷에 있는 리소스를 찾으려면

  • 리소스를 호스팅하고 있는 장비와

  • 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 한다.

URL의 호스트와 포트 컴포넌트는 이 두 가지 정보를 제공해준다.

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

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

3. 사용자 이름과 비밀번호

  • 애플리케이션이 FTP 서버처럼 사용자 이름과 비밀번호를 요구하는 URL 스킴을 사용할 때, 그 값들이 삽입되지 않을 경우 기본 값을 넣어 놓는다.

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

  • ':' 문자로 사용자 이름과 비밀번호를 연결

4. 경로

  • URL의 경로 컴포넌트는 리소스가 있는 서버의 위치를 알려줌.

  • 계층적 파일 시스템 구조와 유사한 형태
    -> http://www.joes-hardware.com:80/seasonal/index-fall.html

  • 위 URL의 경로는 /seasonal/index-fall.html로 유닉스 파일 시스템의 파일 경로와 유사하다.

  • HTTP URL에서 경로 컴포넌트는 '/'를 기준으로 경로 조각으로 나뉘고, 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.

5. 파라미터

  • 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용

  • 이름/값 쌍의 리스트로, URL 나머지 부분들로부터 ‘;’로 구분하여 URL에 기술

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

// 이름: type
// 값: type=d 
// 한개의 파라미터 전달

6. 질의 문자열

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

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

// item 번호 12731의 재고가 있는 확인하기 위해 웹 DB 게이트웨이에 질의하는데 사용됨

이는 일반적으로 요청해오던 URL과 거의 유사하다. 다른 점은 물음표 우측에 있는 값들인데, 이를 질의 컴포넌트라고 부른다.

https://stackoverflow.com/search?q=github
  • URL의 질의 컴포넌트는 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달
  • 위 질의는 stack overflow 검색창에 ‘github’라고 입력했을 때의 결과인데, 질의 컴포넌트로 q=github이 쓰였음을 알 수 있음
  • 편의상 많은 게이트웨이가 ‘&’로 나뉜 ‘이름=값’ 쌍 형식의 질의 문자열을 활용

7. 프래그먼트

  • 리소스의 특정 부분을 가리킬 수 있도록, URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있음
  • 프래그먼트는 URL의 오른쪽에 ‘#’ 문자에 이어서 존재
  • 일반적으로 HTTP 서버는 객체의 일부가 아닌 전체만 다루기 때문에 클라이언트는 서버에 프래그먼트를 전달하지 않음
  • 브라우저가 서버로부터 전체 리소스를 내려 받은 후, 프래그먼트를 사용하여 사용자가 보고자 하는 리소스의 일부를 보여줌

단축 URL

URL은 상대 URL과 절대 URL 두 가지로 나뉜다. 지금까지 우리가 확인한 건 절대 URL뿐이다. 절대 URL은 리소스에 접근하는데 필요한 모든 정보를 담고 있다.

1. 상대 URL

상대 URL은 모든 정보를 담고 있지는 않다.(URL을 짧게 표기하는 방식) 상대 URL로 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는, 기저(base)라고 하는 다른 URL을 사용해야 한다.

기저 URL을 제외한 부분을 서술한 것이라고 생각하면 쉬움.

http://www.joes-hardware.com # 기저 URL
./hammers.html # 상대 URL
=> http://www.joes-hardware.com/hammers.html # 새로운 절대 URL

상대 URL은 프래그먼트이거나 URL 일부다. URL을 처리하는 브라우저 같은 애플리케이션은 상대 URL과 절대 URL 간에 상호 변환을 할 수 있어야 한다.

상대 URL을 사용하면 리소스 집합(ex: HTML 페이지)을 쉽게 변경할 수 있다. 그리고 문서 집합의 위치를 변경하더라도, 새로운 기저 URL에 의해서 해석될 것이기 때문에 위치를 변경하더라도 잘 동작할 것이다.

상대 URL을 절대 URL로 변환할 수 있는 방법은 아래와 같다.

1) 기저 URL 찾기

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

(1) 리소스에서 명시적으로 제공

  • HTML 문서에서 <a> 태그 같은 곳 안에 명시적으로 표시해주기

(2) 리소스를 포함하고 있는 기저 URL

  • 만약 상대 URL이 이전에 봤던 예시와 같이 기저 URL이 명시되지 않은 리소스에 포함된 경우, 해당 리소스의 URL을 기저 URL로 쓸 수 있다.

(3) 기저 URL이 없는 경우
기저 URL이 없는 경우도 있다. 보통 이런 경우는 절대 URL만으로 이루어져 있다는 뜻이지만 불완전하거나 깨진 URL일 수도 있다.

2) 상대 참조 해석하기 (=URL 분해하기)

기저 URL을 찾았으면 다음 단계는 상대 URL과 절대 URL을 각각 컴포넌트 조각으로 분리하는 것(사실상 URL을 파싱하는 것)이다. (=URL 분해하기) 상대 URL을 절대 경로 형태로 변환하는 알고리즘에 따라 변환한다.

간단하게 말하면, 스킴, 컴포넌트, 파라미터 등이 부재일 경우 기저 URL의 것을 상속

상대 URL이 절대 URL로 파싱되는 과정을 예시를 통해 확인해보자.

  • 상대 URL: ./hammers.html

  • 기저 URL: http://www.joes-hardware.com/tools.html

1) 스킴은 비어 있다. 알고리즘에 따라 기저 URL의 스킴을 상속받는다.(HTTP를 상속 받음)

2) 적어도 한 개의 컴포넌트는 비어 있지 않다. 이후 호스트와 포트 컴포넌트를 상속 받는다.

  • 상대 URL: ./hammers.html

  • 상속 받은 스킴: http

  • 상속 받은 호스트: www.joes-hardware.com

  • 상속 받은 포트: 80

  1. 상대 URL 컴포넌트와 상속 받은 컴포넌트를 합치면, 새로운 절대 URL인 http://www.joes-hardware.com/hammers.html 을 얻을 수 있다.

URL 확장

브라우저는 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장한다. 이는 사용자가 URL을 빠르게 입력하도록 도와준다. 이러한 확장 기능은 두 가지로 나뉜다.

호스트명 확장

예를 들어서, 주소 입력란에 ‘naver’만 입력하면, 브라우저는 호스트명에 자동으로 ‘www.’와 ‘.com’을 붙여서 ‘www.naver.com’을 만들어준다. 이것이 호스트명 확장이다.

  • 특정 브라우저는 확장할 URL을 찾지 못하면 확장을 포기하기 전에 다른 몇 가지의 URL을 추가로 제시한다.

  • 단, 프락시와 다른 HTTP 애플리케이션에 문제 발생 가능성 존재

히스토리 확장

과거 사용자가 방문한 웹 사이트의 기록을 저장해놓고 불러오는 방식

  • URL을 입력하면, 앞 글자들을 포함하는 완결된 형태의 URL을 선택하게 해준다.

  • 예를 들어, www.nav까지 입력하면 브라우저는 www.naver.com을 보여줄 것

안전하지 않은 문자

URL은 잘 호환되도록 설계되었다. 그리고 URL은 인터넷에 있는 모든 리소스가 여러 프로토콜을 통해 전달될 수 있도록, 각 리소스에 유일한 이름을 지을 수 있게 설계되었다. 모든 프로토콜이 데이터를 전송하기 위해서 서로 다른 장치를 가지고 있기 때문에, 어떤 인터넷 프로토콜을 통해서든 안전하게 전송될 수 있도록 URL을 설계하는 것은 중요했다.

안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미한다.

전자메일에 사용되는 SMTP(Simple Mail Transfer Protocol) 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용한다. 따라서 문자가 제거되는 일을 피하고자 URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함하도록 허락한다.

그러나 혹시 모를 이진 데이터나 알파벳 이외의 문자가 입력될 경우를 대비해, 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 하였다.

아래에서, 사용할 수 있는 알파벳과 URL의 인코딩 규칙을 간략히 요약한다.

URL 문자 집합

컴퓨터 시스템의 기본 문자 집합은 보통 영어 중심으로 설정되어 있다. 역사적으로 많은 애플리케이션이 US-ASCII 문자 집합을 사용해왔다. 만들어진 지 오래되어 표현 가능한 문자의 수가 적다는게 단점이다.

추가적으로, URL이 특정 이진 데이터를 포함해야 하는 경우 존재하게 됨에 따라, 이스케이프 문자열을 쓸 수 있도록 설계하였다. 이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높였다.

인코딩 체계

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

가운데(126(0x7E)는 ASCII 코드를 의미한다.

- ~: 126(0x7E) : http://github.yurimkoo.io/%7Eyur 
- 빈 문자: 32 (0x20) : http://github.yurimkoo.io/more%20about.html
- %: 37 (0x25) : http://github.yurimkoo.io/100%25happy.html

yurimkoo님의 블로그를 참조하였습니다.

문자 제한

몇몇 문자는 URL내에서 특별한 의미로 예약되어 있다. 어떤 문자는 US-ASCII의 출력 가능한 문자 집합에 포함되어 있지 않다. 그리고 어떤 문자는 몇몇 인터넷 게이트웨이와 프로토콜에서 혼동되는 것으로 알려져 있어서, 사용이 꺼려지기도 했다.

아래는 예약된 문자를 본래 목저깅 아닌 다른 목적으로 사용하려면, 그 전에 반드시 인코딩 필요한 문자들을 나열해 놓았다.

%	이스케이프 토큰
/	경로 세그먼트 분리
?	질의 문자열 구획 문자
;	파라미터 구획 문자
:	스킴, 이름/비밀번호, 호스트/포트 구획 문자
@,&,=	특정 스킴에서 의미가 있기 때문에 선점
[],~	게이트웨이 등 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한됨

여러 스킴들

이 문단에서는 웹에서 쓰이는 일반 스킴들의 포맷에 대해 알아볼 것이다.. 라고 해봤자, httphttps, ftp만 알아보겠다. 다른 것들은 본 적이 거의 없어서 그렇다(?). 다른 스킴들은 p.44를 참조하자.

  • http : 사용자 이름이나 비밀번호가 없다는 것을 제외하고는, 일반 URL 포맷을 지키는 하이퍼 텍스트 전송 프로토콜(Hypertext Transfer Protocol) 스킴이다. 포트값이 생략되어 있으면 기본값은 80이다.

  • https : https 스킴은 http 스킴과 거의 같다. 다른 점이라고는 https는 HTTP 커넥션의 양 끝단에서 암호화하기 위해 넷스케이프에서 개발한 보안 소켓 계층(Secure Sockets Layer, SSL)을 사용한다는 것뿐이다. 문법은 HTTP와 같고 기본 포트값은 443이다.

  • ftp : 파일 전송 프로토콜(File Transfer Protocol)은 FTP 서버에 있는 파일을 올리거나 내리고, FTP 서버 디렉토리의 콘텐츠 목록을 가져오는데 활용이 가능하다. 웹 애플리케이션은 데이터에 접근하는 용도의 스킴으로 FTP를 사용한다.

미래

URL은 강력한 도구다. URL은 세상에 존재하는 모든 객체에 이름을 지을 수 있고, 새로운 포맷을 쉽게 추가할 수 있게 설계됐다. URL은 인터넷 프로토콜 간에 공유할 수 있는 일관된 작명 규칙을 제공한다.

그러나 특정 시점에 어떤 것이 위치한 곳을 알려주기 때문에, 리소스가 옮겨지면 URL을 더는 사용할 수 없다는 한계가 있다.

이러한 한계를 극복하기 위해 URN(Unfirom Resource Names)이라는 새로운 표준 작업에 착수하였다. URN은 객체가 이동해도 항상 객체를 가리킬 수 있는 이름을 제공한다.

추가적으로, 지속 통합 자원 지시자(Persistent Uniform Resource Locator, PURL)를 사용하면 URL로 URN의 기능을 제공할 수 있다.

그러나 주소 체계를 URL에서 URN으로 바꾸는 건, 너무 큰 변화와 시간이 필요하기 때문에 URL은 당분간 계속 사용될 것이다.

참고 링크

HTTP 완벽 가이드 [1-2] - URL과 리소스

0개의 댓글