목차
HTTP
= HyperText Transfer Protocol
의미: 분산 하이퍼미디어 환경에서 빠르고 간편하게 데이터를 전송 하는 프로토콜.
- 월드 와이드 웹(www)에서 데이터를 액세스하는 데 주로 사용되는 프로토콜
- HTTP는 80번 포트를 사용하도록 정의됨.
- 즉, HTTP 서버는 80번 포트에서 대기하고, 클라이언트는 TCP를 사용해 연결을 설정한다.과정 자세히 보기
웹 브라우저: 사용자가 요청하는 자원을 가리키는 URL 주소에 사용할 프로토콜을 표현함.
- URL 주소의 첫 번째 부분을 사용해 서비스 유형을 표현함.
- HTTP 서버로부터 웹 정보를 얻으려면
http://www.yerim.co.kr
과 같이 URL 주소에 HTTP를 사용 한다고 명시해야 함 - FTP 서버에 접근하려면
ftp://www.yerim.co.kr
- 텔넷 Telnet 서버를 사용하려면
telnet://www.yerim.co.kr
형식으로 표현
- HTTP 서버로부터 웹 정보를 얻으려면
[HTTP Method]
HTTP Method: HTTP 명령에 해당하는 HTTP 메서드
➡ 이를 이용해 클라이언트가 서버에 요청을 전송하고,
➡ 반대로 서버에서 클라이언트로 문서 정보를 회신한다.
GET Method: 클라이언트가 서버에 요청할 때는 GET 메서드를 사용
POST Method: 클라이언트에서 서버로 회신할 때는 POST 메서드를 사용
📜 [참고] 클라이언트와 서버 사이의 데이터 전송 과정
HTTP 의 요청과 응답
- HTTP 1.1 버전
- RFC 2616으로 발표된 은 클라이언트의 요청 Request 과 서버의 응답 Reply 에 의해 동작하는 아주 간단한 프로토콜
동작 원리- HTTP 클라이언트가 서버에 요청을 전송.
- 요청 내용: 프로토콜 명령에 해당하는 요청 메서드 Method , URL, HTTP 버전이 포함됨
- 기타 클라이언트의 요청과 관련된 부가 정보도 요청 내용에 포함함
- HTTP 서버가 상태 정보 회신
- 상태 정보: 요청의 처리 결과를 의미하는 응답 코드가 포함
- 클라이언트가 요청한 결과물이나 기타 정보도 함께 회신
- HTTP 클라이언트가 서버에 요청을 전송.
비상태 연결
아래 그림은 클라이언트와 서버 간의 요청과 응답이 전송되는 과정이다.
TCP 연결이 설정되면서 요청과 응답이 진행되고,
이후 TCP 연결이 해제되기 때문에 둘 사이에는 연결 존재에 따른 상태 정보가 존재하지 않음.
➡ HTTP는 비상태 Stateless 프로토콜로 분류됨
[PROBLEM]
위의 그림과 같은 단발성의 연결 방식은 웹 문서가 작고 간단할 때는 상관없지만,
웹 문서의 내용이 복잡 하면 문제를 야기한다.
➡ 웹 문서 하나가 다양한 그림 정보나 데이터 파일과 연관되기 때문에 성능이 저하될 수 있다.
MIME 유사 메시지
- MIME(Multipurpose Internet Message Extensions)
- HTTP의 요청, 응답 메시지는 이 유사 구조를 사용해 데이터를 전송함.
- 즉, 웹 브라우저에서 발생하는 모든 메시지는 MIME 개체와 거의 유사하게 표현되며, 서버에서 전송된 데이터도 MIME 개체로 표현됨
[HTTP의 MIME 유사 개체 VS RFC 2045의 MIME 개체의 차이]
- HTTP의 MIME 유사 개체에 Content-Length라는 헤더 필드가 존재함.
- ContentLength 필드: 개체를 전송하는 데 필요한 바이트 수이다.
- HTTP의 MIME 유사 개체는 MIME 표준인 Content-Transfer-Encoding 헤더 필드 대신에 Content-Encoding과 TransferEncoding 필드를 사용
HTTP의 메시지 분류
두 가지 일반적인 유형의 메시지 존재
Request Message
Request Message: 클라이언트가 서버에 보내는 요청 메시지
[구성]
요청메세지 Request Message: 요청문, 헤더, 바디로 구성됨.
➡ 요청문 Request Line 내용: <요청 메서드="">,
요청메세지의 구성
[요청 메서드 Request Method]
클라이언트가 서버에 실행을 요구하는 명령을 기술한다.
- GET: 클라이언트가 서버에 URL이 가리키는 웹 문서의 내용을 전송하도록 요구한다. 문서 내용은 서버가 회신하는 응답 메시지의 바디에 포함된다.
- HEAD: 문서 내용보다는 특정 문서의 정보를 원할 때 사용한다.
- POST: 클라이언트가 서버에 정보를 전송할 수 있도록 해준다. 보통 게시판, 방명록처럼 사용자가 입력한 정보를 서버에 전달하는 용도로 사용한다.
- PUT: 클라이언트가 서버에 문서를 전달하려고 사용한다. 문서 내용은 바디에 포함된다.
[요청문(Request Line)]
예를 들어,
클라이언트의 요청문을 다음과 같이 작성하면
GET / HTTP/1.1
- 요청 메서드: GET
- URL: /
- HTTP 버전: HTTP/1.1
➡ 따라서 웹 서버의 최상위(/)에 위치한 자원을 얻고자 하며, 클라이언트가 HTTP 버전 1.1을 지원함을 알 수 있다.
[헤더(header)]
요청문 밑의 헤더는 클라이언트와 서버 사이의 부가 정보를 전달하는 목적으로 사용되며,
형식은 <헤더 이름> : <헤더 값>
이다.
Response Message
Response Message: 응답 메시지
클라이언트로부터 요청 메시지를 수신한 서버는 해당 요구를 처리한 후에 그 결과를 응답 메시지 형식으로 회신한다.
[구성]
요청 메시지와 거의 동일한데, 요청문 대신에 처리 결과를 의미하는 상태문 Status Line 이라는 용어를 사용한다.
- 상태문의 내용:
, <상태 코드="">, <상태 이름="">의 세 부분으로 구성된다.상태>상태>
응답 메시지의 구조
HTTP 버전은 요청 메시지와 의미가 같고, 상태 코드와 상태 이름은 일반 인터넷 응용 프로그램과 구조가 같다.
[HTTP 상태 코드]
HTTP에 정의된 주요 상태 코드
- 200: OK 요청이 성공적으로 수행되었다.
- 202: Accepted 클라이언트의 요청을 수신하였으나, 즉각 실행되지 않고 있다.
- 400: Bad Request 요청 메시지의 내용에 문법 오류가 존재한다.
- 401: Unauthorized 요청을 실행하는 데 필요한 적절한 권한이 존재하지 않는다.
- 403: Forbidden 서비스 요청이 거부되었다.
- 404: Not Found 원하는 문서를 찾을 수 없다.
- 500: Internal Server Error 서버 내부에 불가피한 오류가 발생하였다.
- 501: Not Implemented 요청 사항을 수행할 수 없다.
HTTP 의 동작 과정
HTTP는 앞서 설명한 것처럼 HTTP 클라이언트의 요청 메시지에 대해 HTTP 서버가 처리한 결과를 응답 메시지로 회신하는 형식으로 동작한다.
Request Message
요청 메시지: 먼저 HTTP 클라이언트가 전송하는 메시지를 아래와 같은 형식으로 작성할 수 있다.
GET /index.php HTTP/1.1 ➡ 요청문
Host: uu.ac.kr ➡ 헤더
➡ 공백 한 줄
[해석]
- HTTP 클라이언트는 임의의 호스트
- HTTP 서버는 uu.ac.kr이라 가정한다.
- 요청 메시지에는 요청문, 헤더와 함께 공백 한 줄이 있으며, 바디는 존재하지 않는다.
- 요청문
GET
: 요청 메서드/index.php
: URLHTTP/1.1
: HTTP 버전
- 헤더
Host: uu.ac.kr
의uu.ac.kr
: 헤더 정보로 클라이언트가 요청하는 자원이 있는 서버의 주소이다.
- 위의 요청 메시지는 HTTP 서버
uu.ac.kr
의 최상위 디렉토리 밑에 있는index.php
파일의 전송을 요청하는 것이다.
Response Message
응답 메시지: 앞의 요청 메시지를 수신한 HTTP 서버 uu.ac.kr
이 회신하는 응답 메시지
HTTP/1.1 200 OK ➡ 상태문
Date: Thu, 12 Feb 2016 06:29:38 GMT ➡ 헤더
Server: Apache/1.3.29 (Unix) PHP/4.3.4RC3
X-Powered-By: PHP/4.3.4RC3
Transfer-Encoding: chunked
Content-Type: text/html
➡ 공백 한 줄
<HTML> ➡ 바디
<HEAD>
<TITLE> 한국주식회사 홈페이지 </TITLE>
</HEAD>
<FRAMESET rows = "100,*" BORDER = "0" frameborder = "NO">
<FRAME SRC = "top.htm" name = "top" SCROLLING = "NO"
frameborder = "NO" noresize MARGINWIDTH = "0" MARGINHEIGHT = "0">
</FRAMESET>
</HTML>
[해석]
- 상태문
HTTP/1.1
: HTTP 버전을 의미200
: 상태 코드OK
: 상태 이름
➕200 OK
: 클라이언트의 요청이 성공적으로 수행되었음을 의미- 바디 내용
- 클라이언트가 요청한
index.php
파일의 내용 - 헤더 정보의 의미에 대한 설명은 생략한다 (참고 : RFC 2616).