HTTP(Hypertext Transfer Protocol)은 HTML 문서와 같은 리소스들을 가져올 수 있도록 해준다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 하다. 즉, 브라우저와 서버 간에 데이터를 주고받기 위한 방식이다. 클라이언트에서 서버에 요청한 다음 서버에서 응답 메시지를 보내는 작업 흐름이다.
하이퍼링크를 사용하여 인터넷에서 페이지를 로드하는 데 사용된다. 이미지, 음성, 영상, 파일, JSON, XML 등 거의 모든 형태의 데이터 전송이 가능하다. HTTP 프로토콜은 일반적으로 TCP/IP 통신 위에서 동작하며 기본 포트는 80번이다.
클라이언트 - 서버 구조무상태 프로토콜(Stateless)HTTP 메시지 (HTTP 메시지에 모든 것을 전송)
클라이언트와 서버 분리해서 독립적으로 진화
- 클라이언트는 UIUX에 집중
- 서버는 복잡한 비즈니스 로직과 데이터를 다룸
HTTP 프로토콜은 상태가 없는(stateless) 프로토콜이다. 여기서 상태가 없다라는 말은 데이터를 주고 받기 위한 각각의 데이터 요청이 서로 독립적으로 관리가 된다는 의미다.
쉽게 말해서 서버가 클라이언트의 상태를 보존하지 않는다. 이전 데이터 요청과 다음 데이터 요청이 서로 관련이 없다! 서버는 단순히 요청이 오면 응답을 보내는 역할만 수행하며, 상태 관리는 전적으로 클라이언트에게 책임이 있는 것이다.
상태를 보존하지 않으면 어떻게 정보를 전달할까?🤔
바뀐 정보를 새롭게 요청할 때마다 모든 정보를 다 담아서 새롭게 요청하면 된다. 이러한 특징은 안 좋게 느껴질 수 있지만 클라이언트의 수가 갑자기 폭발적으로 증가할 때 장점을 가진다. 클라이언트가 갑자기 늘어나도 서버를 대거 투입하면 되기 때문이다. 어차피 서버에 들어오는 요청에 모든 정보가 담겨서 올테니 어떤 서버가 상대해도 상관이 없고, 따라서 무한한 서버 증설이 가능해진다! 😎
하지만 모든 것을 무상태로 설계하기에는 한계가 있다. 예를 들어 사용자가 로그인 했다는 상태를 서버에서 유지해야 할 때는 Stateless로 설계할 수 없다. 이때는 브라우저 쿠키와 서버 세션 등을 사용해서 상태를 유지하며 상태 유지를 유지한다.
로그인과 같이 상태가 필요한 경우 🤓💡
사용자가 로그인을 했는지에 대한 정보를 저장해놓고 서버에게 요청을 해야 할 때 HTTP 쿠키를 사용하면 상태를 저장하는 Session을 사용할 수 있다. 세션 관리를 통해 서버에 저장해야 할 로그인, 장바구니, 게임 스코어 등의 정보를 관리할 수 있다.
🍪 응답 헤더 - Set-Cookie
서버는 응답 헤더에
Set-Cookie를 명시하면클라이언트에게 쿠키를 저장하라고 전달하는 것이다.이를 받은 브라우저는 자동으로 쿠키에 데이터를 저장한다.
Set-Cookie: <cookie-name>=<cookie-value>
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
🍪 요청 헤더 - Cookie
이후, 브라우저에서 서버로 요청을 보낼 때 요청 헤더에
Cookie를 사용하여이전에 저장했던 모든 쿠키들을 요청에 담아서 전송할 수 있다. 만료일 혹은 지속시간(duration)도 명시될 수 있고, 만료된 쿠키는 더이상 보내지지 않는다.
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
클라이언트의 상태를 보존하지 않는다.서버 확장성이 높다.매번 요청할때마다 자신의 부가정보를 줘야한다.최대한 무상태로 설계한다.클라이언트의 이전 상태를 보존한다.항상 같은 서버가 유지되어야 한다.최소한으로만 사용해야 한다.HTTP는 연결을 유지하지 않는 모델이다. 클라이언트와 서버는 서로 요청하고 응답할 때만 연결을 유지한다. 응답을 받으면 바로 연결이 끊어진다. 이를 통해 서버는 최소한의 자원으로 돌아갈 수 있다. 하지만 자원을 받을 때마다 연결하고, 받고, 다시 끊고, 또 연결하고를 반복해야 하기 때문에 비효율적이다. 이러한 문제를 HTTP 지속 연결(Persistent Connections)로 해결했다.
HTTP 지속 연결(Persistent Connections) 방식은 HTML을 요청하고 응답받으면 바로 연결을 끊지 않고, 자바스크립트나 이미지를 요청하고 응답을 받은 다음에 연결을 종료한다.
HTTP 메시지에 대한 내용은 다음 포스팅에서! Go- Go 🚀🚀🚀🚀
참고
HTTP 개요 (MDN)
모든 개발자를 위한 HTTP 웹 기본 지식(인프런 김영한님 강의)
프런트엔드 개발자가 알아야하는 HTTP 프로토콜 (캠틴 판교님 블로그)
HTTP 쿠키 (MDN)