HTTP, HTTP Method

xxziiko·2024년 12월 13일

[Network]

목록 보기
3/6
post-thumbnail

김영한님의 모든개발자를 위한 HTTP 웹 기본 지식을 수강 후 해당 내용을 기반으로 작성한 글입니다.

HTTP

  • HyperText Transfer Protocol
  • 웹에서 클라이언트(주로 웹 브라우저)와 서버 간에 데이터를 주고받기 위한 프로토콜
  • 요청(request)과 응답(response)로 이루어진 비연결성 기반의 프로토콜
  • 텍스트, 이미지, 비디오와 같은 다양한 형태의 리소스를 전송
  • 실무에서 통신할 때 TCP/IP를 직접 연결하기 보다는 HTTP 프로토콜을 통해 전송함(게임서버와 같은 특수한 경우 제외)
  • HTML과 같은 문서 뿐만 아니라 거의 모든 것을 전송
  • 현재는 HTTP/1.1 버전을 가장 많이 사용하며, HTTP/2는 HTTP/1.1에서 성능 개선 정도 업그레이드, HTTP/3는 TCP 대신 UDP를 사용하여 성능 개선한 정도


기반 프로토콜

  • HTTP/1.1와 HTTP/2는 TCP 기반 프로토콜
  • HTTP/3은 UDP 기반 프로토콜
  • TCP 기반은 3 way handshake 기법과 같은 내부 메커니즘 자체가 속도에 최적화 되어있지 않음
  • 에플리케이션 레벨에서 UDP 프로토콜 위에 성능을 최적화하여 개선한 것이 HTTP/3

실제로 어떻게 사용되고 있을까?

크롬

네이버



HTTP 특징

클라이언트 - 서버 구조

  1. 요청(request)과 응답(response) 기반의 통신
  • 클라이언트는 서버에 요청을 보내고, 응답을 대기
  • 서버가 요청에 대한 결과를 만들어서 응답

  1. 클라이언트와 서버의 역할 분리
  • 과거에는 클라이언트-서버가 분리되어있지 않았으나 클라이언트와 서버 구조를 명확히 분리하면서 각각의 역할에 집중시켜 독립적으로 발전할 수 있었다.
    • 서버의 역할
      • 비즈니스 로직과 데이터 관리에 집중
      • 클라이언트로부터 요청을 받고, 이에 따라 필요한 데이터를 처리하거나 응답 생성
    • 클라이언트의 역할
      • 사용자 인터페이스(UI)와 사용자 경험(UX)에 집중
      • 사용자의 요청을 처리하여 서버로 전달하거나 서버로부터 받은 데이터를 최적화하여 표현
  • 클라이언트-서버 구조로 분리함으로써 확장성, 독립성, 유지보수성을 높이고 다양해진 플랫폼에 적합한 유연성을 제공할 수 있게 됨

무상태 프로토콜(Stateless)

  • 서버가 클라이언트 상태를 보존하지 않는다.

  • 즉, stateful은 서버가 클라이언트의 이전 상태(context)를 보존한다.

  • 중간에 서버에 이상이 생긴다면 서비스 장애가 생기는 것.

  • 무상태는 고객이 필요한 데이터를 그때 그때 제공 → 응답 서버를 쉽게 바꿀 수 있다 → 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다 → 무한한 서버 증설 가능한 확장성을 가질 수 있다.

  • 중간에 서버가 장애가 나더라도 다른 서버로 대응이 즉각적으로 가능하다.

  • 스케일아웃에 유리하다


Stateless 실무 한계

  • 모든 것을 무상태로 설계할 수 없는 경우가 있다.
  • 로그인과 같은 상태유지가 필요한 경우(한계점)
    • 일반적으로 브라우저 쿠키와 서버 세션등을 사용하여 상태를 유지
  • 상태 유지는 최소한만 사용
  • 필요한 정보를 그때그때 전송해야 하기 때문에 전송하는 데이터량이 많다.

비연결성(connectionless)

  • 한 번의 요청과 응답 후 클라이언트와 서버의 연결이 끊어지기 때문에 최소한의 자원으로 서버를 유지
  • 서버 자원을 매우 효율적으로 사용할 수 있음
  • 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작기 때문에 연결을 지속하지 않는 것이 서버 입장에서 자원의 가용성을 높일 수 있다.

비연결성 한계

  • 매번 TCP/IP 연결을 새로 맺어야 함 - 3 way handshake 시간 추가
  • 웹 브라우저로 사이트를 요청하면 HTML 문서 뿐만 아니라 css, 자바스크립트, 이미지와 같은 자원들도 함께 다운로드하는데, 하나하나 연결이 끊어지고 새로 연결되고 반복 → HTTP 지속 연결로 문제 해결

  • 지속 연결 전
  • 지속 연결 후


HTTP 메시지


시작 라인

  • 시작라인은 크게 request-line과 status-line으로 구분

  • 요청 메세지

    request-line: method SP(공백) request-target SP HTTP-version CRLF(엔터)

    • method: HTTP 메서드(GET, POST etc..)
    • 요청 대상(path) : 절대경로 (/search?q=hello&hi=ko)
    • HTTP version: HTTP/1.1 ~
  • 응답 메세지

    status-line: HTTP-version SP status-code SP reason-phrase CRLF

    • HTTP version

    • HTTP 상태 코드 (200, 400, 500 etc..)

    • 이유 문구: 사람이 이해할 수 있는 짧은 상태 코드 설명


