클라이언트와 서버 간의 통신은 요청과 응답으로 구성된다.
보통은 클라이언트의 요청이 있어야 서버는 응답을 한다.
클라이언트와 서버의 통신을 이해하기 위해선 프로토콜이라는 개념이 필요한데,
프로토콜은 서버와 클라이언트 간 통신을 위한 규약, 즉 약속이다.
위의 그림에서 손님이 주문을 받는 사람에게 대뜸 찾아가 '외계어'로 주문을 할 수 없듯,
주문을 하기 위해서는 꼭 지켜야 하는 약속이 몇 가지 존재한다.
(차례를 기다리고, 메뉴에 있는 음료를 요청해야 하며, 직원이 이해할 수 있는 언어로 설명해야 하며...)
그리고 웹 앱 아키텍처에서는 클라이언트와 서버가 서로 HTTP라는 프로토콜을 이용해서 서로 통신을 하는데, HTTP 프로토콜을 이용해 주고받는 메시지를 "HTTP 메시지"라고 부른다.
HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식이다. (통신을 하며 데이터를 서로 주고 받는 방식)
메시지 유형은 두 가지가 있다.
요청(request)은 클라이언트가 서버로 전달해서 서버의 액션이 일어나게끔 하는 메시지이고,
응답(response)은 요청에 대한 서버의 답변이다.
HTTP 요청과 응답의 구조는 다음과 같다.
시작 줄(start-line)에는 실행되어야 할 요청, 또은 요청 수행에 대한 성공 또는 실패가 기록되어 있다.
이 줄은 항상 한 줄로 끝난다.
HTTP Headers : 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 들어간다.
Empty Line : 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(blank line)이 삽입된
다.
body : 요청과 관련된 데이터나 응답과 관련된 데이터 또는 문서를 포함한다.
이는 요청과 응답의 유형에 따라 선택적으로 사용한다.
본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시된다.
HTTP 메시지는 크게 헤더와 바디로 나눌 수 있다.
시작 줄과 HTTP 헤더를 묶어서 요청 헤드(head)라고 부르며, HTTP 메시지의 페이로드는 본문(body)이라고 한다. (그리고 사이에는 empty line이 존재한다.)
아래 그림처럼 요청 메시지의 헤더에는 요청 메소드, URI(URL), HTTP 버전이 들어가고
body는 선택적으로 사용될 수 있다.
응답 메시지의 헤더에는 http 버전 정보, 상태코드와 상태코드를 설명하는 영문 설명이 담겨있고,
body에는 요청한 데이터 정보 또는 오류 메시지를 포함할 수 있다.
사용자가 요청을 하면 웹 브라우저는 HTTP 요청 메시지를 생성하고, 서버에 전달하고 이후 서버의 응답 메시지를 통해 화면에 렌더링 하는 과정을 거치게 된다.
규약이라는 측면에서 프로토콜을 이해해 본다면, 위에서 언급 했듯이, 가게에서 외계어로 상품 주문을 할 수는 없다.
손님이 메뉴를 주문하려면 메뉴판을 보고 주문해야 한다.
컴퓨터 세계에서는 "싼걸로 맛있게 타와"라는 요청은 허용되지 않는다.
0과 1로 변환될 수 있는 요청을 원할 뿐...
그렇다면, 클라이언트는 서버에 어떤 자원이 있으며 어떤 방법으로 통신해야 하는지 알 수 있는 방법은??
서버는 클라이언트에게 리소스를 잘 활용할 수 있도록 인터페이스(interface)를 제공해 줘야 한다.
그리고 이것을 API라고 한다.
즉 서버가 리소스 전달을 위한 메뉴판, 즉 API를 구축해놓으면 클라이언트는 이 API를 활용해 서버의 리소스를 요청하는 것이다.
따라서 클라이언트와 서버간 통신을 위해 HTTP API를 잘 구축하는 것은 중요한 과정이라고 볼 수 있다.
HTTP 요청에는 메소드라는 것이 존재한다.
앞서 커피를 주문하는 예시에서 리소스를 그저 달라고(GET) 요청했지만,
사용자 관리 API에서는 사용자를 추가해 달라고(CREATE) 요청하거나, 지워달라고(DELETE) 요청할 수도 있다.
HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타낸다.
GET
GET 메서드는 특정 리소스의 표시를 요청한다. GET을 사용하는 요청은 오직 데이터를 받기만 한다.
POST
POST 메서드는 특정 리소스에 엔티티를 제출할 때 쓰인다.
이는 예상치 못한 상황에서 서버의 상태의 변화나 부작용을 일으킬 수 있다. (멱등성 x)
PUT
PUT 메서드는 목적 리소스 모든 현재 표시를 요청 payload로 바꾼다.
DELETE
DELETE 메서드는 특정 리소스를 삭제한다.
OPTIONS
OPTIONS 메서드는 목적 리소스의 통신을 설정하는 데 쓰인다.
HTTP 텍스트 기반 (모든 통신을 일반 텍스트로 수행하는 것)이며 stateless이다.
Stateless는 말 그대로 상태를 가지지 않는다는 뜻이다.
HTTP로 클라이언트와 서버가 통신을 주고받는 과정에서, HTTP가 클라이언트나 서버의 상태를 확인하지 않는다.
사용자는 쇼핑몰에 로그인하거나 상품을 클릭해서 상세 화면으로 이동하고, 상품을 카트에 담거나 로그아웃을 할 수도 있다.
클라이언트에서 발생한 이런 모든 상태를 HTTP 통신이 추적하지 않는다.
만약 쇼핑몰에서 카트에 담기 버튼이 눌린다면, 카트에 담긴 상품 정보(상태)를 저장해둬야 한다.
그러나 HTTP는 통신 규약일 뿐이므로, 상태를 저장하지 않는다.
따라서, 필요에 따라 다른 방법(쿠키-세션, API 등)을 통해 상태를 확인할 수 있다.