통신 프로토콜(Protocol) : 컴퓨터나 원거리 통신 장비 사이에 메시지를 주고 받는 약식과 규칙의 체계, 통신 규약 및 약속
프로토콜은 비유 하자면 언어와 같다고 볼 수 있다.
한국인들은 한국어 라는 언어의 규칙에 따라 대화를 하고 미국인들은 영어 라는 언어의 규칙에 따라 대화를 하므로 한국인은 한국인 끼리 의사 소통이 가능하고 미국인은 미국인끼리 혹은 영어라는 언어를 사용하는 사람들과 의사 소통이 가능하다.
즉, 프로토콜은 컴퓨터와 같은 통신 장비끼리 주고 받는 언어 와 같다고 생각하면 된다.
만약 A라는 컴퓨터는 A프로토콜을 사용하고 B라는 컴퓨터는 B프로토콜을 사용한다면 A컴퓨터와 B컴퓨터는 통신을 할 수 없다. 하지만 B컴퓨터도 A프로토콜을 사용한다면 A컴퓨터와 B컴퓨터는 서로 통신 할 수있다.
웹 프로토콜은 클라이언트와 서버가 웹으로 통신하는 규약이다. 그 중 가장 많이 사용 되는 HTTP프로토콜을 알아보자
HTTP(Hyper Text Transfer Protocol)은 웹상에서 데이터를 주고 받을때 거의 모든 통신을 HTTP 프로토콜로 통신한다.
HTTP프로토콜은 클라이언트와 서버 구조로 되어 있다.
이러한 클라이언트 - 서버 구조는 많은 이점을 가진다.
클라이언트와 서버로 분리 되어 있기때문에 각자 독립적으로 성장이 가능하다.
클라이언트는 사용자에서 보여주는 UI, UX 에 집중 할 수있다.
서버는 UI에 신경 쓰지 않고 핵심적인 비지니스 로직 등을 가지고 있을 수 있다.
HTTP는 상태를 가지고 있지 않는 프로토콜이다.
한번 요청을 보내고 응답을 받으면 서버와 연결을 끊는다. 하나의 클라이언트가 서버와 여러번의 요청과 응답을 받더라도 서버는 이전의 요청에 대한 정보를 가지고 있지 않다. (서버가 클라이언트의 정보를 가지고 있는 것이 Stateful)
비연결성 프로토콜은 서버 입장에서는 서버의 자원(메모리 등)을 효율 적으로 사용할 수 있지만 클라이언트 입장에선 단점도 존재한다.
요청과 응답을 주고 받은뒤 연결을 끊기 때문에 다음에 또 서버와 통신을 하려면 TCP/IP (3 way handshake) 연결을 매번 새로 맺여야 하므로 연결 시간이 늘어난다.
또한 만약 웹 브라우저로 사이트를 요청하면 HTML문서 뿐만 아니라 CSS, JS파일, 이미지 파일 등 수많은 자원이 함께 다운로드 되는데 이러한 자원도 매번 새로 받아와야 한다. 하지만 이 단점은 HTTP 지속연결 이라는 기술을 이용해 완화 가능하다.
일반적으로 HTTP 메시지 구조는 다음과 같은 구조를 가지고 있다.
start-line //시작라인
header //헤더
empty-line //공백라인 (무조건 공백라인 하나 있음)
message-body //바디
시작 라인의 경우 요청 메시지와 응답 메시지가 조금 다르다.
요청 메시지(Request)
요청 메시지의 start-line은 request-line 이다.
request-line = method SP request-target SP HTTP-version CRLF
SP = 공백, CRLF = 엔터
예를 들어 GET /serach?q=hello HTTP/1.1
이라는 HTTP 요청 메시지의 시작라인을 해석 하자면 이렇다.
HTTP버전이 1.1 이고 HTTP메소드가 GET
이고 요청 대상이 /search?q=hello
다.
응답 메시지(Response)
응답 메시지의 start-line은 status-line이다.
status-line = HTTP-version SP status-code SP reason-phrase CRLF
SP = 공백, CRLF = 엔터
HTTP-version : HTTP 버전
status-code : HTTP상태 코드로 요청 성공, 실패를 나타낸다.
200 : 성공
400 : 클라이언트 요청 오류
* 500 : 서버 내부 오류
reason-phrase : 이유 문구로 사람이 이해할 수 있는 상태코드에 대한 설명
header = field-name":" OWS field-value OWS
OWS = 띄어쓰기 허용
헤더는 HTTP전송에 필요한 모든 부가정보가 들어가 있다.
예를 들어 메시지 바디의 종류, 바디의 크리, 압축 정보, 인증, 요청 클라이언트의 정보, 캐시 정보 등등..
헤더를 통해 HTTP메서드의 정보를 대략적으로 알 수 있다.
HTTP 바디에는 실제로 전송할 데이터가 들어가 있다.
HTML, 이미지, 영상, JSON, XML 등 모든 데이터를 바디에 담아서 전송할 수 있다.