이번 시간에는 get과 post, 3 way handshake에 대해 스터디한 내용을 공유하겠습니다.
get과 post란 HTTP 메소드입니다. 따라서 우리는 HTTP 메소드가 무엇인지 먼저 알아야 합니다.
http 메소드란 http를 이용하여 클라이언트와 서버 사이에 이루어지는 요청과 응답 데이터를 전송하는 방식입니다.
간단히 얘기하면 클라이언트(브라우저)에서 서버에 요청을 보내는 방법을 의미합니다.
따라서 get과 post는 간단히 말하면 서버에 요청을 보내는 방법이라는 뜻입니다.
get과 post는 각각 어떤 식으로 서버에 요청을 보내는지 살펴보겠습니다.
http통신은 요청과 응답을 위해 기본적으로 메시지를 작성하게 됩니다. 메시지는 header와 body라는 부분으로 나뉘게 됩니다.
header에는 일반적으로 프로토콜, URI등의 내용이 들어가게 되는데요. GET요청은 URI를 통해 서버측의 리소스를 요청하는 행위입니다.
GET이라는 행위는 메시지의 URI를 적는 것으로 서버측의 리소스를 요청합니다. 즉, Req메시지의 Header부분에 URI만 제대로 적어서 요청을 보내면 되는 것이죠.
브라우저창의 주소검색창에 주소를 적는 행위가 대표적인 GET방법입니다. 이렇게 요청을 보내면 서버는 URI에 해당하는 리소스를 찾아서 응답 메시지로 보내줍니다.
서버에 있는 어떤 리소스들은 클라이언트에서 일정한 데이터를 보내줘야 하는 경우도 있는데요. GET방식에서는 클라이언트에서 서버에 데이터를 보내야 하는경우 URI의 파라미터를 이용하여 데이터를 넘기게 됩니다.
위에서 '?'뒤의 부분이 바로 파라미터를 이용하여 데이터를 보내는 방법입니다. 서버는 '?'뒤의 정보를 통해 필요한 데이터를 파싱하여 얻을 수 있게 됩니다.
그러나 URI에 데이터를 포함하는 방법은 당연히 데이터의 크기가 제한적이고 보안이 필요한 데이터는 보낼 수 없다는 특징을 가지고 있습니다.
POST는 클라이언트에서 서버로 데이터를 전송할 때 사용하는 방법입니다.
위에서 HTTP를 이용한 통신은 메시지를 작성하면서 이루어진다고 했는데요. 기본적으로 통신에 필요한 정보를 적는 Header외에 Body라고 하는 부분이 있습니다.
POST는 바로 이 body 부분에 데이터를 작성하여 서버로 데이터를 전송하게 됩니다.
클라이언트에서 서버로 POST방법을 통해 데이터를 보내게 되면, 서버는 전달받은 데이터를 서버에 반영하고 반영 결과를 클라이언트에 응답해줍니다.
따라서 서버의 리소스를 요청하는 GET과 달리 POST는 서버의 상태를 변화시킨다는 특징을 갖고 있습니다.
또한 당연히 body를 이용하기 때문에 GET보다 보낼 수 있는 데이터의 크기가 큽니다.
또한 GET의 경우 브라우저에서 캐싱(Caching)이 가능하다는 특징일 갖고 있습니다.
HTTP메소드들은 이렇게 각자의 역할이 디자인되어 있으므로, 데이터의 크기가 작다고 GET으로 보내는 등 본래 디자인된 목적과 다르게 사용하지 않도록 주의해야 합니다.
예기치 못한 오류를 막고 코드의 가독성이나 이해를 높여주기도 하니까요.
TCP에서 사용하는 3-way Handshake는 TCP의 연결지향적 특성을 갖도록 해주는 방법입니다.
연결지향적 특성이란 데이터를 전송하는 측과 받는 측의 전송 선로(Session)을 만든다는 의미입니다.
이것을 위한 3-way Handshake란 간단히 말해서 서로 의사소통을 할 환경이 잘 구성 되었는지 즉, 연결이 잘 되었는지 확인하는 과정입니다.
먼저 클라이언트는 서버에 패킷을 보냅니다. 이때 패킷의 SYN이라고 하는 TCP header데이터를 1로 설정하여 보내게 됩니다.
이 패킷의 의미는 클라이언트가 서버에게 "너와 데이터 통신을 할 수 있니?"하고 물어보는 과정입니다.
클라이언트의 패킷을 받은 서버는 클라이언트에게 데이터 통신을 할 수 있다는 의미에서 ACK이라는 header데이터를 1로 설정하여 패킷에 담아 보내게 됩니다. 또한 서버 역시 클라이언트가 데이터 통신이 가능한지 물어보기 위해 SYN이라는 header를 1로 설정하여 패킷에 담아 보내게 됩니다.
이 패킷을 받은 클라이언트는 서버가 통신이 가능한 상태라는 것을 알게 되고, 서버의 SYN:1에 대한 응답으로 패킷에 ACK을 1로 설정하여 보내게 됩니다.
위 3번의 과정을 통해 클라이언트와 서버는 서로의 상태를 확인하며 통신을 연결합니다. 이러한 과정이 3 way handshake의 과정입니다. 이 과정 이후 클라이언트와 서버는 데이터를 주고받으며 통신하게 됩니다.
실제로는 효율성을 위해 3-way Handshake의 마지막 과정에서 클라이언트가 ACK:1의 패킷을 보내면서 통신할 데이터도 함께 담아 보낸다고 합니다.
TCP연결을 끊을 때 역시 4-way Handshake라는 과정을 통해 연결을 안정적으로 끊게 됩니다.
클라이언트와 서버가 보내야 할 데이터를 올바르게 다 보내고 종료할 수 있도록 하기 위해 이러한 과정을 거치게 됩니다.
4-way Handshake를 진행하며 클라이언트와 서버는 각각의 상태를 거치게 됩니다. 이에 관한 추가적인 학습 후 포스팅하겠습니다.