HTTP 3장 HTTP 메시지

황상진·2022년 8월 1일
0

HTTP

목록 보기
4/5
post-thumbnail

HTTP 메시지

메시지의 흐름

  • 메시지는 원 서버 방향을 인바운드로 하여 송신된다.

인바운드: 클라이언트에서 서버로
아웃바운드: 서버에서 클라이언트로

  • 다운스트림으로 흐르는 메시지
  • 메시지의 발송자는 수신자의 업스트림이다.
  • 클라 → 서버 → 클라의 과정이 강물(다운스트림)처럼 흐름

메시지의 각 부분

  • 메시지는 시작줄, 헤더 블록, 본문 이렇게 세 부분으로 나뉜다.

줄바꿈 문자열을 ‘CRLF’라고 쓰며 오래되거나 잘못 만들어진 HTTP 애플리케이션들 중엔 이를 전송하지 않는 것들도 있다.

메시지 문법

  • 모든 HTTP 메시지는 요청 메시지나 응답 메시지로 분류된다.
// 요청 메시지 형식
<메서드> <요청 URL> <버전>
<헤더>

<엔터티 본문>

// 응답 메시지 형식
<버전> <상태 코드> <사유 구절>
<헤더>

<엔터티 본문>

HTTP의 구성요소에 대한 설명

  • 메서드

    • GET, POST, PUT, DELETE
    • HEAD(서버에서 어떤 문서에 대한 헤더를 가져옴)
    • TRACE(메시지가 프락시를 거쳐 서버에 도달하는 과정을 추적)
    • OPTIONS(서버가 어떤 메서드를 수행할 수 있는지 확인)
      -> 이외의 서버에서 사용하는 메서드는 확장 메서드
  • 요청 URL

    • 요청 대상이 되는 리소스를 지칭하는 완전한 URL 또는 URL의 경로 구성요소
  • 상태코드

    • 클라이언트에게 무엇이 일어났는지 말해줌
  • 사유 규절

    • 자로 된 상태 코드의 의미를 사람이 이해할 수 있게 설명해주는 짧은 문구
  • 헤더들(Headers)

    • 이름:값 으로 구성 된 헤더 목록. 마지막 줄은 빈 줄로 끝남
  • 엔티티 본문

    • 엔티티 본문은 임의의 데이터 블록을 포함
    • 엔티티 본문 없이 빈 줄로 끝나는 메시지도 있음
  • 버전번호

    • 버전번호는 HTTP/x.y 형식으로 요청과 응답을 메시지 양쪽 모두에 기술된다. 이는 때때로 혼란을 유발하는데, HTTP/1.1 이라는 응답을 받았을 때, 응답의 프로토콜 버전이 그 버전이 아닌 응답을 보낸 애플리케이션이 그 버전까지 이해할 수 있음을 의미하는 것이다.

메서드

  • 모든 서버가 모든 메서드를 구현하지 않으며, 보통 GET이나 HEAD 메서드만을 구현하는 것으로 충분하다. 또한 메서드는 대부분 제한적으로 사용된다.(DELETE나 PUT 처럼 아무나 저장된 리소스를 삭제 및 변경하길 바라지 않는다.)

안전한 메서드

  • 안전한 메서드란 HTTP 요청의 결과 서버에 어떤 작용도 없음을 의미한다.(GET, HEAD 처럼)
    • 서버에 어떤 영향을 줄 수 있는 안전하지 않은 메서드가 사용될 때, 사용자들에게 그 사실을 알려주는 HTTP 애플리케이션을 만들 수 있도록 하는 것에 있다.(안전하지 않은 요청 시, 서버에서 어떤일이 일어날 수 있음을 알려주는 경고 메시지를 띄우는 것)

GET

  • 주로 서버에서 리소스를 달라고 요청하기 위해 쓰인다.

PUT

  • 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면 본문을 사용해서 교체하는 것

POST

  • 서버에 입렫 데이터를 전송하기 위해 설계되었다.
  • 실제로, HTML 폼을 지원하기 위해 흔히 사용된다.

DELETE

  • 서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청
  • 그러나 클라이언트는 삭제가 수행되는 것을 보장하지 못한다.
  • 왜냐하면 서버가 클라이언트에게 알리지 않고 요청을 무시하는 것을 허용하기 때문
  • 서버는 응답으로 헤더만으로 돌려주어 다음을 알 수 있다.

    	- 리소스를 가져오지 않고 그에 대해 무엇인가를 알아낼 수 있다.
    	- 응답의 상태 코드를 통해 엔터티가 존재하는지 확인할 수 있다.
    	- 헤더를 확인하여 리소스가 변경되었는지 검사할 수 있다.
      

