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설명
ConnectionConnection 옵션지정Connection: close
Date메세지가 작성된 일시Date: Wed, 05 May 2010 17:27:50 GMT
Cache-Controlcache사용을 막을것인지 허용할것인지를 제어함.
  • Cache Request 지시문
    • no-cache : 캐시 하지 않는다. cache서버, proxy서버, 브라우져에 cache하지 말도록 지시함.
    • no-store : 신속히 넘긴 후에 정보를 제거한다.
    • max-age = seconds : seconds에 지정한 것보다 오래된 응답은 보내지 않는다.
    • max-stale =seconds : 만료된 데이터를 보낸다. 만약 seconds가 지정되어 있다면 지정한 숫자보다 적은 만료된 데이터를 보낸다.
    • min-fresh = seconds : 명시된 seconds의 수 이후의 변경된 새 데이터만 보낸다.
    • only-if-cached : 새로운 데이터를 검색하지 않고 캐시에 있는 데이터만 반환한다.
  • Cache Response 지시문
    • public : 어떠한 캐시라도 캐시할수 있다.
    • private : 공유된 캐시는 캐시하지 않는다.
    • no-cache : 캐시하지 않는다.
    • no-transform : 데이터를 변환하지 않는다.
    • must-revalidate : 클라이언트는 데이터를 재확인 해야 한다.
    • proxy-revalidate : 개인적인 클라이언트 캐시를 제외하고 데이터를 재확인 해야한다.
    • max-age=seconds : 문서는 지정된 seconds만큼만 변화가 없는 상태라고 생각




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설명
ServerHTTP 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
ExpiresCache가 초기화 되는 시간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.1Reqeust Line (HTTP method(GET, POST, HEAD, TRACE...), URL, HTTP 버전 정보를 알 수있다.)
Accept: /
Accept-Language: ko-KR
Referer: /
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 OKStatus 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 CodeMessage설명
200OK모든 것이 정상
204No Content요구가 처리되었으나 클라이언트에게 전달할 문서 없음. 브라우저는 이전 문서를 계속 보여줘야 한다.
206Partial ContentRange 헤더 지정 요청에 응답하는 데 이용된다. 서버는 반드시 Content-Range 헤더와 응답에 포함된 범위를 지정해야 한다.
304Not Modified변경 없음
400Bad Request잘못된 요청
403Forbidden접근권한 없음
404Not Found요청한 내용이나 파일을 찾을 수 없음
408Request Timeout클라이언트가 요청을 보내는 데 너무 오랜 시간이 걸림.
414Request URI Too LongURI가 너무 길어 오류 발생
500Internal Server Error서버 에러
503Service Unavailable서버 한계 초과 등의 오류




참고자료