목차
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: URL
- HTTP/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).