도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다.
URL의 정의
- 리소스의 위치를 가리킨다.
- URL을 통해 리소스를 찾고, 사용하고, 공유할 수 있다.
- URI의 한 부분이다.
URL의 문법
스킴, 사용자 이름, 비밀번호, 호스트, 포트, 경로, 파라미터, 질의, 프래그먼트 컴포넌트가 있다.
스킴
URL을 해석하는 애플리케이션이 어떤 프로토콜을 사용하여 리소스를 요청해야 하는지 알려준다.
특징
- 알파벳으로 시작한다.
- URL의 시작 부분이다. ':' 문자 이전까지이다.
- 대소문자를 구분하지 않는다.
스킴별 특징
스킴 | 특징 |
http | HTTP용 스킴 기본 포트 값: 80 형식: http://<호스트>:<포트>/<경로>?<질의>#<프래그먼트> 예: http://github.com/kkumta/Time-Deal-Shop/blob/main/README.md |
https | HTTP 커넥션의 양 끝단에서 암호화를 위해 SSL을 사용한 스킴 기본 포트 값: 443 형식: https://<호스트>:<포트>/<경로>?<질의>#<프래그먼트> 예: https://github.com/kkumta/Time-Deal-Shop/blob/main/README.md |
mailto | 이메일 주소용 스킴으로, 표준 URL과는 다른 포맷을 가진다. 형식: mailto: <RFC-522-addr-spec> 예: mailto:dasomchoi52@gmail.com |
ftp | 파일 전송용 프로토콜(FTP)용 스킴 형식: ftp://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터> 예: ftp://anonymous:pwpw123@ftp.example.com:21/image;type=a |
file | 주어진 호스트 기기에서 바로 접근할 수 있는 파일을 나타낸다. 호스트가 생략되어 있으면 로컬 호스트가 기본이 된다. 형식: file://<호스트>/<경로> 예: file://C:/abcde.pdf |
호스트와 포트
- 호스트: 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킨다. 호스트 명(www.naver.com)이나 IP 주소(125.209.222.141)로서 제공한다.
- 포트: 서버가 열어놓은 네트워크 포트를 가리킨다.
사용자 이름과 비밀번호
- 어떤 서버는 데이터 접근을 허용하기 전에 사용자 이름과 비밀번호를 요구한다.
- 사용자 이름과 비밀번호를 기술하지 않고 FTP URL에 접근하면, 기본 사용자 이름으로 'anonymous', 비밀번호로 브라우저마다 가지고 있는 기본값을 사용한다.
- 사용자 이름과 비밀번호는 '@' 문자 이전에 기술되고, 사용자 이름과 비밀번호는 ':' 문자로 구분된다.
경로
- 리소스가 서버의 어디에 있는지 알려 준다.
- '/' 문자를 기준으로 경로조각으로 나뉘며, 각 경로조각은 각각의 파라미터를 가질 수 있다.
파라미터
- 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는 데 사용한다.
- 이름/값 쌍의 리스트로 ';' 문자로 구분된다.
- 이를 통해 리소스에 접근하는 데 필요한 어떤 추가 정보든 전달할 수 있다.
- 각 경로조각마다 가질 수 있다.
질의 문자열
- 데이터베이스를 사용하는 서비스에서 사용한다.
- 요청받을 리소스의 범위를 줄이기 위해 사용한다.
- 편의상 많은 게이트웨이가 '&'로 나뉜 '이름=값' 쌍 형식의 질의 문자열을 사용한다.
프래그먼트
- HTML, MD 같은 리소스 형식들은 더 작게 나뉠 수 있다. 즉, 한 리소스 안의 특정 부분을 가리킬 수 있다.
- 프래그먼트는 URL이 리소스 내의 특정 부분을 가리킬 수 있도록 한다.
- URL의 가장 오른쪽에 '#' 문자 이후에 온다.
- HTTP 서버는 객체 중 일부가 아닌 객체 전부를 한 번에 다루기 때문에, 클라이언트는 서버에 프래그먼트를 전달하지 않는다. 브라우저는 서버로부터 전체 리소스를 내려받은 후, 프래그먼트 정보를 사용해서 사용자가 보고자 하는 리소스의 특정 부분을 보여준다.
절대 URL과 상대 URL
절대 URL | 리소스에 접근하는 데 필요한 모든 정보를 담고 있다. |
상대 URL | - URL을 짧게 표기하는 방식이다. - 리소스에 접근하는 데 필요한 모든 정보를 담고 있지 않으므로, 기저 URL을 사용한다. - HTML을 작성하는 것을 기준으로 했을 때, URL에 스킴, 호스트 등을 작성하지 않아도 된다. 작성되지 않은 정보는 기저 URL에서 가져온다. - URL의 일부 또는 프래그먼트이다. |
URL 확장
브라우저가 URL을 입력한 다음이나 입력하고 있는 동안에 자동으로 URL을 확장하는 것
호스트 명 확장
- 입력한 호스트 명을 전체 호스트 명으로 확장한다.
- 예를 들어, 주소 입력란에 'naver'를 입력하면 브라우저가 호스트 명으로 자동으로 'www.naver.com'을 만드는 것이다.
- 프락시와 같은 다른 HTTP 애플리케이션에 문제를 발생시킬 수 있다.
히스토리 확장
- 과거에 사용자가 입력했던 URL 기록을 저장해두는 것이다.
- URL을 입력하면, 그 입력된 URL의 앞 글자들을 포함하는 완결된 형태의 URL들을 선택하게 해 준다.
- 프락시를 사용할 경우 다르게 동작할 수 있다.
안전하지 않은 문자
URL 설계자가 사람들이 URL에 안전하지 않은 문자를 포함하려고 할 때가 있다는 것을 알게 된다.
-> 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 한다.
인코딩
안전하지 않은 문자를 이스케이프 문자로 바꾼다. 옥텟 단위로 묶어서, 16진수 값으로 인코딩한다.
이스케이프 문자는 '%' + 아스키 코드로 표현되는 두 개의 16진수 숫자로 구성된다.
본래의 목적이 아닌 용도로 사용하기 위해 무조건 인코딩해야 하는 문자 모음
문자 | 이유 |
% | 인코딩된 문자에 사용할 이스케이프 토큰으로 선점 |
/ | 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점 |
. .. | 경로 컴포넌트에서 선점 |
# | 프래그먼트의 구획 문자로 선점 |
? | 질의 문자열의 구획 문자로 선점 |
; | 파라미터의 구획 문자로 선점 |
: | 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점 |
$ , + | 선점 |
@ & = | 특정 스킴에서 특별한 의미가 있다. |
{ } | \ · ~ [ ] ` | 여러 전송 에이전트에서 불안전하게 다루기 때문에 안전하지 않다. |
< > " | URL 범위 밖에서 역할이 있는 문자이기 때문에 안전하지 않다. |
'CS > Network' 카테고리의 다른 글
HTTP: 웹 서버 (0) | 2023.03.13 |
---|---|
HTTP: HTTP 메시지 (0) | 2023.03.06 |
HTTP: HTTP 개관 (0) | 2023.02.22 |
쿠키와 세션, 그리고 JWT (0) | 2022.11.07 |
네트워크: 주소창에 특정 URL을 입력하면 일어나는 일 (0) | 2022.07.14 |