HTTP 메시지

김태완·2022년 12월 13일
1

독서 스터디

목록 보기
6/8

http 통신의 근간인 https메시지에 대해 알아보자

메시지의 흐름

인바운드 : 클라이언트 -> 프락시1 -> 프락시2 -> 서버
아웃바운드 : 서버 -> 프락시2 -> 프락시1 -> 클라이언트
즉, request가 인바운드, response가 아웃바운드

http 메시지의 흐름은 다운스트림이다.
따라서 요청의 방향에 따라 업스트림과 다운스트림이 달라질수있다.

  • 메시지의 구성은 아래와 같다
GET /user/info HTTP/1.0
Host : www.naver.com


HTTP/1.1 200 OK  // 메시지의 스킴 및 상태 *
Content-type : text/plain 
Content-length : 19 ... // 헤더속성 *
CRLP
Hellow world!
{ "id" : "twkim", "pw" : "1234"}
new formData() ... // 본문 데이터 ? 

메시지 문법

구성요소

메서드 : 서버가 수행하길 원하는 동작
요청 URL : 요청 대상이 되는 URL로, 절대URL형태이며, 실무에선 요청 URL을 바라보며 소통함

버전 : http버전이며 1.0은 대중화 1.1은 최신정도로 알면될듯?
상태코드 : 응답 상태를 나타내는 코드로 성공시 200을 내려준다
사유 구절 : 응답상태를 사람이 이해할수있는 구절로 알려주며, 이는 변동가능하다
헤더 : " name : value" 형태를 띄며 특정 버전에서는 특정 헤더가 필수로 요구되기도한다

헤더는 항상 CRLF(빈줄)로 끝나야하지만 생략되는 예외처리도 해야한다. (빼먹는 경우가 잦음)

본문 : string, 이진데이터들의 집합. 비어있을수도있음.

예시

  • 요청
메서드 / 요청URL /버전
헤더
본문

GET /img/react.png HTTP/1.1
Host : www.b4play.io
  • 응답
버전 / 상태코드 / 상태구절
헤더
본문

HTTP/1.1 200 OK
Content-type : image/png
Content-length : 9999

요청 메서드

  • GET : 리소스 요청, HTTP/1.1준수,
  • HEAD : GET과 달리 헤더만 요청하고 엔터티 본문은 반환되지않음, HTTP/1.1준수
    리소스를 가져오지않고 서버에 엔터티가 존재하는지, 그 타입 및 사이즈가 어느정도인지, 변경여부등만 확인
  • PUT : 서버에 리소스(문서)를 추가, 서버 리소스를 변경시키기 때문에 보통 수행전에 auth과정을 거침.
  • POST : 서버에 입력데이터(HTML form등)를 추가하기위해 설계.
  • TRACE : client와 server사이의 중개자(proxy, gateway, firewa등)에 의해 요청이 바뀔수있는데, 이를 진단하기위한 목적으로 사용.
  • OPTIONS : 해당 서버에서 지원하는 메서드가 무엇인지 요청
  • DELETE : 서버 리소스를 삭제.
  • 확장메서드 : LOCK, MKCOL, COPY, MOVE 등.

여기서 안전한 메서드멱등성에 대해 짚고 넘어가면,
안전한 메서드는 서버의 상태를 아예 변경시키지 않는다.
하지만 멱등한 메서드는 서버의 상태를 변화시킬수도있고, 변경시키지 않을수도있다.
https://velog.io/@dion/HTTP-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

응답 상태코드

  • 1xx : 정보성 상태코드로 HTTP/1.1에 도입.

  • 2xx : 성공 상태코드

    • 200 OK
    • 201 Created : PUT의 응답
    • 202 Accepted : 요청은 받았으나 수행된 내용이 없음
    • 203
    • 204 No Content : 응답에 엔터티 본문이 없음, 주로 페이지 갱신시
    • 205 Reset Cotent : Form의 내용을 비우라고 응답
    • 206
  • 3xx : 리다이렉션 상태코드로, 요청한 리소스가 다른위치에 있거나할때 알림

    • 300 Multiple Choice : 요청이 여러 리소스를 가르킬때
    • 301 Moved Permanently : 요청한 리소스 위치가 옮겨졌을때
    • 302
    • 303
    • 304
    • 305 Not Modified : 반드시 프락시들 통해 접근해야함을 알림
    • 306
    • 307
  • 4xx : 클라이언트 에러 상태코드

    • 400 Bad Request
    • 401 Unauthorized
    • 402
    • 403 Forbidden : 요청 거부
    • 404 Not Found
    • 405 Method Not Allowed : 지원하지않는 메서드
    • 406
    • 407
    • 408 Request Timeout : 너무 많은 시간이 걸리는경우, (sftp연결할때 봤던경험.)
      ...
    • 417
  • 5xx : 서버 에러 상태코드

    • 500 Internal Server Error :
    • 501 Not Implemented : 서버에서 처리불가(지원하지않는 메서드 등)
    • 502 Bad Gateway : 중재자 (proxy, gateway등)가 가짜 응답에 맞닥뜨렸을때 (?)
    • 503
    • 504
    • 505

헤더

  • 일반헤더 : 클라이언트, 서버 양쪽에서 사용가능한 헤더, ex) Date헤더

    • 일반 캐시 헤더 Cache-Control : 원 서버로부터 매번 자원을 가져오는대신 로컬 복사본을 캐시할수있도록 해주는 헤더
  • 요청헤더 : 서버에게 클라이언트에서 받고자하는 타입을 명,

    • Accept헤더 : 서버에게서 원하는 리소스 타입만 지정하는 헤더면서 원치않는 리소스를 거절하는 용도로 많이 사용됨
  • 응답헤더 : 응답 및 서버정보를 나타내는 헤더

  • 엔터티헤더 : 엔터티 본문데이터의 MIME 타입을 나타내는 헤더, ex) Content-Type

    ISO표준
    ex) iso-latin-1
    https://ko.wikipedia.org/wiki/ISO/IEC_8859-1
    ex) iso-timestamp
    https://en.wikipedia.org/wiki/ISO_8601

  • 확장헤더 : 개발자에 의해 만들어진 비표준 헤더

refere

https://www.blog-dreamus.com/post/cache-control-%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0

profile
프론트엔드개발

0개의 댓글