03.HTTP의 기본
HTTP
- HTML, TEXT
- IMG, 음성, File, 영상
- JSON, XML(API)
- 거의 모든 형태의 데이터를 전송한다
- 서버간에 데이터를 주고 받을 때소 HTTP를 사용한다.
- 기반 프로토콜
- HTTP/1.1은 기능 개발이며, 2와 3은 성능 개선에 초점이 있다.
- TCP : HTTP/1.1 , HTTP/2 버전 기반
- UDP : HTTP/3 버전 기반
- 현재는 HTTP/1.1를 주로 사용, HTTP/2, HTTP/3도 점점 늘고 있다.
- 인터넷 접속하여 검사창을 열고 network 탭으로 이동.
- Name, Status… 같은 header에 우클릭하여 protocol을 보게 되면 현재 1.1과 2, 3을 많이 같이 쓰고 있다.
- HTTP 특징
- 클라이언트 서버 구조
- 무상태 프로토콜(스테이스리스), 비연결성
- HTTP 메시지
- 단순함, 확장 가능
클라이언트 서버 구조
- Request Response 구조
- 클라이언트는 요청하고 응답을 기다림
- 서버가 요청에 대한 결과를 응답함
무상태 프로토콜
- 서버가 클라이언트의 상태를 보존하지 않는다
- 장점 : 서버 확장성 높음
- 단점 : 클라이언트가 추가 데이터를 전송한다
- stateful(상태유지)
- 서버가 클라이언트의 상태를 보존한다
- 클라이언트의 요청을 서버가 계속하여 물고 있다.
- 그래서 다음 요청에 대하여도 이전 요청을 참고하여 결과를 줄 수 있다
- 예시
- 고객이 마트에서 A물건 가격 요청
- 점원이 A물건의 가격 응답
- 2개 구매 요청
- 가격*2에 대한 결과 응답 및 결재 방식 질문
- 현금으로 하겠다는 요청
- 현금으로 결재 완료 응답
- but
- 고객이 A물건 가격 요청
- 점원A는 가격 응답
- 고객이 2개 구매 요청
- 점원B는 무슨 물건인지 모름
- 고객이 신용카드로 결재 하겠다고 함
- 점원C는 무슨 물건을 몇개 산다는 건지 모름
- 즉, 상태유지는 클라이언트의 요청을 계속하여 물고 있기 때문에 다음 요청에 대하여 어떤 상태인지를 알 수가 있다.
- stateless
- 클라이언트의 상태를 보존하지 않는다
- 요청에서 필요한 데이터를 계속하여 넘겨준다.
- 예시
- 클 : 물건 A 얼마에요?
- 점원 : 가격 응답
- 클 : 물건A 2개 구매할게요
- 점원 : 총 가격 응답
- 클 : 물건A 2개 신용카드 구매할게요
- 점 : 결재 완료 응답
- 이 대화에서는 점원이 바뀌어도 필요 요청을 다 제공하기 때문에 새로운 점원이어도 요청에 대하여 응답할 수 있다.
- stateful 과 stateless의 차이
- 상태유지의 상태 : 점원이 바뀌면 바로 요청에 대하여 응답을 할 수 없기 때문에 에러가 발생하게 된다.
- 무상태 : 중간에 점원이 바뀌어도 상관없다
- 갑자기 클라이언트의 증가해도 점원을 대거 투입할 수 있다
- 서버의 입장에서는 클라이언트가 증가하여도, 상태를 관리하지 않기 때문에 서버 증설 후 어느 서버에든지 연결하여 처리하면 된다.
- 상태 유지에서는 통신하던 서버가 죽으면 클라이언트는 처음부터 요청을 다시 진행하여야 한다
- 무상태에서는 통신하던 서버가 죽어도 다른 서버에서 응답하면 된다
- 실무에서는 로그인 같은 경우 상태를 유지하여야 서비스가 이용가능하므로 브라우저 쿠키와 서버 세션 등을 사용하여 최소한의 유지 기능을 사용하도록 한다.
- 무상태의 단점으로는 요청시 데이터를 많이 보내야 한다.
비연결성
- 연결성 : 서버가 연결을 유지하면, 클라이언트에서 요청이 없어도 계속하여 서버의 자원을 쓰게된다.
비연결성 : 클라이언트와 요청을 주고 받을 때만 서버를 연결한다. 서버가 최소한의 자원을 사용한다
- HTTP는 기본이 비연결성을 띈다
- 한계와 극복
- TCP/IP의 연결을 새로 맺어야 하기 때문에 3 wqy handshake를 하는 시간이 추가된다.
- HTML 뿐만 아니라 JS, CSS, 이미지 등등 많은 자료들이 많은 자원이 함께 다운로드 된다.
- 예전에는
- 연결 > HTML 요청 > 응답 > 종료
- 연결 > JS 요청 > 응답 > 종료
- 연결 > CSS 요청 > 응답 > 종료
- 따라서 지금은 HTTP는 지속 연결로 문제를 해결했다.
- 연결 > HTML 요청 > JS 요청 > CSS 요청 > 종료
HTTP 메시지
- HTTP 메시지 구조
- start-line 시작 라인
- header 헤더
- empty line 공백라인(CRLF)
- message body
- 시작 라인
- 1) 요청 메시지
- request-line / status-line
- request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
- HTTP 메서드
- 종류 : GET, POST, PUT, DELETE 등
- 요청 대상
- 보통 절대경로로 시작, 쿼리가 합쳐져 들어가기도 한다
- 2) 응답 메시지
- request-line / status-line
- status-line = HTTP-version SP status-code SP reason-phrase CRLF
- HTTP 상태코드
- 요청 성공, 실패를 나타낸다
- 200 : 성공
- 400 : 클라이언트 요청 오류
- 500 : 서버 내부 오류
- 이유 문구
- 사람이 이해할 수 있는 짧은 상태 코드 설명글.
- 200 OK
- HTTP 헤더
- field-name: OWS field-value OWS (OWS는 띄어쓰기 허용이란 뜻)
- 단, field-name과 “:” 사이는 띄어쓰기 허용 X
- field-name은 대소문자 구분 X, value는 대소문자 구분 O
- 용도
- HTTP 전송에 필요한 모든 부가정보
- 표준 헤더가 너무 많다
- 필요시 임의의 헤더 추가 가능
- HTTP 메시지 바디
- 실제 전송할 데이터
- HTML 문서, 이미지, JSON 등등
출처
- 인프런의 김영한님의 강의를 듣고 정리한 것입니다.