TRACE

  • 목적지 서버에서 루프백 진단을 시작한다. → 주로 진단을 위해 사용
  • 이 요청은 어떠한 엔터티 본문을 보낼 수 없고, 응답의 엔터티 본문에는 서버가 받은 요청이 그대로 들어있다.

OPTIONS

  • 웹 서버에게 여러 가지 종류의 지원 범위에 대해 물어본다.
  • 몇몇 서버는 특정 종류의 객체에 대해 특정 동작만을 지원한다.
  • 응답의 결과로 헤더에 지원하는 HTTP 메서드 목록을 반환한다.

확장 메서드

  • 대표 예시
    - LOCK(동시에 편집 못하도록 리소스 잠금기능)
    • MKCOL(문서 생성)
    • COPY(서버에 있는 리소스 복사)
    • MOVE(리소스 옮김)

    상태 코드

1xx - 정보성 상태 코드

  • 100 Continue
    - 요청의 시작 부분이 일부가 받아 들여 졌으며, 클라이언트는 나머지를 계속 이어서 보내야 함을 의미
  • 101 Switching Protocols
    - 클라이언트가 Upgrade 헤더에 나열한 것 중 하나로 서버가 프로토콜을 바꾸었음을 의미

2xx - 성공 상태 코드

  • 200 OK
    - 요청은 정상이고, 엔티티 본문은 요청된 리소스를 포함하고 있음
  • 201 Created
    - 서버 리소스를 생성 요청(예: POST)에 대한 응답
  • 202 Accepted
    - 요청은 받아 들여졌으나 서버는 아직 그에 대한 어떤 동작도 수행하지 않았음
  • 203 Non-Authoritative Information
  • 204 No Content
    - 응답 메시지는 헤더와 상태줄을 포함하지만 엔티티 본문은 포함하지 않음
    - DELETE와 같이 실행 후 반환 할 값이 없는 경우 사용
    - GET 요청 시 리소스가 없는 경우에는 200과 함께 빈 값을 반환
  • 205 Reset Content
  • 206 Partial Content

3xx - 리다이렉션 상태 코드

  • 300 Multiple Choices
    - 클라이언트가 동시에 여러 리소스를 가리키는 URL을 요청한 경우, 그 리소스의 목록과 함께 반환
  • 301 Moved Permanently
    - 요청한 URL이 옮겨졌을 때 사용
  • 302 Found
  • 303 See Other
  • 304 Not Modified
    - GET과 함께 수정 일에 대한 조건부 헤더를 보낸 경우. 수정되지 않은 경우 사용
  • 305 Use Proxy
  • 307 Temporary Redirect

4xx - 클라이언트 에러 상태 코드

  • 400 Bad Request
    - 클라이언트가 잘못 된 요청을 보냈다고 말해줌
  • 401 Unauthorized
    - 인증이 필요하다고 알려줌
  • 402 Payment Required
  • 403 Forbidden
    - 요청이 서버에 의해 거부 되었음을 알려줌. 거부 된 이유는 본문에 포함시킬 수 있음
  • 404 Not Found
    - 서버가 요청한 URL을 찾을 수 없을 때 사용
  • 405 Method Not Allowed
    - 요청한 URL에 대해, 지원하지 않는 메서드로 요청 받았을 때 사용
  • 406 Not Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
    - 클라이언트의 요청을 완수하기에 시간이 너무 많이 걸리는 경우, 서버는 이 상태 코드로 응답하고 연결을 끊을 수 있음
  • 409 Conflict
  • 410 Gone
  • 411 Length Required
  • 412 Precondition Failed
  • 413 Request Entity Too Large
  • 414 Request URI Too Long
  • 415 Unsupported Media Type
  • 415 Requested Range Not Satisfiable
  • 417 Expectation Failed
  • 422 Unprocessable Entity
    - 해석 가능한 Content-Type의 엔티티이지만, 데이터 필드 등이 유효하지 않은 경우 (하지만 표준은 아님)

5xx - 서버 에러 상태 코드

  • 500 Internal Server Error
    -서버가 요청을 처리할 수 없게 만드는 에러는 만났을 때 사용
  • 501 Not Implemented
  • 502 Bad Gateway
    - Gateway로 부터 올바른 응답을 받지 못했을 때 사용
  • 503 Service Unavailable
    - 현재는 서버가 요청을 처리해 줄 수 없지만 나중에는 가능함을 의미
  • 504 Gateway Timeout
    - 다른 서버에게 요청을 보내고 응답을 기다리다가 타임아웃이 발생한 Gateway나 Proxy에서 온 응답
  • 505 HTTP Version Not Supported
    - 서버가 지원할 수 없거나 지원하지 않으려고 하는 버전의 프로토콜로 된 요청을 받았을 때

