[HTTP] HTTP

2024. 6. 14. 21:15·개발 ━━━━━/CS
반응형

HTTP (HyperText Transfer Protocol)

특징

  • 클라이언트 서버 구조
  • Request Response 구조
  • 클라이언트는 서버에 요청을 보내고, 응답을 대기 / 서버가 요청에 대한 결과를 만들어서 응답

Stateful (상태 유지)

특징

  • 항상 같은 서버가 유지되어야 한다.
  • 로그인 기능 사용시 사용 (쿠키, 세션 등)
  • 최소한으로 사용해야 한다.

 

Stateless (무상태)

특징

  • 응답 서버를 쉽게 바꿀 수 있다.
  • 스케일 아웃에 유리
  • 데이터를 너무 많이 보낸다.
  • 모든 것을 무상태로 설계할 수 없다.

HTTP 의 비연결성

특징

  • HTTP 는 기본적으로 연결을 유지하지 않는 모델
  • 일반적으로 초 단위 이하의 빠른 속도로 응답
  • 서버 자원을 효율적으로 사용할 수 있다.
  • 1시간 동안 수천 명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 적다.

 

한계

  • TCP/IP 연결을 새로 맺어줘야 한다. (3 way Handshake 시간 추가)
  • 많은 자원 (HTML, CSS, JS) 을 함
  • 현재는 HTTP 지속 연결 (Persistent Connections) 로 문제 해결

HTTP 메시지 구조

start-line 시작라인
header 헤더
empty line 공백라인 (CRLF)
message body

 

start-line

start-line = request-line / status-line

 

request-line = method (space) request-target(절대 경로) (space) HTTP-version CRLF (enter)

status-line = HTTP-version (space) status-code (space) reason-phrase CRLF

 

header-field

header-field = field-name ":" OWS field-value OWS (OWS : 띄어쓰기 허용)

 

용도

  • HTTP 전송에 필요한 모든 부가정보
  • 표준 헤더가 너무 많음
  • 필요시 임의의 헤더 추가 가능

 

message body

용도

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

HTTP 메시지 전송

(애플리케이션)

1. 웹 브라우저가 HTTP 메시지 생성

2. SOCKET 라이브러리를 통해 전달

  • TCP/IP 연결 (IP, PORT)
  • 데이터 전달

(OS)

3. TCP/IP 패킷 생성, HTTP 메시지 (ex. GET /search?1=hello&hl=ko HTTP/1.1 Host: www.google.com) 포함

 

(네트워크 인터페이스)

4. 인터넷으로 흘러감

 

(웹 서버)

5. HTTP 응답 메시지 리턴 (ex. HTTP/1.1 200 ok~)

 


HTTP 메서드

  • GET - 리소스 조회
  • POST - 요청 데이터 처리, 주로 등록에 사용
  • PUT - 리소르를 대체, 해당 리소스가 없으면 생성
  • PATCH - 리소스 부분 변경
  • DELETE - 리소스 삭제

GET

ex)

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

 

  • 리소스 조회
  • 서버에 전달하고 싶은 데이터는 query (쿼리 파라미터, 쿼리 스트링) 을 통해서 전달
  • 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음

 

POST

대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청

ex)

POST /members HTTP/1.1
Content-Type: application/json

{
	"username": "hello",
    "age": 20
}

 

  • 새 리소스 생성
  • 메시지 바디를 통해 서버로 요청 데이터 전달
  • 요청 데이터 처리 - 컨트롤 URI (ex. POST /orders/{orderId}/start-delivery)
  • 기존 자원에 데이터 추가
  •  
리소스 URI 에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 = 정해진 것이 없음

 

 

PUT

  • 리소스를 완전히 대체 (리소스가 있으면 대체, 없으면 생성 -> 덮어쓰기)
  • 클라이언트가 리소스 위치를 알고 URI 지정 - POST 와의 큰 차이점

 

PATCH

  • 리소스를 부분적으로 대체

 

DELETE

  • 리소스 제거

 

HTTP 메서드의 속성

안전

  • 호출해도 리소스를 변경하지 않는다.

 

멱등 (Idempotent)

  • 한 번 호출하든 두 번 호출하든 결과가 똑같다.
  • POST 는 멱등이 아니다!
  • 자동 복구 메커니즘 (서버가 TIMEOUT 등으로 정상적인 응답을 못 주었을 때 판단)
  • 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지 않는다.

 

캐시가능 (Cacheable)

  • 응답 결과 리소르를 캐시해서 사용해도 되는가
  • GET, HEAD 정도만 캐시로 사

 

 

 

 

참고

모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 강사님

반응형

'개발 ━━━━━ > CS' 카테고리의 다른 글

[HTTP] IP / TCP / UDP / PORT / URI  (0) 2024.06.13
'개발 ━━━━━/CS' 카테고리의 다른 글
  • [HTTP] IP / TCP / UDP / PORT / URI
GukJang
GukJang
•  ⌘ ⌥ •
    반응형
  • GukJang
    SPACE
    GukJang
  • 전체
    오늘
    어제
    • Blog (73)
      • 개발 ━━━━━ (68)
        • Java (14)
        • C++ (1)
        • HTML (1)
        • Spring(boot) (7)
        • Dev (9)
        • SQL (1)
        • CS (2)
        • Git (1)
        • Troubleshoot (14)
        • Algorithm (2)
        • Definition (1)
        • Dev Life (2)
        • TIL (7)
        • 항해 (6)
      • 공돌 ━━━━━ (4)
        • 플젝 (2)
        • 장비 (1)
        • 부품 (1)
      • 독서 ━━━━━ (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    자바
    spring
    Java
    github actions
    EC2
    mysql
    docker volume
    마이크로파이썬
    항해99
    알고리즘
    사전 스터디
    electron-builder
    SpringBoot
    micropython
    오픈소스 기여
    docker
    CI CD
    AWS
    Python
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
GukJang
[HTTP] HTTP
상단으로

티스토리툴바