HTTP Request & Response

Tin9oo·2024년 1월 16일

Softeer-WAS

목록 보기
2/3

HTTP란?

Hyper Text Transfer Protocol은 HTML과 같은 하이퍼 미디어 문서를 전송하기위한 애플리케이션 계층 프로토콜이다.
웹 브라우저와 웹 서버간의 통신을 위해 설계되었지만 다른 목적으로도 사용가능하다. -> 어떤 목적?
HTTP는 클라이언트가 요청을 하기 위해 연결을 연 다음 응답을 받을때 까지 대기하는 전통적인 클라이언트-서버 모델을 따른다. HTTP는 무상태 프로토콜이며, 서버가 두 요청 간에 어떠한 데이터(상태)도 유지하지 않는다.


HTTP 메시지

HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식이다. 메시지 타입은 두 가지가 있다. 요청('request')은 클라이언트가 서버로 전달해서 서버의 액션이 일어나게끔 하는 메시지고, 응담('response')은 요청에 대한 서버의 답변이다.

HTTP 메시지는 ASCII로 인코딩된 텍스트 정보이벼, 여러줄로 되어 있다. HTTP 프로토콜 초기 버전화 HTTP/1.1에서는, 클라이언트와 서버 사이의 연결을 통해 공개적으로 전달되었다. 이렇게 한 때 사람이 읽을 수 있었떤 메시지는 HTTP/2에서 최적화와 성능 향상을 위해, HTTP 프레임으로 나누어진다.

웹 개발자, 또는 웹 마스터가 손수 HTTP 메시지를 텍스트로 작성하는 경우는 드물다. 대신에 소프트웨어, 브라우저, 프록시, 또는 웹 서버가 그 일을 한다. HTTP 메시지는 설정 파일(프록시 혹은 서버의 경우), API(브라우저의 경우), 혹은 다른 인터페이스를 통해 제공된다.

HTTP/2의 이진 프레이밍 메커니즘(binary framing mechanism)은 사용중인 API나 설정 파일 등을 변경하지 않아도 되도록 설계 되었기 때문에, 사용자가 보고 이해하기 쉽다.

HTTP 요청과 응답의 구조는 서로 닮았으며, 그 구조는 다음과 같다.

  1. 시작 줄('start-line')에는 실행되어야 할 요청, 또는 요청 수행에 대한 성공/실패 여부가 기록되어있다. 이 줄은 항상 한 줄로 끝난다.

  2. 옵션으로 'HTTP 헤더' 세트가 들어간다. 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 들어간다.

  3. 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄('blank line')이 삽입된다.

  4. 요청과 관련된 내용(HTML 폼 컨텐츠 등)이 옵션으로 들어가거나, 응답과 관련된 문서가 들어간다. 본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.

HTTP 메시지의 시작 줄과 HTTP 헤더를 묶어서 '요청 헤드(head)'라고 부르며, 이와 반대로 HTTP 메시지의 페이로드는 '본문(body)'이라고 한다.

HTTP 요청

시작 줄

HTTP 요청은 서버가 특정 동작을 취하게끔 만들기 위해 클라이언트에서 전송하는 메시지다. 시작줄은 다음과 같이 세 가지 요소로 이루어져 있다.

  1. 'HTTP 메서드'로, 영어 동사(GET, PUT, POST) 혹은 명사(HEAD, OPTIONS)를 사용해 서버가 수행해야 할 동작을 나타낸다. 예를 들어, GET은 리소스를 클라이언트로 가져다 달라는 것을 뜻하며, POST는 데이터가 서버로 들어가야 함을 의미(리소스를 새로 만들거나 수정하기 위해, 또는 클라이언트로 돌려 보낼 임시 문서를 생성하기 위해)한다.

  2. '요청 타겟'은 주로 URL, 또는 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 이들은 요청 컨텍스트에 의해 특정지어진다. 요청 타겟 포멧을 HTTP 메서드에 따라 달라진다. 포멧에는 다음과 같은 것들이 있다.

    • 가장 일반적인 형식이고 'origin 형식'으로 알려진 절대 경로다.
      이 형식은 끝에 '?'와 쿼리 문자열이 따라온다. GET, POST, HEAD, OPRIONS 메서드와 함께 사용한다.

      • 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과 함께 사용된다.
      GET http://developer.mozilla.org/ko/docs/Web/HTTP/Messages HTTP/1.1

    • 'authority 형식'으로 알려지고 도메인 이름 및 옵션 포트(':'가 앞에 붙는다)로 이루어진 URL의 인증 컴포넌트다. HTTP 터널을 구축하는 경우에만 CONNECT와 함께 사용할 수 있다.
      CONNECT developer.mozilla.org:80 HTTP/1.1

    • OPTIONS와 함께 별표('*')하나로 서버 전체를 나타내는 'asterisk 형식'이다.
      OPTIONS * HTTP/1.1

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

