본문 바로가기
📚 STUDY/Computer Science

[백엔드 세미나] HTTP

by 윤 | YUN 2022. 5. 28.

HTTP

HTTP 개요

  • HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 protocol이다. HTTP는 웹에서 이루어지는 모든 data exchange의 기초이며,client-server protocol이기도 하다. client-server protocol이란 request가 수신자(보통 웹브라우저)에 의해 초기화되는 protocol을 의미한다. 하나의 완전한 문서는 text, layout description, images, videos, scripts 등 fetch된 하위 문서들로 재구성됩니다.
  • 클라이언트와 서버는 message를 exchange함으로써 communication한다. client에 의해 전송되는 message는 request, server에 의해 전송되는 message는 response라고 불린다.

HTTP 기반 시스템의 구성 요소

  • 각각의 개별적인 request들은 서버로 보내지며, 서버는 request를 처리하고 response를 보낸다. 이 request와 response 사이에는 여러 개체들이 있는데, 예를 들면 다양한 작업을 수행하는 gateway 또는 캐시 역할을 하는 proxy 등이 있다.

  • proxy
    • 웹 브라우저와 서버 사이에서는 수많은 컴퓨터와 머신이 HTTP 메시지를 이어 받고 전달한다. 여러 계층으로 이루어진 웹 스택 구조에서 이러한 컴퓨터/머신들은 대부분은 전송, 네트워크 혹은 물리 계층에서 동작하며, 성능에 상당히 큰 영향을 주지만 HTTP 계층에서는 이들이 어떻게 동작하는지 눈에 보이지 않는다. 이러한 컴퓨터/머신 중에서도 애플리케이션 계층에서 동작하는 것들을 일반적으로 프록시라고 부른다. 프록시는 눈에 보이거나 그렇지 않을 수도 있으며(프록시를 통해 요청이 변경되거나 변경되지 않는 경우를 말함) 다양한 기능들을 수행할 수 있다
      • 캐싱 (캐시는 공개 또는 비공개가 될 수 있습니다 (예: 브라우저 캐시))
      • 필터링 (바이러스 백신 스캔, 유해 컨텐츠 차단(자녀 보호) 기능)
      • 로드 밸런싱 (여러 서버들이 서로 다른 요청을 처리하도록 허용)
      • 인증 (다양한 리소스에 대한 접근 제어)
      • 로깅 (이력 정보를 저장)

HTTP flow

  1. TCP 연결을 연다
    • TCP 연결은 요청을 보내거나(혹은 여러개의 요청) 응답을 받는데 사용된다. 클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나, 서버에 대한 여러 TCP 연결을 열 수 있다.
  2. HTTP 메시지를 전송한다
    • HTTP/2 이전의 HTTP 메시지는 사람이 읽을 수 있다. HTTP/2에서는 이런 간단한 메시지가 프레임 속으로 캡슐화되어, 직접 읽는 게 불가능하지만 원칙은 동일하다.
    • GET / HTTP/1.1 Host: developer.mozilla.org Accept-Language: fr
  3. 서버에 의해 전송된 응답을 읽어들인다
  4. HTTP/1.1 200 OK Date: Sat, 09 Oct 2010 14:28:02 GMT Server: Apache Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT ETag: "51142bc1-7449-479b075b2891b" Accept-Ranges: bytes Content-Length: 29769 Content-Type: text/html <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
  5. 연결을 닫거나 다른 요청들을 위해 재사용한다.

