프로그래밍

[HTTP] HTTP 메세지란, 요청 HTTP 메세지, 응답 HTTP 메세지

aSpring 2023. 11. 23. 16:33
728x90
728x90

HTTP 메세지

  • ASCII로 인코딩된 텍스트 정보
  • 서버 - 클라이언트 간 데이터가 교환되는 방식
  • 메세지 타입 2가지
    • 요청 Request
      • 클라이언트 ------> 서버
      • 서버의 액션이 일어나게끔 하는 메시지
    • 응답 Response
      • 클라이언트 < ------ 서버
      • 요청에 대한 서버의 답변
  • 소프트웨어/브라우저/프록시/웹 서버가 HTTP 메세지를 작성
    • 프록시 or 서버 : 설정 파일
    • 브라우저 : API
    • 혹은 다른인터페이스를 통해 제공됨
  • HTTP 요청과 응답의 구조는 서로 닮았으며, 그 구조는 다음과 같음
    • 시작 줄(start-line) : 실행되어야 할 요청, 또는 요청 수행에 대한 성공 or 실패가 기록되며 항상 한 줄로 끝남
    • HTTP 헤더 세트(옵션) : 요청에 대한 설명, 혹은 메시지 본문에 대한 설명
    • 빈 줄(blink line) : 요청에 대한 모든 메타 정보가 전송되었음을 알림
    • 요청과 관련된 내용(HTML 폼 콘텐츠 등)이 옵션으로 들어가거나 응답과 관련된 문서가 들어가며, 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시됨

  • HTTP 메세지의 시작 줄 + HTTP 헤더 ==> 요청 헤드(head)
  • HTTP 메시지 페이로드 ===> 본문(body)

 

요청 HTTP 메세지

- HTTP 요청 : 서버가 특정 동작을 취하게끔 만들기 위해 클라이언트에서 전송하는 메시지(특정 동작을 요구하는 메시지)

(서버는 해당 동작이 실현 가능한지, 클라이언트가 그러한 동작을 요청할 권한이 있는지 등을 검토 -> 적절할 때만 이를 처리함)

 

[1] 시작줄(3가지 요소)

- 3가지 요소 각각은 띄어쓰기로 구분

 

1. HTTP 메서드(Method) : 영어 동사 GET, PUT, POST 혹은 명사 HEAD, OPTIONS를 사용해 서버가 수행해야 할 동작을 나타냄(HTTP 표준에 정의된 메소드는 8개가 있으며 비교적 자주 사용되는 메소드는 GET, POST)

  • GET : 리소스를 클라이언트로 가져다 달라
    • 이용자가 브라우저에 웹 서버의 주소를 입력하거나 하이퍼링크를 클릭하면, 새로운 페이지를 랜더링하기 위해 리소스가 필요 -> 이때 브라우저는 GET 요청을 서버에 전송하여 리소스를 받아옴
  • POST : 데이터가 서버로 들어가야 함(리소스 새로 생성 or 클라이언트로 돌렬보낼 임시 문서 생성)
    • 리소스로 데이터를 보낸다는 메소드
    • 전송할 데이터는 보통 HTTP 바디에 포함됨
    • ex) 로그인 시 입력하는 ID와 비밀번호, 게시판에 작성하는 글 등이 POST로 서버에 보내짐

2. 요청 타겟 | 요청 URI(Request-URI) : 주로 URL, 프로토콜, 포트, 도메인의 절대 경로로도 나타낼 수 있음

     -> 요청 컨텍스트에 의해 특정지어지며, 요청 타겟 포맷은 HTTP 메소드에 따라 달라지며 다음과 같은 것들이 있음

  • origin 형식 : 가장 일반적인 형식. 끝에 '?'와 쿼리 문자열이 따라 오며, GET, POST, HEAD, OPTIONS 메서드와 함께 사용
    • POST / HTTP/1.1
    • GET /background.png HTTP/1.0
    • HEAD /test.html?query=alibaba HTTP/1.1
    • OPTIONS /anypage.html HTTP/1.0
  • absolute 형식 : 완전한 URL. 프록시에 연결하는 경우 대부분 GET과 함께 사용됨.
    • ex) http://developer.mozilla.org/ko/docs/Web/HTTP/Messages HTTP/1.1
  • authority 형식 : 도메인 이름 및 옵션 포트( ':'가 앞에 붙음)로 이루어진 URL의 인증 컴포넌트
    • HTTP 터널을 구축하는 경우에만 CONNECT와 함께 사용할 수 있음
    • ex) CONNECT developer.mozilla.org:80 HTTP/1.1
  • asterisk 형식 : OPTIONS와 함께 '*' 하나로 서버 전체를 나타내는 형식
    • ex) OPTIONS * HTTP/1.1