헤더

요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따른다. 대소문자 구분 없는 문자열 다음에 콜론(':')이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라진다. 헤더는 값까지 포함해 한줄로 구성되지만, 꽤 길어질 수 있다.

다양한 종류의 요청 헤더가 있는데, 이들은 다음과 같이 몇몇 그룹으로 나눌 수 있다.

  • Via와 같은 General 헤더는 메시지 전체에 적용된다.

  • User-Agent (en-US), Accept와 같은 Request 헤더는 요청의 내용을 좀 더 구체화 시키고(Accept-Language), 컨텍스(?)를 제공하기도 하며(Referer), 조건에 따른 제약 사항을 주기도 하면서(If-None) 요청 내용을 수정한다.

  • 메시지 데이터의 원래 형식과 적용된 인코딩을 설명하는 Content-Type과 같은 Representation 헤더(메시지에 본문이 있는 경우에만 존재한다).

본문

본문은 요청의 마지막 부분에 들어간다. 모든 요청에 본문이 들어가지는 않는다. GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 보통 본문이 필요가 없다. 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송한다. 보통 (HTML 폼 데이터를 포함하는) POST 요청일 경우에 그렇다.

넓게 보면 두가지 종류로 나뉜다.

  • 헤더 두 개(Content-TypeContent-Length)로 정의된 단일 파일로 구성되는 단일-리소스 본문(single-resource bodies)이다.

  • 각각 서로 다른 정보를 담고 있는 멀티파트 본문으로 구성되는 다중-리소스 본문이다. 보통HTML 폼 (en-Us)과 관련이 있다.

HTTP 응답

상태 줄

HTTP 응답의 시작 줄은 '상태 줄(status line)' 이라고 불리며, 다음과 같은 정보를 가진다.

  1. 보통 HTTP/1.1인 프로토콜 버전이다.

  2. 요청의 성공 여부를 나타내는 '상태 코드'다. 일반적인 상태 코드는 200, 404 혹은 302 다.

  3. 사람이 HTTP 메시지를 이해할 때 도움이 되는 상태 코드에 대한 짧고, 순전히 정보 제공 목적의 '상태 텍스트'

상태 줄은 일반적으로 HTTP/1.1 404 Not Found 같이 표현된다.

헤더

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

다양한 종류의 응답 헤더가 있는데, 이들은 다음과 같이 몇몇 그룹으로 나눌 수 있따.

  • Via와 같은 General 헤더는 메시지 전체에 적용된다.

  • VaryAccept-Ranges와 같은 Response 헤더는 상태 줄에 포함되지 않은 서버에 대한 추가 정보를 제공한다.

  • 메시지 데이터의 원래 형식과 적용된 인코딩을 설명하는 Content-Type와 같은 Representation 헤더(메시지에 본문이 있는 경우에만 존재한다).

본문

본문은 응답의 마지막 부분에 들어간다. 모든 응답에 본문이 들어가지는 않는다. 해당 페이로등 없이도 요청에 충분히 응답하는 201 Created, 204 No Content 와 같은 상태 코드를 가진 응답에는 보통 본문이 없다.

넓게 보면 본문은 세가지 종류로 나뉜다.

  • Content-TypeContent-Length라는 두개의 헤더로 정의하는 길이 가 알려진 하나의 파일로 구성된 단일-리소스 본문(Single-resource bodies).

  • Transfer-Encodingchunked로 설정된 청크로 나뉘어 인코딩되는 길이를 모르는 하나의 파일로 구성된 단일-리소스 본문.

  • 서로 다른 정보를 담고 있는 멀티파트 본문으로 이루어진 다중 리소스 본문: 이 경우는 상대적으로 위의 두 경우에 비해 보기 힘들다.

HTTP/2 프레임


HTTP 헤더

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해준다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루어져있다. 값 앞에 붙은 빈 문자열은 무시된다.

헤더는 컨텍스트에 따라 그룹핑될 수 있다.

  • General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.

  • Request header: 패치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.

  • Response header: 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.

  • Entity header: 컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.

General 헤더 <- 정확히 어떤 역할?

General 헤더는 HTTP 헤더를 가리키는데 사용되는 구식 용어로, 요청 메시지와 응답 메시지 모두에 사용할 수 있지만 콘텐츠 자체에는 적용되지 않는다(콘텐츠에 적용된 헤더는 entity header라고 했다). 헤더가 사용되고 있는 컨텍스트에 따라, general 헤더는 response 또는 request 헤더일 수 있다(e.g. Cache-Control).