HTTP 헤더

  • header-field = field-name ‘:’ OWS field-value OWS (OWS : 띄어쓰기 허용)
  • field-name는 대소문자 구분이 없다.

  • HTTP 전송에 필요한 모든 부가 정보가 다 들어있다.
    • 메세지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트 정보, 서버 애플리케이션 정보 등등
    • 메세지 바디 빼고 필요한 메타 정보가 다 들어있다
  • 필요하면 임의의 헤더를 추가할 수 있다 (클라이언트와 상호 인지 기반)

HTTP 메시지 바디

  • 실제 전송할 데이터
  • HTML 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터는 전송이 가능


HTTP 메서드

  • API를 만들때 가장 중요한 것은 리소스의 식별이다.
    • 리소스의 의미는? 회원을 등록, 조회, 삭제하는 것이 리소스가 아니라 회원이라는 개념이 리소스이다.
    • URI 계층 구조를 활용
      • 회원 목록 조회 /members
      • 회원 조회 /members/{id}
      • 회원 등록 /members/{id}
      • 회원 수정 /members/{id}
      • 회원 삭제 /members/{id}
    • 리소스와 리소스를 대상으로 하는 행위를 분리해야 한다.
      • 리소스: 회원
      • 행위: 조회, 등록, 삭제, 변경


HTTP 메서드 종류

GET (조회)

  • 서버에 전달하고 싶은 데이터는 query를 통해서 전달
  • 메시지 바디를 사용해서 데이터를 전달할 수는 있지만 지원하지 않는 곳이 더 많아서 권장하지 않음.

POST(요청 데이터 처리, 주로 등록에 사용)

  • 메시지 바디를 통해 서버로 요청 데이터 전달
  • 서버는 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세스에 사용
  • 예시
    • 폼과 같은 데이터 처리 프로세스에 제공 (회원가입, 주문 등)
    • 게시판 글쓰기, 댓글 달기
    • 새 리소스 생성(신규 주문)
    • 기존 자원에 데이터 추가(한 문서 끝에 내용 추가)
  • 정해진 것이 없으므로 요청 데이터를 어떻게 처리할지 리소스마다 다르며, 설계자가 정해야한다.
  • 다른 메서드로 처리하기 애매한 경우에도 사용
    • JSON으로 조회 데이터를 넘겨야 하는데 GET 메서드를 사용하기 어려운 경우

PUT(리소스를 대체, 해당 리소스가 없다면 생성)

  • 리소스가 있으면 대체, 없으면 생성 (리소스를 덮어버림)
  • 클라이언트가 리소스 위치를 알고 URI 지정
    • 클라이언트가 구체적인 URI 경로를 알고 있으며, 해당 URI를 지정하여 요청보낸다. (POST와의 차이점)

💡 주의할 점

  • PUT은 기존의 리소스를 수정하는 개념이 아닌, 기존 리소스를 새로 보내는 리소스로 덮어버리는 개념에 가깝다.
  • age만 부분변경 하고 싶다면, PATCH 메서드를 사용

PATCH(리소스 부분 변경)

  • 리소스를 부분 변경하고 싶을 때

업로드중..

  • PATCH가 지원이 안된다면 POST를 사용하자

DELETE

  • 리소스 삭제

기타 메서드

  • HEAD: GET 과 동일하지만 메세지 부분을 제외하고 상태 줄과 헤더만 반환
  • OPTIONS: 대상 리소스에 대한 통신 기능 옵션을 설명 (CORS설정할 때 주로 사용)
  • CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행


HTTP 메서드의 속성


Safe(안전)

  • 호출해도 리소스를 변경하지 않는다.
  • GET은 안전하다.
  • POST, PUT, DELETE 와 같이 호출 했을 때 변경이 일어나는 것은 안전하지 않다.

Idempotent(멱등)

  • f(f(x)) = f(x)
  • 한 번 호출하든 여러번 호출하든 결과가 항상 같다.
  • 멱등 메서드
    • GET: 여러번 조회해도 항상 같은 결과가 조회된다.
    • PUT: 결과를 대체하기 때문에 같은 요청을 여러번 해도 최종 결과는 동일하다.
    • DELETE: 결과를 삭제하기 때문에 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
    • POST: 멱등이 아니다. 두 번 호출하면 중복 계산(?) → 결제를 두 번 호출하여 중복 결제하는 상황과 같다!
  • 멱등 메서드의 활용 - 자동 복구 메커니즘
    • 똑같은 요청을 두 번 해도 괜찮기 때문에 자동 복구 메커니즘에 적절
  • 멱등 메서드로 재요청하는 중간에 외부(다른 사용자)에서 리소스를 변경한다면?
    • 멱등은 외부 요인으로 중간에 리소스를 변경되는 것 까지는 고려하지 않는다.


캐싱 가능성

  • GET, HEAD, POST, PATCH 요청은 캐싱이 가능하다.
  • 캐시 키를 사용하여 캐싱
  • POST, PATCH는 바디 내용까지 캐시 키로 고려해야 하기 때문에 구현이 쉽지 않다.
  • 실무에서는 GET만 캐싱을 사용한다고 봐도 무방.

0개의 댓글