3. HTTP 버전 : 메시지의 남은 구조를 정의하는 부분, 응답 메시지에서 써야 할 HTTP 버전을 알려주는 역할

 

[2] 헤더

  • 대소문자 구분없는 문자열 다음에 콜론(':')이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라짐(한 줄로 구성되지만, 꽤 길어질 수 있음)
  • Header 종류 
    • General 헤더 : Via와 같은 General 헤더는 메시지 전체에 적용됨.
    • Reuest 헤더 : User-Agent (en-US), Accept와 같은 Request 헤더는 요청의 내용을 좀 더 구체화 시키고(Accept-Language), 컨텍스트를 제공하기도 하며(Referer), 조건에 따른 제약 사항을 주기도 하면서(If-None) 요청 내용을 수정함.
    • Representation 헤더 : 메시지 데이터의 원래 형식과 적용된 인코딩을 설명하는 Content-Type과 같은 Representation 헤더(메시지에 본문이 있는 경우에만 존재).

 

시작줄 + 나머지 = HTTP 헤드

- 헤드의 끝은 CRLF 한 줄로 나타냄

 

 

[3] 본문

- 헤드의 끝을 나타내는 CRLF 뒤, 모든 줄을 말하며 클라이언트나 서버에게 전송하려는 데이터가 바디에 담김

  • 요청의 마지막 부분에 들어가며, 모든 요청에 본문이 들어가지는 않음
  • GET, HEAD, DELETE, OPTIONS 처럼 리소스를 가져오는 요청은 보통 본문이 필요 없음
  • 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송하며, 보통 HTML 폼 데이터를 포함하는 POST 요청일 경우에 그러함
  • 넓게 보면 본문은 두가지 종류로 나뉨
    • 단일-리소스 문(single-resource bodies) : 헤어 두 개(Content-Type와 Content-Length)로 정의된 단일 파일로 구성
    • 다중 리소스 본문 : 각각 서로 다른 정보를 담고 있는 멀티파트 본문으로 구성. 보통 HTML 폼 (en-US)과 관련이 있음

 

응답 HTTP 메세지

[1] 상태 줄

  • HTTP 응답의 시작 줄은 '상태 줄(status line)'이라고 불림
    • 보통 HTTP/1.1인 프로토콜 버전
    • 요청의 성공 여부를 나타내는 '상태 코드'. ex) 일반적인 상태 코드 : 200, 404, 302 ...
    • 사람이 HTTP 메시지를 이해할 때 도움이 되는 상태 코드에 대한 짧고, 순전히 정보 제공 목적의 '상태 텍스트'
  • 상태 줄은 일반적으로 HTTP/1.1 040 Not Found. 같이 표현됨

 

[2] 헤더

  • 응답에 들어가는 HTTP 헤더는 다른 헤더와 동일한 구조를 따름.
  • 대소문자를 구분하지 않는 문자열 다음에 콜론(:)이 오며, 그 뒤에 오는 값은 헤더에 따라 구조가 달라짐
  • 헤더는 값을 포함해 전체를 한 줄로 표시함

종류

  • General 헤더  : Via와 같은 General 헤더는 메시지 전체에 적용됨.
  • Response 헤더 : Vary와 Accept-Ranges와 같은 Response 헤더는 상태 줄에 포함되지 않은 서버에 대한 추가 정보를 제공함.
  • Representation 헤더 : 메시지 데이터의 원래 형식과 적용된 인코딩을 설명하는 Content-Type과 같은 Representation 헤더(메시지에 본문이 있는 경우에만 존재함)

 

[3] 본문

  • 응답의 마지막 부분에 들어가며 모든 응답에 본문이 들어가지는 않음
  • payload없이도 요청에 충분히 응답하는 201(Created), 204(No Content)와 같은 상태 코드를 가진 응답에는 보통 본문이 없음
  • 넓게 보면 세 종류로 나뉨
    • 단일-리소스 본문(Single-resource bodies) : Content-Type와 Content-Length라는 두 개의 헤더로 정의하는 길이가 알려진 하나의 파일로 구성
    • 단일-리소스 본문 : Transfer-Encoding이 chunked로 설정된 청크로 나뉘어 인코딩되는 길이를 모르는 하나의 파일로 구성
    • 다중 리소스 본문 : 서로 다른 정보를 담고 있는 멀티파트 본문으로 이루어짐
      • 이 경우는 상대적으로 위의 두 경우에 비해 보기 힘듦

 

 

참고

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages

 

728x90
728x90