클라이언트가 서버로 요청을 보내면 서버에서 응답을보내는 구조로 이루어져있다
서버가 클라이언트의 상태를 보존하지 않는다
클라이언트가 요청할 때 필요한 데이터를 다 담아서 보내기 때문에
같은 기능을 하는 아무서버나 호출해도 상관 없다
서버 1에 장애가 생기더라도 다른 서버에서 응답을 전달하면 되기 때문에 클라이언트는
요청을 다시할 필요가 없다 즉, 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 증설이 가능하다
로그인이 필요 없는 단순한 서비스라면 무상태로 설계 가능
로그인이 필요한 서비스라면 유저의 상태를 유지해야 하기 때문에 브라우저 쿠키, 서버 세션, 토큰 등을
이용해 상태를 유지
TCP / IP의 경우 기본적으로 연결을 유지, 연결을 유지하는 모델에서는 클라이언트가 요청을 보내지 않더라도 계속 연결을 유지해야함 때문에 연결을 유지하는 서버의 자원이 계속 소모된다
실제로 요청을 주고받을 때만 연결을 유지 응답을 주고 나면 TCP / IP 연결을 끊는다
이를 통해 최소한의 자원으로 서버 유지를 가능하게 함
웹 브라우저로 사이트를 요청하면 HTML, CSS, 이미지, JS 등 수많은 자원이 함께 다운로드 되는데
해당 자원들을 각각 보낼 때마다 연결을 끊고 다시 연결하고를 반복하는 것은 비효율적이다
HTTP 초기에는 각각의 HTML, CSS, JS 자원을 다운로드하기 위해 자원마다 연결과 종료를 반복
지금은 비연결성의 한계를 HTTP 지속 연결로 문제 해결
연결이 이뤄지고 난 뒤 각각의 자원인 HTML, CSS, JS 요청하고 모든 자원에 대한 응답이 돌아오면
연결을 종료
HTTP 메세지는 헤더와 바디로 구분
바디에서는 데이터 본문을 통해 표현 데이터를 전달하는데 여기서 데이터를 실어 나르는 부분을 페이로드라고 함
헤더 형식 -<field-name> : <field-value>
HTTP 전송에 필요한 모든 부가정보를 담기 위해 사용한다
ex) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 캐시 관리 정보 등등
표현 데이터의 형식, 압축 방식, 자연 언어, 길이 등을 설명하는 헤더
요청과 응답 둘다 사용되는 헤더
클라이언트가 선호하는 표현 요청
Ex) Accept-Language 적용 전후
전 - 요청 : Get /event ↔️ 응답 : Content-Language: en, Hello
후 - 요청 : Get /event, Accept-Language:ko ↔️ 응답 : Content-Language: ko 안녕하세요
물론 한국어를 지원하지 않을 경우도 있기때문에 원하는 콘텐츠에 대한 우선순위를 지정할 수도 있다
ex) Get / event, Accept-Language:ko-KR,ko;q=0.9,en-Us;q=0.8,en;q=0.7
우선순위는 0 ~ 1
클수록 높은 우선순위를 가진다