HTTP request

  • 구성 요소
    • TTP method, 보통 클라이언트가 수행하고자 하는 동작을 정의한 [GET], [POST]같은 동사나 [OPTIONS][HEAD]와 같은 명사.
    • 가져오려는 리소스의 경로
      • 예를 들면 프로토콜 (http://), 도메인 등, 여기서는 developer.mozilla.org), 또는 TCP 포트 (en-US) (여기서는 80)인 요소들을 제거한 리소스의 URL이다.
    • HTTP 프로토콜의 버전.
    • 서버에 대한 추가 정보를 전달하는 선택적 헤더들.
    • POST와 같은 몇 가지 메서드를 위한, 전송된 리소스를 포함하는 응답의 본문과 유사한 본문.

HTTP Response

  • 구성 요소
    • HTTP 프로토콜의 버전.
    • 요청의 성공 여부와, 그 이유를 나타내는 status code
    • 아무런 영향력이 없는, 상태 코드의 짧은 설명을 나타내는 상태 메시지.
    • 요청 헤더와 비슷한, HTTP 헤더들.
    • 선택 사항으로, 가져온 리소스가 포함되는 본문.

HTTP response status codes

Informational responses

[100 Continue]

임시 응답, request를 지속한다. request가 이미 완료된 경우에는 무시한다.

[101 Switching Protocol]

이 코드는 클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 들어가며 서버에서 프로토콜을 변경할 것임을 알려준다.

[102 Processing]

서버가 요청을 수신하였으며 이를 처리하고 있지만, response가 아직 available하지 않음을 의미한다.

[103 Early Hints]

이 status code는 주로 Link 헤더와 함께 사용되어 서버가 응답을 준비하는 동안 user agent가 preloading을 시작할 수 있도록 한다.

Successful responses

[200 OK]

request 성공

  • GET: resource가 fetch되어 message body에 전송됨.
  • HEAD: representation header가 message body없이 response에 포함됨.
  • PUT / POST: 수행 결과에 대한 resource가 message body에 전송됨.
  • TRACE: message body는 서버에서 수신한 request message를 포함하고 있음.

[201 Created]

request가 성공되었고 결과로 새로운 resource가 생성됨. 이 응답은 일반적으로 POST 요청 또는 일부 PUT 요청 이후에 전송됨.

[202 Accepted]

request을 수신하였지만 그에 맞는 action을 할 수 없음. 이 응답은 요청 처리에 대한 결과를 이후에 HTTP로 비동기 응답을 보내는 것에 대해서 명확하게 명시하지 않습니다. 이것은 다른 프로세스에서 처리 또는 서버가 요청을 다루고 있거나 배치 프로세스를 하고 있는 경우를 위해 만들어졌습니다.

203 Non-Authoritative Information

이 응답 코드는 반환된 metadata가 origin server의 데이터와 일치하지 않지만 로컬이나 서드 파티 복사본에서 collect 되었음을 의미한다. 이러한 특별한 케이스를 제외하고는, 203 대신 200 OK response가 더 선호된다.

[204 No Content]

request에 대해 보낼 수 있는 content가 없지만, 헤더는 useful할 수도 있음을 의미한다. user agent는 이 리소스에 대해 캐시된 헤더를 새 헤더로 업데이트 할 수 있다.

[205 Reset Content]

request를 끝낸 후에 user agent에게 이 request를 보낸 document를 리셋하라고 알려준다.

[206 Partial Content]

client에서 resource의 일부분만 요청하기 위해 Range 헤더를 전송할 때만 사용된다.

[207 Multi-Status] (WebDAV)

여러 status codes가 적합한 상황을 위해 multiple resource에 대한 정보를 전달한다.

[208 Multi-Status] (WebDAV (en-US))

dav:propstat에서 response element로 동일한 collection에 대한 multiple binding의 내부 멤버를 반복적으로 열거하는 것을 피하기 위해 사용된다.

[226 IM Used] (HTTP Delta encoding)

서버가 resource에 대한 GET request를 수행했고, response는 현재 인스턴스에 적용된 하나 이상의 인스턴스 조작 결과를 나타냅니다.

Redirection messages

300 Multiple Choice (en-US)

요청에 대해서 하나 이상의 응답이 가능합니다. 사용자 에이전트 또는 사용자는 그중에 하나를 반드시 선택해야 합니다. 응답 중 하나를 선택하는 방법에 대한 표준화 된 방법은 존재하지 않습니다.

[301 Moved Permanently]

이 응답 코드는 요청한 리소스의 URI가 변경되었음을 의미합니다. 새로운 URI가 응답에서 아마도 주어질 수 있습니다.

[302 Found]

이 응답 코드는 요청한 리소스의 URI가 일시적으로 변경되었음을 의미합니다. 새롭게 변경된 URI는 나중에 만들어질 수 있습니다. 그러므로, 클라이언트는 향후의 요청도 반드시 동일한 URI로 해야합니다.

303 See Other (en-US)

클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답입니다.

[304 Not Modified]

이것은 캐시를 목적으로 사용됩니다. 이것은 클라이언트에게 응답이 수정되지 않았음을 알려주며, 그러므로 클라이언트는 계속해서 응답의 캐시된 버전을 사용할 수 있습니다.

305 Use Proxy

이전 버전의 HTTP 기술 사양에서 정의되었으며, 요청한 응답은 반드시 프록시를 통해서 접속해야 한다.

[307 Temporary Redirect]

클라리언트가 요청한 리소스가 다른 URI에 있으며, 이전 요청과 동일한 메소드를 사용하여 요청해야할 때, 서버가 클라이언트에 이 응답을 직접 보낸다.

Client error responses

[400 Bad Request]

이 응답은 잘못된 문법으로 인해 서버가 request을 이해할 수 없음을 의미한다.

[401 Unauthorized]

"인증되지 않음(unauthenticated)"을 의미한다. 클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 한다.

[403 Forbidden]

콘텐츠 접근 권한이 없음. 서버는 거절을 위한 적절한 응답을 보낸다. 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다는 것이다.

[404 Not Found]

서버가 요청받은 리소스를 찾을 수 없음. 브라우저에서는 알려지지 않은 URL을 의미한다.

[405 Method Not Allowed]

요청한 메소드는 서버에서 알고 있지만, 제거되었고 사용할 수 없다.

[408 Request Timeout]

이 응답은 요청을 한지 시간이 오래된 연결에 일부 서버가 전송하며, 어떨 때에는 이전에 클라이언트로부터 어떠한 요청이 없었다고 하더라도 보내지기도 한다. 이는 서버가 사용되지 않는 연결을 끊고 싶어한다는 것을 의미한다. 이 응답은 특정 몇몇 브라우저에서 빈번하게 보이는데, Chrome, Firefox 27+, 또는 IE9와 같은 웹서핑 속도를 올리기 위해 HTTP 사전 연결 메카니즘을 사용하는 브라우저들이 해당된다. 또한 일부 서버는 이 메시지를 보내지 않고 연결을 끊어버리기도 한다.

[409 Conflict]

요청이 현재 서버 상태와 충돌함.

410 Gone (en-US)

요청한 콘텐츠가 서버에서 영구적으로 삭제되었으며, 전달해 줄 수 있는 주소 역시 존재하지 않음.

[411 Length Required]

서버에서 필요로 하는 Content-Length 헤더 필드가 정의되지 않은 요청이 들어와, 서버가 요청을 거절한다.

412 Precondition Failed

클라이언트의 헤더에 있는 전제조건은 서버의 전제조건에 적절하지 않다.

[413 Payload Too Large]

요청 엔티티는 서버에서 정의한 한계보다 크다.

414 URI Too Long

클라이언트가 요청한 URI가 서버에서 처리할 수 있는 길이보다 길다.

415 Unsupported Media Type

요청한 미디어 포맷은 서버에서 지원하지 않음.

[416 Requested Range Not Satisfiable]

Range 헤더 필드에 요청한 지정 범위가 타겟 URI 데이터의 크기를 벗어났을 가능성이 있다.

417 Expectation Failed

이 응답 코드는 Expect 요청 헤더 필드로 요청한 예상이 서버에서는 적당하지 않음을 알려준다.

[421 Misdirected Request]

서버로 유도된 요청은 응답을 생성할 수 없다. 이것은 서버에서 요청 URI와 연결된 skeme과 권한을 구성하여 응답을 생성할 수 없을 때 전송된다.

[422 Unprocessable Entity]

요청은 잘 만들어졌지만, 문법 오류로 인해 따를 수 없다.

[423 Locked] (WebDAV)

리소스는 접근이 lock 되어있다.

[424 Failed Dependency]

이전 요청이 실패했기 때문에 지금의 요청도 실패했다.

426 Upgrade Required

서버는 지금의 프로토콜을 사용하여 요청을 처리하는 것을 거절하였지만, 클라이언트가 다른 프로토콜로 업그레이드를 하면 처리를 할지도 모릅니다. 서버는 Upgrade (en-US) 헤더와 필요로 하는 프로토콜을 알려주기 위해 426 응답에 보냅니다.

428 Precondition Required

origin server는 요청이 조건적이어야 합니다. 클라이언트가 리소스를 GET해서, 수정하고, 그리고 PUT으로 서버에 돌려놓는 동안 서드파티가 서버의 상태를 수정하여 발생하는 충돌인 '업데이트 상실'을 예방하기 위한 목적입니다.

429 Too Many Requests (en-US)

사용자가 지정된 시간에 너무 많은 요청을 보냄("rate limiting").

[431 Request Header Fields Too Large]

요청한 헤더 필드가 너무 커서 서버가 요청을 처리하지 않는다.

451 Unavailable For Legal Reasons

사용자가 요청한 것은 정부에 의해 검열된 웹 페이지와 같은 불법적인 resource다.

Server error responses

[500 Internal Server Error]

서버가 처리 방법을 모름.

[501 Not Implemented]

요청 방법은 서버에서 지원되지 않으므로 처리할 수 없다.

[502 Bad Gateway]

서버가 요청을 처리하는 데 필요한 응답을 얻기 위해 게이트웨이로 작업하는 동안 잘못된 응답을 수신했음

[503 Service Unavailable]

서버가 요청을 처리할 준비가 되지 않음.

[504 Gateway Timeout]

이 오류 응답은 서버가 게이트웨이 역할을 하고 있으며 적시에 응답을 받을 수 없을 때 주어진다.

[505 HTTP Version Not Supported]

요청에 사용된 HTTP 버전은 서버에서 지원되지 않는다.

댓글