호우동의 개발일지

Today :

article thumbnail

HTTP 메시지 포맷

  • HTTP 명세서(RFC)는 HTTP 메시지 포맷을 정의한다.
    • 브라우저, 웹 서버, 네트워크 캐시 서버에 의해 삽입될 수 있는 헤더라인 정의

  • 두 가지 HTTP 메시지가 존재 → 응답 메시지와 요청 메시지

 

 


HTTP 요청 메시지


예시를 통한 요청 메시지 분석

GET /somedir/page.html HTTP/1.1 // 요청 라인(request line)

// ---- 헤더 라인(header line)
Host : www.someschool.edu // 객체가 존재하는 호스트를 명시
Connection : close // 브라우저는 서버에게 지속 연결 사용을 원하지 않는다.
User-agent : Mozilla/5.0 // Mozilla/5.0 = 파이어 폭스 브라우저
Accept-language : fr // 프랑스어 버전을 원하고 있음
// -------------------------
  • 메시지가 일반 ASCII 텍스트로 쓰여 있어 사람들이 읽을 수 있다.
  • 메시지가 5줄이고, 각 줄은 CR(carriage return)과 LF(line feed)로 구별됨
    • 마지막 줄에 추가 CR과 LF가 따른다.
    • 요청 메시지는 더 많은 줄로 구성되거나 하나의 줄이 될 수도 있다.

  • 요청 라인(request line) : HTTP 요청 메시지의 첫 줄
    • 3개의 필드를 가짐 → 방식(method) 필드 URL 필드 HTTP 버전 빌드
      • 방식 필드 : GET, POST, PUT, DELETE를 포함한 여러 가지 값을 가질 수 있음
        • HTTP 메시지의 대부분은 GET 방식 사용
          • GET 방식 : 브라우저가 URL 필드로 식별되는 객체를 요청할 때 사용

  • 헤더 라인(header line) : 요청 라인 이후의 라인
    • Host : www.someschool.edu
      • 해당 라인이 제공하는 정보는 웹 프록시 캐시에서 필요로 함

    • Connection : close
      • 브라우저는 서버에게 지속 연결 사용을 원하지 않는다.
        → 브라우저는 서버가 요청 객체를 보낸 후에 연결을 닫기를 원한다.

    • User-agent
      • 사용자 에이전트(서버)에게 요청을 하는 브라우저 타입을 명시
      • 서버가 같은 객체에 대한 다른 버전을 다른 타입의 사용자 에이전트에게 보낼 수 있음
        → 각 버전은 같은 URL을 가진다.
    • Accept-language : HTTP에서 사용 가능한 많은 콘텐츠 협상 헤더 중 하나
      • 여기서는 사용자가 객체의 프랑스어 버전을 원함

 


HTTP 요청 메시지의 일반 포맷

HTTP 요청 메시지 포맷 구조

  • 개체 몸체(entity body) : 사용자가 폼 필드에 입력한 것을 포함
    • POST 방식에서 사용(GET 방식에서는 비어있음)
    • HTTP 클라이언트는 사용자가 폼을 채워 넣을 때 POST 방식을 사용
      • 사용자가 검색 엔진에 검색 단어를 넣을 때
      • 웹 페이지의 특정 내용은 사용자가 폼 필드에 무엇을 입력하는가에 달려있음

    • 폼으로 생성한 요구가 반드시 POST 방식을 사용할 필요는 없다.
      • HTML 폼은 흔히 GET 방식을 사용하고 요청된 URL의 입력 데이터를 전송
        • 예시 : 필드 입력값이 monkeys와 bananas일 경우
          → URL은 www.somesite.com/animalsearch?monkeys&bananas
  • HEAD 방식 : 서버가 해당 방식의 요청을 받으면 HTTP 메시지로 응답하되, 요청 객체는 전송 X
    • 애플리케이션 개발자는 흔히 디버깅을 위해 해당 방식을 많이 사용

  • PUT 방식 : 웹 서버에 업로드할 객체를 필요로 하는 애플리케이션에 의해 사용
  • DELETE 방식 : 사용자 또는 애플리케이션이 웹 서버에 있는 객체를 지우는 것을 허용

 

 


HTTP 응답 메시지


예시를 통한 응답 메시지 분석

HTTP/1.1 200 OK // 초기 상태 라인
// 헤더 라인 ----------------------------------
Connection : close
Date : Tue, 18 Aug 2015 15:44:04 GMT
Server : Apach/2.2.3 (CentOS)
Last-Modified : Tue, 18 Aug 2015 15:11:03 GMT
Content-Length : 6821
Content-Type : text/html
// ------------------------------------------

(데이터 데이터 데이터 데이터 데이터 ...) //개체 몸체
  • 3개의 섹션으로 나누어져 있음 →초기 상태 라인 , 6개의 헤더라인, 개체몸체
    • 개체 몸체는 요청 객체(데이터 데이터… 로 표현된 부분)를 포함한다.
    • 상태 라인은 3개의 필드를 가진다.
      • 프로토콜 버전 필드 상태 코드 해당 상태 메시지
      • 해당 예시에서 상태 라인은 서버가 HTTP/1.1 사용, 모든 것이 양호(OK)
        → 서버가 요청 객체를 찾아서 보내고 있음을 알려줌

  • 서버가 사용하는 헤더 라인 분석
    • Connect: close : 클라이언트에게 메시지를 보낸 후 TCP 연결을 닫는 데 사용
    • Date : HTTP 응답이 서버에 의해 생성되고 보낸 날짜와 시간을 나타냄
      • 서버가 파일 시스템으로부터 객체를 추출하고
        응답 메시지에 그 객체를 삽입하여 응답 메시지를 보낸 시간을 의미 

    • Server : 메시지가 아파치 웹 서버에 의해 만들어졌음을 나타냄
      • HTTP 요청 메시지의 User-agent: 헤더라인과 비슷

    • Last-Modified : 객체가 생성되거나 마지막으로 수정된 시간과 날짜를 나타냄
    • Content-Length : 송신되는 객체의 바이트 수를 나타냄
    • Content-Type : 개체 몸체 내부의 객체가 HTML 텍스트인 것을 나타냄

 


HTTP 응답 메시지의 일반 포맷

HTTP 응답 메시지 포맷 구조
HTTP 응답 메시지 포맷 구조

  • 상태 코드와 연관 문장
    • 200 OK : 요청이 성공했고, 정보가 응답으로 보내졌다.
    • 301 Moved Permanently : 요청 객체가 영원히 이동되었다.
      • 새로운 URL은 응답 메시지의 Location: 헤더에 나와 있음
      • 클라이언트 소프트웨어는 자동으로 새로운 URL을 추출한다.

    • 400 Bad Request : 서버가 요청을 이해할 수 없다는 일반 오류 코드
    • 404 Not Found : 요청 문서가 서버에 존재하지 않는다.
    • 505 HTTP Version Not Supported : 요청 HTTP 프로토콜 버전을 서버기 지원 X