- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26739929&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
HTTP (HyperText Transport Protocol)의 이해
![]() | 웹 개발자라면 당연히 HTTP를 잘 이해하고 있어야 한다. |
1. HTTP(HyperText Transport Protocol) 개요
1.1 HTTP 란?
- HTTP란 HyperText Transport Protocol의 약자로 웹서버와 클라이언트간의 문서를 교환하기 위한 통신규약이다.
- World Wide Web( WWW )의 분산되어 있는 Server와 Client 간에 Hypertext를 이용한 정보교환이 가능하도록 하는 통신 규약이다.
- 1989년 Tim Berners Lee가 처음 설계
- HTTP는 웹에서만 사용하는 Protocol로 TCP/IP 기반으로 한 지점에서 다른 지점(보통 클라이언트와 서버)으로 요청과 응답을 전송한다.
1.2 HTTP의 특징
- HTTP 메시지는 HTTP Server와 HTTP Client에 의해서 해석
- TCP/IP 프로토콜의 Application 계층에 위치
- TCP Protocol을 이용한다( Default Port 80 )
- 현재 Version 1.1 ( RFC 2616 )
2. HTTP 1.1
- HTTP 1.0의 성능 개선에 중점을 두었다
2.1 HTTP 1.0의 문제점
- 단순한 OPEN,OPERAIOTN,CLOSE
- 매번 필요할 때마다 연결(비 지속성 연결방식) → 성능의 저하
- 한번에 얻어서 가져올 수 있는 데이터의 양이 제한
- URL의 크기도 작으며, 캐시 기능이 미흡함(Last-Modified에 의존)
- GET/HEAD/POST method만 허용
2.2 HTTP 1.1의 개선
- 지속적인 연결을 해 주는 persistent connection 지원
- multiple request 처리 가능
- request/response가 pipeline 방식으로 진행
- proxy server와 캐시 기능 향상(Cache-Control)
- GET,HEAD,POST,OPTIONS,DELETE,TRACE,CONNET 메소드 허용
파이프라이닝( Pipe Lining ) 이란?
- 응답 메시지가 도착하지 않은 상태에서 연속적인 요구 메시지를 서버에 전달
- 이때 서버는 요구메시지를 수신한 순서대로 응답메시지를 클라이언트에 전달
- 연결과 종료횟수를 줄임으로서 네트워크 자원의 절약
- 발생하는 패킷의 숫자를 감소, 네트워크 트래픽 감소
![]() |
3. HTTP Message
- Message 종류
- Request : 요청 Message ( Client → Server )
- Response : 응답 Message ( Server → Client )
![]() |
3.1 HTTP Header
- Header Field Definitions
- 클라이언트와 서버 사이에서 부가적인 정보 교환
- General headers, Request headers, Response headers, Entity headers가 있음
- 헤더명, 콜런, 공백, 헤더값 형식 (Header Name: Header Value)
- 예) Connection: close
- Request Message와 Reponse Message 구조
3.1.1 General headers
- 메시지에 대한 일반적인 정보 제공
- Request Message와 Reponse Message 모두 사용 될 수 있다..
Header | 설명 | 예 |
---|---|---|
Connection | Connection 옵션지정 | Connection: close |
Date | 메세지가 작성된 일시 | Date: Wed, 05 May 2010 17:27:50 GMT |
Cache-Control | cache사용을 막을것인지 허용할것인지를 제어함. |
|
3.1.2 Request headers
- 클라이언트의 구성과 문서 형식을 지정
- Request Message만 존재
Header | 설명 | 예 |
---|---|---|
Accept | 클라이언트가 받아들이는 미디어 타입 | Accept: text/javascript, text/html, application/xml, text/xml, / |
Accept-Charset | 클라이언트가 다루는 문자열 ? 지정 | Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3 |
Accept-Language | 클라이언트가 받아들일 언어 | Accept-Language: ko-KR |
Host | 호스트의 주소와 포트 번호 | Host: www.gurubee.net |
User-Agent | 클라이언트 프로그램( 웹 브라우저)을 표시 | User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 |
If-Modified-Since | ||
Referer | ||
If-Match | ||
If-None-Match | ||
If-Range | ||
If-Unmodified-Since | ||
Max-Forwards |
3.1.3 Response headers
- 서버의 구성과 요청에 대한 특별한 정보를 지정
- Reponse Message만 존재
Header | 설명 | 예 |
---|---|---|
Server | HTTP Server 정보 | Server: Apache |
Accept-Ranges | ||
Age | ||
ETag |
3.1.4 Entity headers
- 문서의 본문에 대한 정보 제공
- Request Message와 Reponse Message 모두 존재한다.
Header | 설명 | 예 |
---|---|---|
Content-Length | 응답되는 컨텐츠의 사이즈 | Content-Length: 3495 |
Content-Type | 응답되는 컨텐츠의 유형 | Content-Type: text/html; charset=UTF-8 |
Expires | Cache가 초기화 되는 시간 | Expires: Thu, 01 Dec 1994 16:00:00 GMT |
Last-Modified | 응답되는 컨텐츠가 마지막으로 수정될 일시 | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT |
Content-Range | ||
Content-Location | ||
Content-Language |
3.2 HTTP Request Message
3.2.1 HTTP Request Message Format
Request Message | 설명 |
---|---|
GET /home/newRelease.nhn HTTP/1.1 | Reqeust Line (HTTP method(GET, POST, HEAD, TRACE...), URL, HTTP 버전 정보를 알 수있다.) |
Accept: / Accept-Language: ko-KR Referer: http://www.gurubee.net/ x-flash-version: 10,2,159,1 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1.. Host: www.gurubee.net Connection: Keep-Alive Cookie: JSESSIONID=286C75937E048B54850657F5203532ED; |
Headers |
3.2.2 HTTP method
- GET
- URL에 해당하는 정보의 전송요청
- 데이터의 전달 : 이름과 값을 쌍으로. ex) name=value
- 데이터의 구분 : & 사용. ex) name1=value1&name2=value2)
- 데이터가 URL에 노출
- 인코딩/디코딩의 과정이 없기 때문에 POST보다 빠르다
- URL의 길이 제약으로 인해 많은 데이터 전송은 무리
- POST
- 폼에서 POST 지정하는 경우
- 데이터는 HTTP Boby에 숨겨서 서버로 전송
- GET으로 보낼수 없는 자료를 전송할때 사용 가능
- HEAD
- GET과 동일하나 HTTP Header 정보만 요청
- 네트워크 대역을 절약, 리소스의 크기확인시 사용
- OPTIONS
- 어떤 HTTP 메소드를 지원하는 지 검사
- 요청한 URL에 어떤 메소드 요청이 가능한지 확인
- 보안적으로 위험, 헤커들에게 중요한 정보를 제공하게 된다. 비활성화
- PUT
- URI로 지정한 서버에 있는 파일을 대치한다.
- URI로 지정한 파일이 없는 경우는 파일을 새로 작성한다.
- 보안적으로 위험, 비활성화 시킨다.
- DELETE
- URI로 지정한 서버에 있는 파일을 삭제한다
- 보안적으로 위험, 비활성화
- TRACE
- 서버측에서 받은 리퀘스트 라인과 헤더를 그대로 클라이언트로 반송한다.
- 프록시 서버 등을 쓰는 환경에서 리퀘스트가 바뀌어 써지는 모양을 살펴볼 때 사용한다.
- Request의 Loopback 테스트용으로 사용 할 수 있다.
- CONNECT
- 터널링의 목적으로 연결요청
- Forward Proxy에 HTTP TLS (Transport Layer Security) 터널링 (Tunnelling)을 요청할 때 사용
- 아파치에서 HTTP Method 보안설정
<Directory /home> <LimitExcept GET POST> Order deny,allow Deny from all </LimitExcept> </Directory>
3.3 HTTP Response Message
3.3.1 HTTP Response Message Format
Request Message | 설명 |
---|---|
HTTP/1.1 200 OK | Status Line |
Last-Modified: Wed, 05 May 2010 17:27:50 GMT Content-Length: 1251273 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Expires: Sun, 05 Jun 2011 06:25:47 GMT |
Headers |
3.3.2 HTTP Status Code
Status Code | Message | 설명 |
---|---|---|
200 | OK | 모든 것이 정상 |
204 | No Content | 요구가 처리되었으나 클라이언트에게 전달할 문서 없음. 브라우저는 이전 문서를 계속 보여줘야 한다. |
206 | Partial Content | Range 헤더 지정 요청에 응답하는 데 이용된다. 서버는 반드시 Content-Range 헤더와 응답에 포함된 범위를 지정해야 한다.![]() |
304 | Not Modified | 변경 없음 |
400 | Bad Request | 잘못된 요청 |
403 | Forbidden | 접근권한 없음 |
404 | Not Found | 요청한 내용이나 파일을 찾을 수 없음 |
408 | Request Timeout | 클라이언트가 요청을 보내는 데 너무 오랜 시간이 걸림. |
414 | Request URI Too Long | URI가 너무 길어 오류 발생 |
500 | Internal Server Error | 서버 에러 |
503 | Service Unavailable | 서버 한계 초과 등의 오류 |
참고자료
- HTTP에 대한 깔끔한 요약 - HTTP Refcardz
- Hypertext Transfer Protocol – HTTP/1.1
- HTTP/1.0의 문제점과 1.1에서 해결한 방식
- HTTP 1.1 표준 한글문서
- SPDY는 무엇인가?
- HTTP : Hyper Text Transfer Protocol PPT
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26739929&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.