3 min read

[HTTP] HTTP 란

인터넷을 이용하여 데이터를 어떻게 주고받을까 고민하던 팀 버너스리라는 사람으로부터 고안된 프로토콜이다.

이 프로토콜과 함께 HTML, URL 이 탄생하게 되었는데 URL 에 접속하면 해당하는 HTML 텍스트를 HTTP 통신으로 주고받는 것이다.

HTTP 의 주된 특징은 비연결성과 상태비유지, 클라이언트-서버 구조이다. 하나하나씩 알아보자.

 

1. 비연결성 ( Connectless )

소켓통신이나 FTP 와 같은 프로토콜은 서버와 클라이언트가 서로 연결되어 있어 통신가능하다.

하지만 HTTP 는 비연결성으로 HTML 파일을 받으면 그 즉시 연결이 중단된다.

왜 연결이 끊어질까?

 

서버와 클라이언트가 HTTP 로 통신하기 위해서는 HTTP Port 를 통해 연결이 된다.

HTTP Port 는 2바이트로 65536 까지 연결할 수 있다.

하지만 1024까지는 정해져있는 포트로 대표적으로 SSH 22, http 80 https 443 이렇게 정해져있다.

 

만약 계속 연결이 되어있다면?

서버는 약 65,000 개의 클라이언트만을 받을 수밖에 없다.

그래서 비연결성의 특징이 있어 여러 클라이언트를 받을 수 있게 하였고 또 계속 연결되어있으면 아무래도 서버 부하가 계속 걸려 좋지 않을 것이다.

 

 

2. 상태 비유지 (Stateless)

상태라고 하면 어떤 상태가 있을까? 로그인 상태가 대표적이지 않을까 싶다.

서버는 요청이 들어온 사용자가 로그인을 했었는지 따로 저장하지 않는다. 이유는 요청이 들어온 사용자를 전부 저장하게 된다면 부하도 부하지만 불필요한 저장이 발생하게 되기 때문이다.

 

그러면 어떻게 로그인 여부를 알 수 있을까?

세션과 쿠키를 통해 유지를 할 수 있도록 구현한다. 세션은 토큰으로 되어있어 사용자가 로그인한 시점에 생성되도록 구현한다. 토큰은 브라우저의 쿠키에 저장하여 요청을 보낼 때마다 쿠키와 함께 보낸다.

서버는 쿠키를 파싱하여 세션 값을 보고 만료가 되지 않았으면 로그인된 것으로 간주한다.

다시 말하면 로그인 후에 쿠키 값을 삭제하면 로그아웃되었다고 안다는 것이다.

 

 

3. 서버 - 클라이언트 구조

HTTP 는 요청하는 입장인 클라이언트와 요청에 대한 응답을 주는 서버는 분리되어 있는 구조이다.

 

http/1.0 에서는 클라이언트가 index.html 를 요청하면 index.html 를 넘겨주고 연결을 끊었다. index.html 이 필요한 파일대로 다시 요청하고 응답을 받고 연결을 끊는 방식이었다.

하지만 이건 비효율적이었기에 1.1 에서는 keep-alive 를 지원하게 되어 index.html 에 필요한 파일 모두 받고 연결을 끊는 방식이 되었다.

 

요청은 Request, 응답은 Response 로 서로 구조를 가지고 있다.

Request 와 Response 구조 (https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages 참조)

요청과 응답에 대한 자세한 내용은 나중에 다루어보려고 한다.