우리가 흔히 이용하는 HTTP 프로토콜을 조금 알아보았다. 먼저 프로토콜이란 하나의 규칙이라고 생각하면 된다.
HTTP 프로토콜 또한 인터넷을 사용하는데 필요한 하나의 규칙이다.
HTTP 프로토콜은 서버-클라이언트 모델을 따르는 전송 규칙이다.
위 그림처럼 클라이언트(사용자)가 보낸 요청이 서버로 전달된다. 그리고 서버는 그 요청을 처리하고 결과값을 클라이언트에게 보낸다.
이 과정이 HTTP 프로토콜의 전반적인 흐름이다.
HTTP 프로토콜에는 두 가지 특징이 있다. 하나는 Stateless. 요청의 상태를 저장하지 않는다. 다른 하나는 Connectionless. 요청이 발생할 때만 서버에 연결한다.
특징 1 : Stateless
요청의 상태를 저장하지 않는다. 이 말은 방금 전에 보낸 요청과 지금 보내는 요청 사이에 연결고리가 없다는 말이다. 심지어 동일한 연결 상에서 연속하여 전달된 요청에도 연결고리가 없다.
상태를 저장하고 저장하지 않고 가 어떤 차이를 가져오는지 예시를 하나 들어보겠다.
상태를 저장할 때의 햄버거 세트 주문 과정을 한번 살펴보자.
먼저 원하는 햄버거를 고른다. 빅맥을 고른다 그리고 다음 요청으로는 세트인지 단품인지 골라야 한다.
이미 빅맥이라는 햄버거를 선택했고 상태를 저장했기 때문에 현재 단계에서는 세트인지 단품인지만 선택하면 된다.
만약 세트를 선택했다면 이제는 수량을 선택하면 된다.
물론 이전 상태인 빅맥 세트를 저장하고 있기 때문에 그냥 수량만 입력하면 다음 단계로 넘어갈 수 있다.
마지막 단계에서는 결제가 이루어지는데 여기서도 이미 빅맥 세트 2개를 기억하고 있기 때문에 바로 결제를 진행하면 된다.
반대로 상태를 저장하지 않으면 각 단계에서 보내야 할 정보들이 조금 늘어난다.
먼저 햄버거를 선택한다. 빅맥을 선택했다.
이제 단품인지 세트인지 결정해야 하지만 이전 요청을 저장하지 않기 때문에 햄버거 정보도 같이 보내야 한다.
세트를 선택했다. 그럼 수량을 입력해야 하는데 여기서도 이전 요청의 상태를 저장하지 않기 때문에 어떤 햄버거인지, 세트인지를 다시 보내줘야 한다.
빅맥 세트 2개를 입력하고 마지막 결제 단계에서도 모든 정보를 또 보내주고 결제를 진행해야 주문 과정이 끝이 난다.
예시에서 알 수 있듯, Stateless라는 특징은 클라이언트가 보내야 하는 데이터 양이 많다는 단점이 있다.
하지만 뚜렷한 장점 또한 있다. 요청들에 연결고리가 없기 때문에 서버를 쉽게 바꿀 수 있다.
즉, 높은 서버 확장성을 가지고 있는 게 HTTP 프로토콜이다.
개발을 하면서 하나 신경 써야 할 Stateless 특징의 단점이 하나 더 있다. 바로 로그인 시 사용자의 정보를 유지하지 않는다라는 점이다.
이 부분은 세션에 사용자 정보를 저장하는 방식으로 해결이 가능하다.
특징 2 : Connectionless
두 번째 특징은 HTTP 프로토콜은 요청이 들어올 때만 서버에 연결하고 요청을 처리한다. 이 특징은 짤게 이렇게 정리할 수 있다.
필요시에만 사용을 하니까 서버 자원을 효율적으로 사용할 수 있다.
클라이언트와 서버의 통신 흐름
1. TCP에 연결한다.
2. HTTP 메시지를 전송한다.
3. 서버에서 전송된 응답을 받는다.
4. 연결을 종료하거나 다음 요청을 위해 재사용한다.
간략한 통신 흐름이다. 여기서 HTTP 메시지와 서버의 응답을 조금 더 살펴보자.
요청(Request)
요청에는 크게 3가지 부분이 있다. Request Line, Header, Body가 있다.
먼저 Request Line에는 메서드 타입, 목표 URI, HTTP 버전 정보가 담긴다. 메서드 타입에는 우리가 흔히 접해본 GET, POST, PUT, DELETE, OPTIONS 등이 있다.
uri에는 요청이 찾아가야 하는 path와 요청 처리에 필요한 query가 담겨서 보내진다.
Header에는 다양한 정보들이 Key-Value 방식으로 담겨있다.
예를 들면 클라이언트가 받을 수 있는 콘텐츠 타입, 해당 요청이 종료되어야 하는지 재사용되어야 하는지를 알려주는 지속 상태, 쿠키 정보, 메시지 바디의 종류와 길이 등이 저장된다.
마지막으로 Body에는 실제 메시지 내용이 들어간다. 요청에 따라 Body가 존재하지 않을 수 있다.
응답(Response)
서버에서 돌아오는 응답 또한 3가지 부분을 가지고 있다. Status Line, Header, Body가 있다.
Status Line에는 HTTP 버전, 상태 코드 그리고 상태 코드 정보가 저장된다.
200번대 상태 코드는 통신이 성공했을 때 돌아오는 코드이다. 주로 만나게 되는 코드는 200번, 성공이다.
300번대 상태 코드는 요청한 자원이 다른 주소로 옮겨졌을 때 돌아오는 리다이렉션 코드이다.
400번대 상태 코드는 클라이언트에서 오류를 범한 경우이다. 가장 흔히 만나는 코드인 404가 있다. 요청한 해당 자원이 없다는 말이다.
권한이 없는 자원을 요청한 경우에는 401 같은 권한 없음 코드가 돌아온다.
마지막으로 500번대 상태 코드는 서버 측 오류이다. 서버가 요청을 처리 못해서 돌아오는 500번이 있고 과부하 등으로 서버가 내려간 상태인 503이 있다.
응답의 Header에는 바디의 데이터 타입, 길이 쿠키 설정 정보, 클라이언트 정보, 인증 정보 등이 저장된다.
Body에는 실제 전송할 데이터가 담겨온다. html 문서, 이미지, 영상 그리고 Json 등 byte로 표현 가능한 모든 데이터가 전송 가능하다.
'TIL' 카테고리의 다른 글
vi 에디터 사용법 정리 (0) | 2022.08.06 |
---|---|
swap 설치를 통해 ec2 메모리 할당하기 (0) | 2022.08.04 |
OSI 모델 - Session Layer(layer 5)!? (0) | 2022.04.10 |
OSI 모델 - Presentation Layer(layer 6)!? (0) | 2022.04.05 |
OSI 모델 - Application Layer(layer 7) (0) | 2022.04.05 |