본 문서는 인프런에서 수강할 수 있는 모든 개발자를 위한 HTTP 웹 기본 지식을 수강한 후, 공부한 내용을 정리한 문서입니다. 본 문서의 모든 저작권은 해당 강의의 저자이신 김영한 우아한형제들 기술이사님께 있습니다.
HTTP의 시대
HTTP 메시지에 모든 것을 전송. HTML, Text, 이미지, 음악, 영상, 파일, JSON, XML, 거의 모든 형태의 데이터 전송 가능. Server to Server 데이터 통신에도 사용
클라이언트-서버 구조
Request - Response 구조 클라이언트는 서버에 요청을 보내고 서버의 응답을 대기 서버가 요청에 대한 결과를 만들어서 응답
Stateful과 Stateless
HTTP는 무상태(Stateless) 프로토콜이다. 서버가 클라이언트의 상태를 보존하지 않는다. 덕분에 서버 확장성(서버 확충)이 높다. 단점은 클라이언트가 매번 추가 데이터를 전송해야한다. Stateful에서는 이전 요청에 대한 상태를 기억하고 있다. 그런데 한 명의 사용자에게 하나의 서버를 계속 붙여주는 것이 아니기 때문에 중간에 다른 서버에서 응답을 줘야하는 상황에서는 이전 상황에 대해 아는 것이 없어 제대로 된 데이터 통신이 불가능하다. 무상태에서는 현재 상태에 대한 정보를 클라이언트에서 계속 보내주어 이러한 문제가 해결 가능하다.
그러나 모든 상황에서 무상태를 사용할 수 있는 것은 아니다. (로그인 유지는 모든 서버가 알아야 한다.) 그래도 상태 유지는 최소한으로 사용해야한다.
비연결성(Connectionless)
HTTP는 비연결성 프로토콜이다. HTTP는 서버가 클라이언트의 요청에 대한 응답을 완료하면 즉시 연결을 끊는다. 서버 자원의 낭비를 막을 수 있다. 다만 매번 새로 연결을 해야하기 때문에 3 way handshake(SYN, SYN+ACK, ACK)이 매번 발생. 매번 수많은 리소스들이 다시 다운로드됨. 이 문제는 HTTP 지속 연결로 해결. 최신 버전인 HTTP/2, HTTP/3에선 최적화.
HTTP 메시지
start-line -> header -> (공백(CRLF)) -> message body