이 포스팅은 "HTTP-완벽 가이드" 책을 학습하고 정리한 것입니다.
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=49731592
2.1 인터넷의 리소스 탐색하기
URL은 브라우저(or 클라이언트)가 정보를 찾는데 필요한 리소스의 위치를 가리킨다. URL은 URI의 부분집합이지만, 보통 두 용어를 혼용해서 사용한다. URI의 부분집합 중 다른 것은 URN인데, URN는 현재 그 리소스가 어디에 존재하든 상관없이 그 이름만으로 리소스를 식별하는데 반해, URL은 리소스가 어디 있는지 설명해서 리소스를 식별한다.
URL의 구조는 다음과 같다.
스킴://서버위치/경로
- 스킴 : 리소스 접근 방법(프로토콜)
- 서버위치 : 호스트명 or IP주소
- 경로 : 서버 내 리소스의 위치
흔히 헷갈릴 수 있는게, URL은 다른 프로토콜에서도 사용가능하다는 것이다. 예를 들어 FTP의 경우 아래와 같이 사용된다.
ftp://ftp.lots.com/images/a.jpeg
2.2 URL 문법
URL 문법은 스킴에 따라 달라진다. 그러나 사실 대부분의 URL은 일반 URL 문법을 따르며, 서로 다른 URL 스킴도 형태와 문법 면에서 매우 유사하다. 대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉜다.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#프래그먼트
2.2.1 스킴
리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다.
2.2.2 호스트와 포트
호스트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리키며, 포트는 서버가 열어놓은 네트워크 포트를 가리킨다.
2.2.3 사용자 이름, 비밀번호
사용자 이름과 비밀번호를 요구하는 프로토콜 사용 시, 그 값들이 삽입 되있지 않을 경우 브라우저는 기본 값을 삽입해둔다.
(Filzilla에서, 사용자 이름 & 비밀번호를 입력하지 않고 FTP 서버에 접속했을 때)
2.2.4 경로
리소스가 서버의 어디에 있는지 알려준다. HTTP URL에서 경로 컴포넌트는 ‘/’ 문자를 기준으로 경로조각으로 나뉜다. 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.
2.2.5 파라미터
어플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다. 이름/값 쌍의 리스트로 URL 나머지 부분들로부터 ‘;’문자로 구분하여 URL에 기술한다.
<http://www.naver.com/hello;sale=false/index.html;graphics=auto>
2.2.6 질의
<http://www.naver.com/hello/index?item=1241&color=blue>
데이터베이스 같은 서비스들은 요청받을 리로스 형식의 범위를 좁히기 위해서 질문이나 질의를 받을 수 있다. ‘?’ 물음표의 우측에 있는 값들이 질의이다. 특정 문자들을 제외하고는 질의 컴포넌트 포맷에 제약사항은 없으며, 편의상 ’&’로 나뉜 ‘이름=값’ 쌍 형식의 질의 문자열을 많이 사용한다.
2.2.7 프래그먼트
리소스의 특정 부분을 가리킬 수 있도록, URL은 리소스 내의 조각을 가리킬 수 있는 프래그먼트 컴포넌트를 제공한다. 일반적으로 HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에, 클라리언트는 서버에 프래그먼트를 전달하지 않는다.
(ex)
2.3 단축 URL
URL은 상대 URL과 절대URL로 나뉜다. 절대 URL은 리소스에 접근하는데 필요한 모든 정보를 가지고 있다. 상대 URL은 리소스에 접근하는데 필요한 모든 정보를 얻기 위해서는, 기저(base)라고 하는 다른 URL을 사용해야 한다.
기저URL은 리소스에서 명시적으로 제공하거나(ex. HTML <base> 태그), 리소스를 포함하고 있는 URL을 기저URL로 취급하는 방식으로 가져온다. 상대 URL을 절대 URL로 변환하기 위한 알고리즘이 존재한다. RFC 2396에 명시되있다고 한다. (책에는 변환 알고리즘이 그림으로 나타나져 있어 이를 참고하여 컨버터를 만들고자 하였으나, 생각보다 고려해야할 사항이 많아 그만뒀다…ㅠ)
java.net.URL 클래스에서 위 알고리즘을 구현해 왔기 때문에, 그 클래스를 사용하는 것이 좋을 것 같다.
URL baseUrl = new URL("<http://www.google.com/someFolder>");
URL newUrl = new URL(bUrl,"../test.html");
2.4 안전하지 않은 문자
URL 설계자는 사람들이 URL에 이진 데이터나 일반적으로 안전한 알파벳 외의 문자도 포함하려고 할 때가 있다는 것을 알게 되었다. 그래서 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 하였다.
2.4.1 URL 문자 집합
컴퓨터 시스템은 기본적으로 US-ASCII 문자 집합을 사용해왔다.(7 bit로 이뤄진 문자 집합이다. 1byte가 아닌 이유는, 앞에 1bit는 패리티 비트로 사용하여 에러 검출을 위해 남겨두었다고 한다.)
이스케이프 문자열은 US-ASCII에서 사용이 금지된 문자들로, 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높였다.
2.4.2 인코딩 체계
인코딩은 안전하지 않은 문자를 퍼센티지 기호(%)로 시작해, ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 ‘이스케이프’ 문자로 바꾼다.
(ex)
- ~ : 0x7E → http://www.google.com/~hello
- % : 0x25 → http://www.google.com/100%25satisfaction
'CS > 네트워크' 카테고리의 다른 글
[HTTP] 06. 프락시 (2) | 2024.01.07 |
---|---|
[HTTP] 05. 웹 서버 (2) | 2024.01.05 |
[HTTP] 04. 커넥션 관리 (2) | 2024.01.05 |
[HTTP] 03. HTTP 메시지 (0) | 2024.01.02 |
[HTTP] 01. HTTP 개관 (0) | 2024.01.02 |