[HTTP] HTTP 기본

지수·2023년 4월 2일
0
post-thumbnail

해당 포스트는 인프런 김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 기반으로 작성되었습니다. 👍

1. HTTP란?

ㄴ Hyper Text Transfer Protocol

  • 초기에는 Hyper Text Markup Language(html)을 전송하는 프로토콜(통신 규약)
  • 현재는 이미지, 음성, 영상, JSON, XML 등의 API 등 거의 모든 형태의 데이터를 전송하는 프로토콜
  • 서버-클라이언트는 물론 서버-서버 간 데이터를 주고 받을 떄에도 대부분 HTTP 사용
  • HTTP/2, HTTP/3 등 성능 개선된 버전도 나왔지만 가장 핵심적인 부분이 담긴 버전은 HTTP/1.1
  • TCP : HTTP/1.1, HTTP/2
  • UDP : HTTP/3
    (▼ 개발자도구 - Network 탭에서 HTTP 버전 확인 가능)



2. 클라이언트 서버 구조

HTTP는 클라이언트-서버요청(Request)-응답(Response) 구조

  • 클라이언트는 서버에 요청을 보내고, 응답이 올 때까지 대기
  • 서버는 요청을 받으면 요청에 대한 결과를 만들어서 응답



3. 무상태성(stateless)

ㄴ 서버가 클라이언트의 상태 보존 X


1) 상태유지 vs 무상태

상태유지의 경우,

  • 서버가 클라이언트의 상태를 보존(=기억)함
  • 때문에 특정 클라이언트의 요청을 하나의 서버에서 쭉 다 처리해야함
  • 중간에 서버가 바뀌거나 / 장애가 생기면 요청처리에 문제가 생길 수 있음
  • 서버가 바뀔 때, 이전 서버가 다음 서버에게 상태 정보를 넘겨줘야 함..(불편 ㅇㅇ)

무상태의 경우,

  • 서버가 클라이언트의 상태를 보존(=기억)하지 않음
  • 클라이언트는 요청을 보낼 때마다 상태 정보를 포함하여 보내고
  • 중간에 서버가 바뀌더라도 클라이언트가 보낸 상태 정보에 따라 요청을 처리할 수 있음
  • 갑자기 클라이언트 요청이 증가해도 서버를 대거 증설하여 대응할 수 있음(스케일아웃=수평확장)
  • = 무상태는 응답 서버를 쉽게 바꿀 수 있음

3) 상태유지가 필요한 경우

로그인이 필요없는 단순 서비스는 무상태로 설계할 수 있지만,
로그인이 필효한 서비스의 경우, 로그인 했다는 상태를 서버에 유지해야함
상태 유지는 최소한만으로 사용하도록 설계해야,
트래픽 증가에 따른 서버 증설 등 대응을 할 수 있음

ㄴ 브라우저 쿠키, 세션을 사용하여 상태유지

[WEB] Servlet 상태 유지




4. 비연결성(connectionless)

  • HTTP는 기본이 연결을 유지하지 않는 모델
  • 클라이언트와 요청-응답이 끝나고나면 TCP/IP 연결을 종료해버림
  • 일반적으로 요청-응답 시간이 초 단위 이하로 빠르기 때문에
    실제 서버에서 동시에 처리하는 요청은 많지 않음
  • 빠르게 응답하고 해당 연결을 종료하는 방식을 통해 서버 자원을 효율적으로 사용 가능
  • 연결을 계속 유지할 경우, 더 이상 요청이 없는 클라이언트와의 연결까지 유지하느라 서버 자원 낭비

1) 비연결성의 한계

이미지 출처 : 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의

  • 이전에 연결했었던 클라이언트가 다시 요청을 보냈을 때에도 TCP/IP 연결을 새로 맺어야 함
    = 3 way handshake를 다시 해주어야 함
    = 시간 추가
  • 웹 브라우저로 사이트 요청시 html 뿐 아니라 css, javaScript, 이미지 등 수많은 자원이 다운로드 되어야 함
    = 그 때 마다 연결을 새로하여 응답하면.....ㅜ 아무래도 추가 시간 발생..ㅜ

2) 극복, HTTP 지속 연결(Persistence Connections)

이미지 출처 : 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의

  • 필요시 HTTP 지속 연결을 통해 연결 지속
  • 요청-응답을 한 연결에서 여러 번 수행
  • 잊지말자! HTTP는 기본이 비연결!



5. HTTP 메세지

0) HTTP 메세지 구조

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

1) HTTP 요청 메세지

  • start-line 시작 라인 = HTTP메서드 + 요청대상(절대경로+쿼리) + HTTP버전
    예) GET /search?1=hello&hl=ko HTTP/1.1

  • header 헤더 = 필드이름 + 필드 값
    예) Host: www.google.com
    예) Content-Type: text/html;charset=UTF-8
    - HTTP 전송에 필요한 모든 부가 정보
    - 메세지 바디의 내용, 메세지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보 등

  • empty line(CRLF) 공백 라인

  • message body = 실제 전송할 데이터(HTML,이미지,문서,JSON 등 byte로 표현할 수 있는 모든 데이터)


2) HTTP 응답 메세지

  • start-line 시작 라인 = HTTP버전 + HTTP상태코드(요청성공/실패) + 이유문구
    예) HTTP/1.1 200 OK

  • header 헤더 = 필드이름 + 필드 값
    예) Host: www.google.com
    예) Content-Type: text/html;charset=UTF-8
    - HTTP 전송에 필요한 모든 부가 정보
    - 메세지 바디의 내용, 메세지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보 등

  • empty line(CRLF) 공백 라인

  • message body = 실제 전송할 데이터(HTML,이미지,문서,JSON 등 byte로 표현할 수 있는 모든 데이터)

profile
사부작 사부작

0개의 댓글