참고:
현재 버전의 HTTP/1.1 명세에서는 헤더를 "일반 헤더"로 구체적으로 분류하지 않습니다. 이제 컨텍스트에 따라 간단히 response 또는 request 헤더라고 합니다.

Request 헤더 <- 뭐지?

요청 헤더는 서버가 응답을 맞춤화할 수 있도록 요청 컨텍스트에 대한 정보를 제공하기 위해 HTTP 요청에서 사용할 수 있는 HTTP 헤더다. 예를 들어, Accept-* 헤더는 허용되는 응답 방식과 선호되는 형식을 나타낸다. 다른 헤더는 인증 자격 증명(예: Authorization)을 제공하거나, 캐싱을 제어하거나, 사용자 에이전트 또는 리퍼러에 대한 정보를 가져오는 데 사용될 수 있다.

요청에 나타날 수 있는 모든 헤더가 명세에 따라, "요청 헤더"로 참조되는 것은 아니다. 예를 들어, Content-Type 헤더는 representation header라고 한다.

또한, CORS는 요청 헤더의 하위 집합을 simple 헤더로 정의하고, 항상 인증된 것으로 간주되며 프리플라이트 요청에 대한 응답에 명시적으로 나열되지 않는 요청 헤더를 정의한다.

아래의 HTTP 메시지는 GET 요청 이후의 몇가지 요청 헤더를 보여준다.

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0

Response 헤더 <- 뭐지..?

응답 헤더는 HTTP 응답에서 사용될 수 있는 HTTP 헤더이며, 메시지의 컨텐츠와는 관련이 없다. Age, Location (en-US) 또는 Server와 같은 응답 헤더는 더 상세한 응답의 컨텍스트를 제공하기 위해 사용된다.

응답에 나타나는 모든 헤더가 "응답 헤더"인것은 아니다. 예를 들어, Content-Type 헤더는 응답 메시지 본문(Content-Encoding 표현 헤더의 인코딩이 적용되기 전)의 원래 데이터 유형을 나타내는 representation header이다. 그러나, "대화적으로" 모든 헤더는 일반적으로 응답 메시지에서 응답 헤더로 참조된다.

다음은 GET 요청 이후의 몇 가지 응답 헤더를 보여준다.

200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY

Entity 헤더

경고:
HTTP/1.1 명세는 더 이상 엔티티, 엔티티 헤더 또는 엔티티 본문을 참조하지 않습니다. 일부 필드는 이제 Representation header 필드라고 합니다.

Entity 헤더는 HTTP 메시지의 페이로드(예: 메시지 본문에 대한 메타데이터)를 나타내는 HTTP 헤더다. Content-Length, Content-Language, Content-Encoding, Content-Type, Expires 등과 같은 헤더는 Entity 헤더에 포함된다. Entity 헤더는 HTTP 요청 및 응답 모두에 존재할 수 있다.

Entity 헤더가 요청이나 응답 헤더가 아님에도 불구하고, 이러한 용어로 종종 포함된다.

다음 예제에서, Content-Length는 Entity 헤더지만, HostUser-Agent (en-US)는 request 헤더다.

POST /myform.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Content-Length: 128

Representation 헤더

Representation 헤더는 HTTP 메시지 본문으로 전송된 리소스의 특정 '표현'을 설명하는 HTTP 헤더다.

표현은 특정 리소스의 다양한 형태다. 예를 들어, 동일한 데이터가 XML 또는 JSON과 같은 특정 미디어 타입으로 형식화되거나, 작성된 언어 또는 지리적 지역으로 지역화되거나, 전송을 위해 압축되거나 인코딩될 수 있다. 기본 리소스는 각 경우에 동일하지만, 표현은 다르다.

클라이언트는 콘텐츠 협상(content negotiation) (Accept-*헤더 사용) 중에 전송되기를 선호하는 형식을 지정하고, 표현 헤더는 실제로 수신한 '선택된 표현'의 형식을 클라이언트에게 알려준다.

표현 헤더는 HTTP 요청과 응답 메시지 모두에 존재할 수 있다. HEAD 요청에 대한 응답으로 전송되면, 리소스가 실제로 요청된 경우 '선택될' 본문 컨텐츠를 설명한다.

표현 헤더는 Content-Type, Content-Encoding, Content-LanguageContent-Location을 포함한다.


참조

MDN HTTP
MDN HTTP 메시지
MDN HTTP 헤더
MDN General 헤더
MDN Request 헤더
MDN Entity 헤더
MDN Representation 헤더

profile
🚙 HMG SOFTEER 3rd | 💻 BE

0개의 댓글