URL
URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 나타냅니다.
대부분의 URL은 동일한 구조로 이루어져 있습니다.
때문에 인터넷상의 모든 리소스를 가리키고 가져오기 위해, 그리고 모든 사람이 같은 방식으로 이름을 써서 리소스를 찾을 수 있도록, 단일 방식의 작명 규칙을 가집니다.
1. URL 구성
URL은 세부분으로 나눌 수 있습니다.
https://sports.news.naver.com/kbaseball/index
위의 주소를 예시로 들어보겠습니다.
- 첫 번째 부분인 https://는 스킴이라 불립니다.
스킴은 웹 클라이언트가 리소스에 어떤 프로토콜로 접근하는지 알려줍니다. - 두 번째 부분인 sports.news.naver.com는 서버의 위치입니다.
위치는 웹 클라이언트에게 리소스가 어디에 호스팅 되어 있는지 알려줍니다. - 세 번째 부분인 /kbaseball/index는 리소스의 경로입니다.
경로는 서버에게 웹 클라이언트가 요청한 리소스가 무엇인지 알려줍니다.
2. URL 문법
URL 문법은 스킴에 따라 달라지지만, 대부분의 URL은 일반 문법을 사용하기 때문에, 서로 다른 URL 스킴도 형태의 문법면에서 매우 유사합니다.
대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉩니다.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
이 모든 컴포턴트를 가지는 URL은 거의 없습니다.
이 중에서 가장 중요하게 생각하는 컴포넌트는 스킴, 호스트, 경로 입니다.
2.1 스킴
스킴은 주어진 리소스에 어떻게 접근하는지 알려주는 중요한 정보입니다.
이는 URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려줍니다.
2.2 사용자 이름과 비밀번호
많은 서버가 자신이 가지고 있는 데이터에 접근을 허용하기 전에 사용자 이름과 비밀번호를 요구합니다.
ftp://ftp.prep.ai.mit.edu/pub/gnu
예를들어, 위 URL는 사용자 이름과 비밀번호를 요구하는 FTP 프로토콜을 사용하고 있습니다.
위 URL처럼 사용자 이름과 비밀번호를 요구하는 URL 스킴을 사용할 때, URL에 그 값들이 들어 있지 않다면, 기본 사용자 이름과 비밀번호가 값으로 들어가게 됩니다.
2.3 호스트와 포트
애플리케이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 합니다.
호스트와 포트는 그 정보들을 제공합니다.
호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킵니다.
같은 호스트여도 호스트명과 IP 주소로 나타내는 두가지 방법이 있습니다.
포트 컴퍼넌트는 서버가 열어놓은 네트워크 포트를 가리킵니다.
내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용합니다.
2.4 경로
경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려줍니다.
HTTP URL에서는 '/' 문자를 기준으로 경로조각으로 나뉩니다.
각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있습니다.
2.5 파라미터
파라미터 컴포넌트는 '키=값' 쌍의 리스트로 URL 나머지 부분들로부터 ';' 문자로 구분합니다.
이를 통하여 애플리케이션이 리소스에 접근하는데 필요한 어떤 추가 정보든 전달할 수 있습니다.
http://www.daco/info;type=a/index.html;graphics=true
위의 URL를 예시로 들면, info 경로조각에는 값이 a인 type 파라미터와 index.html 경로조각에는 값이 true인 graphics 파라미터를 가지고 있습니다.
2.6 질의
질의 컴포넌트는 데이터베이스 같은 서비스들이 요청받을 리소스 형식의 범위를 좁히기 위해서 사용됩니다.
URL에서 '?' 문자 뒤에 있는 값들입니다.
질의 컴포넌트 포맷은 사용하면 안되는 특정 문자들을 제외하면 제약사항은 없습니다.
그렇지만 편의상 많은 게이트웨이가 '&' 문자로 나뉜 '키=값' 쌍 형식을 원합니다.
http://www.daco/info/index.html?item=1&color=black
위의 예시 URL에는 item=1, color=black이라는 두 개의 질의 컴포넌트가 있습니다.
2.7 프래그먼트
프래그먼트 컴포넌트는 리소스의 특정 부분을 가리킬 수 있도록 해줍니다.
즉, URL은 HTML 문서에 있는 특정 이미지나 일부분을 가리킬 수 있습니다.
URL에서 '#' 문자에 이어서 옵니다.
일반적으로 HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에 클라이언트는 서버에 프래그먼트를 전달하지 않습니다.
http://www.daco/info/index.html#intro
위의 예시 URL는 intro라는 프래그먼트 컴포넌트가 있습니다.
브라우저는 서버로부터 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 보고자 하는 리소스의 일부를 보여줍니다.
※ 예시로 더 설명드리자면, 웹 페이지에서 info라는 리소스가 있는 곳으로 스크롤이 이동하는 것입니다.
3. 단축 URL
웹 클라이언트는 몇몇 단축 URL을 인식하고 사용합니다.
상대 URL은 리소스 안에 있는 리소스를 간결하게 기술하는데 사용할 수 있습니다.
많은 브라우저가 사용자가 기억하고 있는 URL 일부를 입력하면 나머지 부분을 자동으로 입력해주는 URL 자동 확장을 지원합니다.
3.1 상대 URL
URL은 상대 URL과 절대 URL로 2가지로 나뉩니다.
2. URL 문법에서 다뤘던 URL은 모두 절대 URL 입니다.
절대 URL은 접근하는데 필요한 모든 정보를 가지고 있습니다.
그와 달리 상대 URL은 모든 정보를 담고 있지는 않습니다.
상대 URL로 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는 기저(base)라는 다른 URL을 사용해야 합니다.
상대 URL은 프래그먼트이거나 URL 일부입니다.
URL을 처리하는 브라우저 같은 애플리케이션은 상대 URL과 절대 URL 간에 상호 변환할 수 있어야 합니다.
상대 URL을 사용하면 HTML 페이지 같은 리소스 집합을 쉽게 변경할 수 있습니다.
3.2 URL 확장
어떤 브라우저들은 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장합니다.
자동으로 URL이 확장되기 때문에 사용자는 URL 전체를 타이핑하지 않아도 URL을 빠르게 입력하게 도와줍니다.
확장 기능은 호스트 명 확장, 히스토리 확장 두 가지로 나뉩니다.
3.2.1 호스트 명 확장
호스트 명 확장 기능을 지원하는 브라우저는 단순한 휴리스틱만을 사용해서 입력한 호스트명을 전체 호스트 명으로 확장할 수 있습니다.
예를 들어, 주소 입력란에 'naver'을 입력하면, 브라우저는 호스트 명에서 자동으로 'www.'와 '.com'을 붙여서 'www.naver.com'을 만들어줍니다.
※ 어떤 브라우저는 'naver'란 단어를 포함한 사이트를 찾지 못하면, 확장을 포기하기 전에 몇 가지의 URL을 추가로 제시합니다.
3.2.2 히스토리 확장
히스토리 확장은 과거에 사용자가 방문했던 URL의 기록을 저장해 놓은 것을 이용한 것입니다.
예를 들어, 이전에 방문 했던 URL의 시작 부분을 입력하면, 브라우저가 전체 URL를 보여주고 사용자가 선택 하는 것입니다.
4. 안전하지 않은 문자
안전한 전송이란, 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것을 의미합니다.
전자메일에 사용되는 SMTP같은 프로토콜은 특정 문자를 제거할 수도 있는 전송 방식을 사용합니다.
※ 7비트 인코딩을 사용하고 있는 프로토콜에 8비트 이상으로 인코딩된 정보가 있으면 소실될 수 있습니다.
그렇기에 URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함하도록 허락했습니다.
하지만 이후에 URL에 이진데이터나 안전한 알파벳 외의 문자도 포함하기 위해 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 됐습니다.
4.1 URL 문자 집합
역사적으로 많은 컴퓨터 애플리케이션이 US-ASCII 문자 집합을 사용해왔습니다.
US-ASCII는 7비트를 사용하여 영문 자판에 있는 키 대부분과 몇몇 출력되지 않는 제어 문자를 표현합니다.
US-ASCII는 적은 수의 문자만을 포함하고 있어서 지원하지 못하는 언어들이 존재했고, 이진 데이터를 포함해야하는 경우도 있었기 때문에 이를 지원하기 위해 이스케이프 문자열이 생겼습니다.
이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높였습니다.
4.2 인코딩 체계
안전하지 않은 문자를 '%'로 시작해, ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 이스케이프 문자로 바꿉니다.
※ 이스케이프 문자로 바꾸기 위한 '%' 가 아닌 '%'를 그대로 보여주기 위해 사용할 땐 %25로 바꿉니다.
4.3 문자 제한
몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있습니다.
그렇기에 URL에서 예약된 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그 전에 반드시 이스케이프 인코딩을 해야 합니다.
마치며..
이번 글에서는 URL에 대해 다루었습니다.
개인적으로 이글에서
- URL 구성과 문법이 어떻게 되어있는지,
- 상대 URL과 기저 URL과 절대 URL이 무엇인지,
- URL 확장에는 무엇이 있는지,
- 이스케이프 용도는 무엇인지
를 알아 가셨으면 좋겠습니다.
부족한 글을 읽어주셔서 감사합니다 ^-^