Hyper Text Transfer Protocol의 약어로 HTTP이며, 이는 문서를 전송하기 위한 약속이다.
이 HTTP는 Server와 Client가 어떻게 메세지를 교환할지를 정해놓은 규칙인것이다.
80번포트를 사용하여 HTTP의 구조는 Request 와 Response로 구성이 되어있다.
이는 보안이 되어있지 않아 TLS 를 통한 HTTPS통신이 존재하는데, 이는 뒤에서 다시 알아보자.
HTTP는 Request와 Response로 구성이 되어있다고 언급을 했다.
이는 더 자세히 보면 Client가 Request를 보내고, Server가 Request를 받아 Response 를 해주고, Client측에서 Response를 받는 구조로 되어있다.
FTP나 Telnet의 경우 비연결성이라 Server에 정보를 요청해도 Server가 Client의 요결을 끊어버릴 수 있지만, HTTP의 경우 Client가 Request를 보내면 Server에서 Response를 보내주고 연결을 끊는 방식이다.
그런데 Client가 Server에 어떻게 Request를 보내고, Response를 받을까??
이는 한번 쯤 들어보았을 HTTP Method를 통해서 전달하기도 한다.
[POST] /user
[GET] /user
위 두 개의 Request가 같은 Response를 넘겨줄까?
동일 로직을 구현한것이 아니라면 다르다. 이는 같은 Path에 값을 보낸다고 한들, Method의 차이로 다른 Reposne를 받게 된다. Method의 차이로 인해 Request값도 달라질 수 있다.
이런 Method들은 CRUD(Create, Read, Update, Delete)에 따라서 다르게 사용되기도 한다.
각 Method의 용도는 아래와 같다.
아래 이미지를 보면 Request와 Response는 startLine, Headers, emptyLine, body로 총 4등분이 된다.
이 4등분이 되는 내용들은 구성파일, API, 기타 인터페이스에서 HTTP Message를 자동으로 생성하여 보내기 때문에 개발자가 직접 작성할 필요가 없다.
이처럼 총 4등분이 되어있고, 이러한 내용이 OSI계층을 타고 내려갔다가 다시 올라가는 흐름을 따라 Client와 Server가 서로 통신을 하게 된다.
갑자기 뜬금없이 Stateless라는 단어가 튀어나왔다. 이는 무엇일까?
바로, HTTP의 특징 중 하나이다.
HTTP는 State를 유지하지 않는다. 즉, 목적을 다 한 통신이라면 해당 통신을 끊는다는것이다.
이를 좀 더 쉽게 말하면 서버가 Request를 받고, Response를 보냈다면 통신을 끊어버린다는것이다.
“그런데 우리는 로그인을 통해 계속 서버의 값을 가져와서 사용하지 않나요?”
맞다. 이 로그인을 통해 통신을 할 때 “나 여기 접속했던 유저야!” 라고 알려주게 되는데 이 과정을 설명하는게 바로 Cookie&Session이다.
위에 언급한대로 세션이라는 효자같은놈이 해결을 해준다.
그런데 갑자기 쿠키라는 놈이 등장했다. 왜 등장하는것일까?
세션에 대해서 조금이라도 검색을 해봤다면 “세션 구현 시 쿠키를 사용한다” 라는 말을 들어보았을 것이다.
그러면 세션=쿠키 인가?
어떻게 보면 같고 어떻게 보면 다르다.
관점의 차이인데, 우선 아래 개념을 잡아두면 편하다
세션은 서버에 잠시 정보를 저장해 두는것이다.
잠시 저장해둔다 라는 말이 나왔는데, 이는 말 그대로 로그인을 한 정보를 서버에 잠시 저장을 한다는것이다.
그렇다면 세션에 대해서는 어느정도 감이 잡혔을텐데, 쿠키는 무엇일까?
세션은 서버에 저장이 된다고 했다. 반대로 쿠키는 서버에서 만들어진 세션값이 클라이언트에 저장이 된다.
이렇게 보면 어느정도 이해가 갈 것이라고 생각이 든다.
그렇다면 동작 방식은 어떻게 되는것일까?
로그인
로그인을 한다고 가정을 해보자.
CL - 서버야 나 로그인 할게
SV - 잠시만.. 너 처음보는거같은데? 그럼 너를위한 공간을 잠시 만들어줄게! xx시간동안 사용할 수 있는 공간의 주소야!
CL - 고마워!
....
CL - 서버야 나 다시왔어! 내 공간의 주소는 이거야!
SV - 잠시만! ...(세션 id 존재하고, 시간 괜찮고) 아 여기있네 너의 정보를 줄게!
이 내용을 보게된다면 최초 로그인 시 서버에서 특정 클라이언트가 사용할 수 있도록 하는 저장소를 공간의 주소라고 언급을 했는데 그냥 당분간 값을 저장할 수 있는곳을 지정해준 것 이다.
여기서 단점이 있다. 임시로 저장을 하는것이기에 영구적이지 않다는 문제가 있는것이다.
또, 클라이언트의 연결이 많아질 때 임시로 저장을 하기 위해 공간을 낭비한다는 문제가 있다.
현재 우리가 사용하고있는 HTTP의 버전은 몇일까?
바로, HTTP/1.1 이다.
어? 그럼 이전 버전도 있겠네? 그러한 버전들은 무엇일까?
원래 HTTP의 초기 버전에는 버전 번호가 존재하지 않았다. 이러한 버전 이름이 붙은 이유는 1.0이 발표된 이후 차별성을 두기 위해 0.9라는 버전 번호가 붙은것이다.
이 버전에서의 HTTP는 단일 라인으로만 구성이 되어 완전 정적인 페이지만 받을 수 있었으며, GET메서드만이 유일했다.
GET /page.html
0.9의 경우 너무 제한적이라는 문제가 있어 브라우저, 서버 모두 조금 더 융통성을 가지기로 했다.
이 때 부터 Header라는 개념이 생기게 되었다. 이 후 추가된 내용은 아래와 같다.
GET /page.html HTTP/1.0
User-Agent :
...등등
현재 우리가 기본적으로 사용하는 프로토콜이다. 사실 1.0이 우리가 알고있는 형태와 많이 유사했지만, 아직 표준화가 덜 되어 표준화가 진행이 되었고, 이 과정을 통해 1.1이 발표 되었다.
개선 사항은 아래와 같다
1.1이 표준화 되어 약 15년간 지속이 되었는데, 이 사이 웹 페이지는 상당한 발전을 거쳐 매우 복잡해지며 애플리케이션화 되었다. 이렇게 되면서 스크립트의 양은 많아지고 더 많은 데이터들이 요청 너머로 전송되고 있다.
1.1의 경우 올바른 순서로 커넥션이 되어야 하며, 다양한 병렬 커넥션이 이론적으로 사용이 가능한 경우에도 많은 양의 오버헤드와 복잡도가 남아있다.
2.0으로 넘어오며 1.1과 차별화된 내용은 아래와 같다
HTTP 와 HTTPS의 TLS 대신 앞으로는 구글에서 제작한 QUIC라는 프로토콜이 사용된다.