[Network] URL 문법, 단축 URL 정리
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
가, 비밀번호는 브라우저마다 가지고 있는 기본값을 사용
- 기본 사용자 이름 값으로
- 애플리케이션이 FTP와 같이 사용자 이름과 비밀번호를 요구하는 URL 스킴을 사용한다면
- 두 번째 예에서는 사용자 이름이
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에 기술- 이를 통해 애플리케이션이 리소스에 접근하는 데 필요한 어떤 추가 정보든 전달할 수 있음
- 이 컴포넌트는 이름/값 쌍의 리스트로 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과 상대 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