HTTP는 웹에서 데이터를 주고받기 위한 프로토콜이다. HTTP의 두 가지 특성을 알아보자.
1. 비연결성(Connectionless)
비연결성은 HTTP가 기본적으로 요청과 응답이 끝나면 연결을 끊어버리는 특성이다.
즉, 한 번의 요청과 응답이 완료된 후 서버는 해당 클라이언트와 연결을 유지하지 않는다.
현실 세계에 빗대어 예시를 들자면,
1. 나는 피자를 먹고 싶어 피자 가게에 전화를 걸어 피자를 주문한다.
2. 점원이 전화 주문을 받고 주문 내역을 주방에 전달한다.
3. 주문이 끝나면 전화를 끊는다.
4. 추가 주문이 필요하면 다시 피자 가게에 전화를 걸어야 한다.
이처럼 비연결성은 피자 가게에서 점원이 주문을 받고 전화를 끊는 것과 같다.
이로써 점원은 다른 손님의 전화를 받을 준비를 할 수 있게 된다.
만약 한 번 연결을 맺고 그 연결을 계속 유지하려면 서버 자원이 지속적으로 사용되기 때문에 많은 클라이언트가 동시에 접속하면 서버가 과부하가 될 수 있다.
예시를 토대로 HTTP의 비연결성은,
클라이언트가 서버에 요청을 보내면 서버는 응답을 전송하고 연결을 끊는다.
이 때문에 각 요청이 독립적으로 처리되고 연결이 끊어진 후 클라이언트가 다시 연결을 요청하려면 새로운 연결을 설정해야 한다.
이러한 비연결성(Connectionless)에는 한계가 있다.
- TCP/IP 연결을 새로 맺어야 한다.(3-way-handshake 시간 추가)
- 웹 브라우저로 사이트를 요청하면 HTML 뿐 아니라 js, css, image 등 수많은 자원 다운로드
이는 지속연결로 해결할 수 있다.
persistent connection은 HTTP/1.1에서부터 도입된 keep alive라는 기능을 사용하면 일정 시간 동안 연결을 유지하게 해 주어 상황에 맞게 효율성을 극대화하여 사용이 가능하다!
2. 무상태성(Stateless)
무상태성은 HTTP가 각 요청 간 상태를 유지하지 않는다는 특성이다. 클라이언트가 서버에 요청을 보낼 때, 서버는 이전에 클라이언트가 보낸 요청에 대해 전혀 기억하지 못한다. 모든 요청은 독립적으로 처리되며 서버는 그 요청에 대한 정보나 상태를 저장하지 않는다.
마찬가지로 현실 세계에 빗대어 예시를 들어보자
1. 내가 햄버거가 먹고 싶어서 카운터에서 주문을 한다.
2. 점원은 주문을 받고 결제를 진행한 뒤에 주문 내용을 주방에 전달한다.
3. 음식이 준비되면 나는 음식을 전달받고 주문 절차는 끝이 난다.
이 과정이 끝나면 점원은 나의 주문을 기억하지 않게 된다.
내가 갑자기 치즈스틱이 먹고 싶어 져서 다시 주문을 하려면 이 전에 주문한 내용을 처음부터 말해야 한다.
HTTP의 무상태성은 햄버거집의 직원이 손님의 상태를 기억하지 않는 것과 같다.
직원은 손님이 무엇을 주문했는지? 과거에 어떤 음식을 먹었는지? 기억을 못한다. 따라서 손님이 새로 주문할 때마다 매번 처음부터 주문을 받아야 한다.
이렇게 되면 서버는 각 클라이언트의 상태를 유지할 필요가 없기 때문에 각 요청을 개별적으로 처리할 수 있게 된다. 이를 통해 서버는 더 많은 요청을 처리할 수 있게 되고, 확장성을 높일 수 있다.
하지만 실제 웹 애플리케이션에서는 유저의 로그인 상태, 장바구니 등 상태를 유지해야 하는 경우가 많다. HTTP 자체는 상태를 유지하지 않기 때문에 별도의 메커니즘이 필요하다.
바로 쿠키(Cookie)와 세션(Session)이다.
세션은 서버 측에서 상태를 관리하는 방법이다. 클라이언트가 세션 ID를 서버에 전송하면 서버는 전송된 ID를 기반으로 상태를 유지할 수 있게 된다.
쿠키는 클라이언트에 상태 정보를 저장하고 클라이언트가 서버에 요청할 때 쿠키를 같이 전송한다. 이를 통해 서버는 클라이언트를 식별할 수 있게 된다.
쿠키(Cookie)와 세션(Session)은 다음 포스팅에서 자세히 다뤄 보겠습니다.!!
'네트워크' 카테고리의 다른 글
쿠키(Cookie)와 세션(Session) (3) | 2024.10.22 |
---|---|
[HTTP] GET과 POST의 차이 (1) | 2024.10.13 |