-
<모든 개발자를 위한 HTTP 웹 기본 지식 정리>
HTTP (Hyper Text Transfer Protocol)
: HTTP 메시지에 모든 것을 전송!
-HTML, TEXT
-IMAGE, 음성, 영상, 파일
-JSON, XML (API)
-거의 모든 형태의 데이터 전송 가능
-서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용
HTTP/1.1 1997년 : 가장 많이 사용, 가장 중요한 버전!
기반 프로토콜
-TCP기반 (데이터 많, 속도 느림) : HTTP/1.1, HTTP/2
-UDP기반 : HTTP/3
-현재 HTTP/1.1 주로 사용
-HTTP/2, HTTP/3도 점점 증가
=> 확인은 개발자도구/네트워크/protocol
HTTP 특징
-클라이언트 서버 구조
-무상태 프로토콜(스테이스리스), 비연결성
-HTTP 메시지
-단순함, 확장 가능
1. 클라이언트 서버 구조
Request - Response 구조
(1) 클라이언트는 http 메시지를 통해 서버에 요청을 보내고, 응답을 대기
(2) 서버가 요청에 대한 결과를 만들어서 응답
(3) 클라이언트가 응답 결과를 열어서 동작
예전에는 클라이언트와 서버가 분리되어있지 않았음 -> 개념적으로 분리하고, 비지니스 로직과 데이터를 서버에, 클라이언트에다가는 UI, 상용성에 집중 -> 각각 독립적으로 진화가능!
2.무상태 프로토콜(Stateless)
-서버가 클라이언트의 상태를 보존X
↔️ Stateful (상태유지) [클라이언트A가 서버1과 상태 유지를 한다면 클라이언트A는 서버2 와는 불가능 -> 서버1이 다운되는 경우 망함]
-> 서버가 클라이언트의 상태를 보존하지 않는다는건 클라이언트가 요청할때마다 상태를 같이 보내야한다는것!
-> 서버1이 다운되더라도 서버2에게 상태가 전부 도달하기 때문에 서버2는 응답 가능
-> <스케일아웃 - 수평 확장 유리>
-> 클라이언트 요청이 증가해도 (이벤트 같은거) 서버를 대거 투입할 수 있어
=> 무상태는 응답 서버를 쉽게 바꿀 수 있다!!!!! -> 무한한 서버 증설 가능
-장점 : 서버 확장성 높음(스케일 아웃)
-단점 : 클라이언트가 추가 데이터 전송
-실무 한계 :
⏺ 모든 것을 무상태로 설계할 수 있는 경우도 있고 없는 경우도 있다.
⏺ 상태 유지해야하는 경우 (ex: 로그인)
⏺ 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지
⏺ 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지
⏺ 상태 유지는 최소한으로만 사용해야함
3.비연결성(connectionless)
-tcp 는 보통 연결을 유지 -> 요청 보내고 응답 받기 -> 클라2가 또 요청 , 응답 -> 서버는 클1, 클2와 연결을 계속 유지 -> 서버 자원 소모됨
-비연결헝은 클1이 서버에 요청하고 응답 받으면 연결 끊어버리기 -> 서버는 연결 유지x , 최소한의 자원 유지
-HTTP는 기본이 연결을 유지하지 않는 모델
-일반적으로 초 단위 이하의 빠른 속도로 응답
-1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음 (연결 끊기니까!)
(예) 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.
-서버 자원을 매우 효율적을 사용할 수 있음
-한계
⏺ TCP/IP 연결을 새로 맺어야 함 - 3 way handshake 시간 추가
⏺ 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등등 수 많은 자원이 함께 다운로드
-극복
⏺ 지금은 HTTP 지속 연결(Persistent Connections)로 문제 해결
⏺ HTTP/2, HTTP/3에서 더 많은 최적화
-HTTP 초기 - 연결, 종료 낭비
(ex) 클 -> {[연결, 요청/HTML 응답, 종료] -> [연결, 요청/자바스크립트 응답, 종료] -> [연결, 요청/이미지 응답, 종료]} <- 서버
-HTTP 지속 연결(Persistent Connections)
(ex) 클 -> {[연결, 요청/HTML 응답, 요청/자바스크립트 응답, 요청/이미지 응답, 종료]} <- 서버 => 시간 단축!!
스테이트리스!!
같은 시간에 딱 맞춰 발생하는 대용량 트래픽 (서버 개발자들이 어려워하는 업무 ex: 선착순 이벤트, ktx 예약, 수강신청)
HTTP 메시지
시작 라인 - 요청 메시지
- start-line = request-line / status-line
- request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
1. HTTP 메서드 (GET:조회)
⏺ 종류 : GET, POST, PUT, DELETE...
⏺ 서버가 수행해야 할 동작 지정
-GET : 리소스 조회
-POST : 요청 내역 처리
2. 요청 대상 (/search?q=hello&hl=ko)
3. HTTP Version
시작 라인 - 요청 메시지 - HTTP 메서드
1. 종류 : GET, POST, PUT, DELETE
2. 서버가 수행해야 할 동작 지정
⏺ GET: 리소스 조회
⏺ POST: 요청 내역 처리
시작 라인 - 요청 대상
1. absolute-path[?query] (절대경로[?쿼리])
2. 절대경로= "/"로 시작하는 경로
시작 라인 - 응답 메시지
- start-line = request-line / status-line
- status-line = HTTP-version SP status-code SP reason-phrase CRLF
1. HTTP 버전
2. HTTP 상태 코드 : 요청 성공, 실패를 나타냄
⏺ 200 : 성공
⏺ 400 : 클라이언트 요청 오류
⏺ 500 : 서버 내부 오류
3. reason-phrase (이유 문구) : 사람이 이해할 수 있는 짧은 상태 코드 설명 글
HTTP 헤더
-header-field = field-name":"OWS field-value OWS (OWS: 띄어쓰기 허용)
-field-name 은 대소문자 구분 없음
-용도
⏺ HTTP 전송에 필요한 모든 부가정보
⏺ 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등
⏺ 표준 헤더가 너무 많음
⏺ 필요시 임의의 헤더 추가 가능 (-> 약속한 클라이언트만 이해가능하겠쥐?)
HTTP 메시지 바디
-용도
⏺ 실제 전송할 데이터
⏺ HTML 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든 데이터 전송 가능
=> 단순함 ! 확장 가능 !
- HTTP는 단순하다.
- HTTP 메시지도 매우 단순
- 크게 성공하는 표준 기술은 단순하지만 확장 가능한 기술
HTTP 정리
⏺ HTTP 메시지에 모든 것을 전송
⏺ HTTP 역사 HTTP/1.1을 기준으로 학습
⏺ 클라이언트 서버 구조
⏺ 무상태 프로토콜(스테이스리스)
⏺ HTTP 메시지
⏺ 단순함, 확장 가능
⏺ 지금은 HTTP 시대~~