헤더

일반 헤더

  • Date : 메시지가 언제 만들어 졌는지에 대한 날짜와 시간을 제공
  • Upgrade : 발송자가 '업그레이드'하길 원하는 새 버전이나 프로토콜을 알려줌
  • Via : 이 메시지가 어떤 중개자(Proxy, Gateway)를 거쳐 왔는지 보여줌

요청 헤더

  • Host : 요청의 대상이 되는 서버의 호스트 명과 포트
  • Referer : 현재의 요청 URL이 들어있었던 문서의 URL
  • User-Agent : 요청을 보낸 애플리케이션의 이름

Accept 관련 요청 헤더

  • Accept : 서버가 보내도 되는 미디어 종류
  • Accept-Charset : 서버가 보내도 되는 문자 집합
  • Accept-Encoding : 서버가 보내도 되는 인코딩
  • Aceept-Language : 서버가 보내도 되는 언어

조건부 요청 헤더

  • Expect : 클라이언트가 요청에 필요한 서버의 행동을 열거할 수 있게 해줌
  • If-Match : 문서의 엔티티 태그가 주어진 엔티티 태그와 일치하는 경우에만 문서를 가져옴
  • If-None-Match : 문서의 엔티티 태그가 주어진 엔티티 태그와 일치하지 않는 경우에만 문서를 가져옴
  • If-Modified-Since : 주어진 날짜 이후에 리소스가 변경 된 경우에만 리소스를 가져옴
  • If-Unmodified-Since : 주어진 날짜 이후에 리소스가 변경되지 않은 경우에만 리소스를 가져옴
  • If-Range : 문서의 특정 범위에 대한 요청을 할 수 있게 해줌
  • Range : 서버가 범위 요청을 지원한다면, 리소스에 대한 특정 범위를 요청

요청 보안 헤더

  • Authorization : 클라이언트가 서버에게 제공하는 인증 그 자체에 대한 정보 (예: JWT Token, OAuth Token 등)
  • Cookie : 클라이언트가 서버에게 토큰을 전달할 때 사용
  • Cookie2 : 요청자가 지원하는 쿠키의 버전을 알려줄 때 사용

응답 헤더

  • Age : 응답이 얼마나 오래 되었는지
  • Public : 서버가 특정 리소스에 대해 지원하는 요청 메서드의 목록
  • Retry-After : 현재 리소스가 사용 불가능한 상태일 때, 언제 가능해지는지 날짜 혹은 시각
  • Server : 서버 애플리케이션 이름과 버전
  • Title : HTML 문서에서 주어진 것과 같은 제목
  • Warning : 사유 구절에 있는 것보다 더 자세한 경고 메세지

협상 헤더

  • Accept-Ranges : 서버가 자원에 대해 받아들일 수 있는 범위의 형태
  • Vary : 서버가 확인해 보아야 하고 그렇기 때문에 응답에 영향을 줄 수 있는 헤더들의 목록. 예) 권한 관리를 위한 Access-Control-Request-Method, Access-Control-Request-Headers, Origin

응답 보안 헤더

  • Proxy-Authenticate : Proxy에서 클라이언트로 보낸 인증요구의 목록
  • Set-Cookie : 서버가 클라이언트를 인증할 수 있도록 클라이언트 측에 토큰을 설정하기 위해 사용
  • WWW-Authenticate : 서버에서 클라이언트로 보낸 인증요구 목록

엔터티 헤더

  • Allow : 이 엔티티에 대해 수행될 수 있는 요청 메서드 목록
  • Location : 클라이언트에게 엔티티가 어디에 위치하고 있는지 알려줌

콘텐츠 헤더

  • Content-Base : 본문에서 사용 된 상대 URL을 계산하기 위한 Base URL
  • Content-Encoding : 본문에 적용 된 인코딩
  • Content-Language : 본문을 이해하기 위한 언어
  • Content-Length : 본문의 길이나 크기
  • Content-Location : 리소스의 실제 위치
  • Content-MD5 : 본문의 MD5 체크섬
  • Content-Range : 전체 리소스에서 이 엔티티가 해당하는 범위를 바이트 단위로 표현
  • Content-Type : 본문의 객체 종류

엔터티 캐싱 헤더

  • ETag : 엔티티에 대한 엔티티 태그 (AWS S3에서 이미지를 다룰 때 사용했던 것 같음)
  • Expires : 엔티티의 만료 일시
  • Last-Modified : 가장 최근 엔티티가 변경된 일시
profile
Web FrontEnd Developer

0개의 댓글