websocket과 HTTP의 차이를 공부하던 중, HTTP에 대해 공부해보고 싶은 욕심이 생겼다.
깊게 들어가보니 많은 내용들이 있었고 그 중에는 모르던 것도 꽤 있었다. 이번 기회에 알아 볼 수 있어서 오히려 다행이었다.
목차
1. HTTP란 무엇인가
- HTTP 개념
- HTTP 계층과 프록시
- HTTP 연결
2. HTTP요청과 응답
- HTTP 메시지, HTTP/2.0으로의 변화
- HTTP 요청 / 헤더와 바디
- HTTP 응답 / 헤더와 바디
1. HTTP란 무엇인가?
1) HTTP의 개념
HTTP : The Hypertext Transfer Protocol
HTTP는 'www'(World Wide Web)의 '토대'이다.
* World Wide Web은 인터넷에 연결된 사용자들이 서로의 정보를 공유할 수 있는 공간이다. 보통 '웹'이라고 줄여서 부른다.
웹의 특징 중 하나는 인터넷 상에서 텍스트나 그림, 소리, 영상 등과 같은 멀티미디어 정보를 하이퍼텍스트 방식으로 연결하여 제공한다는 것이다.
HTTP가 웹의 토대 인 이유는 웹 안에서 리소스들을 요청하고 응답 받을 때 HTTP 프로토콜을 이용하기 때문이다.
HTTP 프로토콜을 기반으로 클라이언트가 서버에 요청을 하고 서버가 응답 메시지를 보내는 것. 이것이 일반적인 통신의 흐름이고, 웹에서의 모든 데이터 교환의 기초이다.
HTTP는 확장 가능한 프로토콜로 1990년 만들어진 이후 지속적으로 업데이트 되어왔다. 이러한 확장성으로 인해 HTML문서 뿐만 아니라 이미지와 비디오의 전송이 가능해졌고, HTML form의 데이터를 서버에 Post하는 작업까지 할 수 있게 되었다.
2) HTTP의 계층과 프록시
HTTP는 네트워크 계층 중 가장 상위 계층인 어플리케이션 계층에 존재한다.
우리가 보는 HTTP는 개별적인 '요청'과 '응답'이지만, 실제로 요청과 응답 사이에는 더 많은 개체들이 존재한다. 예를들어 라우터와 모뎀과 같은 개체들이 있다. 보통 이러한 것들은 웹의 계층적인 설계 덕분에 네트워크와 전송 계층 내로 숨겨진다. 이들은 성능에 중요한 관여를 하지만 HTTP 계층에서는 이들이 어떻게 동작하는지 보이지 않는다.
그런데 이 중 어플리케이션 계층, 즉 HTTP와 '같은 계층'에서 동작하는 것들이 있다. 일반적으로 프록시라고 한다.
프록시는 요청과 응답사이에서 여러가지 작업을 수행할 수 있다.
ex) 캐싱 (브라우저 캐시), 필터링 (바이러스 백신 스캔, 유해컨텐츠 차단), 로드 밸런싱(여러 서버들이 다른 요청을 처리하도록 허용), 인증(리로스에 대한 접근제어), 로깅(이력 정보 저장)
3) HTTP와 연결
TCP 연결이 설정된 이후에, HTTP를 통한 요청/응답 통신을 진행할 수 있다.
HTTP는 신뢰성 있는 연결을 전제로 한다. 그렇기 때문에 일반적으로 UDP가 아닌 TCP, 혹은 암호화된 TCP인 TLS를 통해 전송된다.
하지만 연결 자체는 HTTP의 권한 밖이다. HTTP는 신뢰할 수 있는 연결, 손실이 없는 연결 정도를 요구할 수 있지만 연결자체에 관한 근본적인 프로토콜을 요구하지는 않는다.
- Short-lived connection
HTTP/1.0 에서의 기본 동작은 각 요청/응답에 대하여 별도의 TCP 연결을 여는 단기 커넥션(Short-lived connection)이었다. TCP handshake는 그 자체로 시간을 소요하기도 하고, 지속적으로 연결되었을 때 예열되어 더욱 효율적으로 작동할 수 있다는 점에서 그 점을 이용하지 못하는 단기 커넥션은 비효율적이었다.
- Persistent connection
단기 커넥션의 두가지 결점, 새로운 연결을 맺는데 드는 시간 든다는 것, 연결지속을 통한 TCP 성능 효율화를 누리지 못하는 것. 이러한 결점을 해결하기 위해 지속 연결 개념이 나오게 된다. 이 개념은 keep-alive 연결이라고도 불린다. HTTP/1.1 에서는 이 지속적인 연결과 파이프라이닝 개념을 도입했다. HTTP/2.0 에서는 한번 더 나아가 단일 연결 상에서 메시지를 다중 전송할 수 있게하여 효율성을 증대시켰다.
하지만 지속 연결에도 약점이 있다. 유휴 상태일 때 서버의 리소스를 소비한다는 것과, DDOS공격에 대한 위험성이다. 이러한 점이 문제가 되는 상황이라면 연결이 유휴 상태가 되지마자 닫히는 non-persistent connection을 사용하는 것이 나을 수 있다.
+ DDos 공격과 HTTP
HTTP는 '무상태' 프로토콜이고, 각각의 명령이 독립적이었다.
이전 버전의 HTTP 프로토콜에서는 각각의 HTTP요청 마다 TCP 연결을 열고 닫아야 했다.
새로운 버전의 HTTP 프로토콜 (HTTP 1.1 이상) 에서는 지속적인 연결을 통해 많은 HTTP 요청을 처리할 수 있게 되었고 이를 통해 리소스 소비가 개선되었다. 즉 원래는 연결하고 보내고 받고 끊고, 연결하고 보내고 받고 끊고, 이렇게 해야 했는데 새로운 버전에서는 연결한 뒤에 여러 요청을 전달 할 수 있게 되었다는 것. (header의 Connection: Keep-alive)
그런데 이 때 대량의 HTTP 요청을 이용해서 Dos, DDos 공격을 할 수 있다. 이것은 어플리케이션 계층 공격의 일부로 간주된다.
- hop by hop
HTTP내의 '연결 관리'는 end-to-end가 아닌 hop-by-hop 방식으로 진행된다. 두개의 연속된 '노드' 사이의 연결에 적용된다는 것.
클라이언트와 첫 번째 프록시 사이의 커넥션 모델은 프록시와 서버 혹은 다른 프록시 간의 연결 모델과 다를 수 있다. Connection, Keep-Alive와 같이 커넥션 모델을 정의하는데 관여하는 HTTP 헤더들은 hop-by-hop 헤더이며, 중간 노드에 의해 그 값들은 변경될 수 있다.
HTTP헤더의 종류에는 end-to-end 헤더로 분류될 수 있는 'Host'와 같은 헤더들이 있다. 이러한 'end-to-end 헤더'의 개념과 HTTP가 '연결 관리' 측면에서 'hop-by-hop' 방식이라는 점이 혼동되었다. 'end-to-end 헤더들을 사용하여 server로 보내면 hop-by-hop이 아니라 end-to-end 방식이 되는게 아닌가?' 라는 식으로. 하지만 연결을 '관리' 하는 측면에서 보자면 중간 프록시에 의해서 값이 변경될 수 있기 때문에 hop-by-hop방식이 맞는 걸로 이해하였다.
2. HTTP 메시지 - 요청과 응답
HTTP 메시지는 클라이언트와 서버 간 데이터가 교환되는 방식이다. 개발자가 직접 HTTP 메시지를 텍스트로 작성하는 경우는 드물다. 소프트웨어, 브라우저, 프록시, 웹 서버가 그 일을 대신한다. 메시지는 요청과 응답 두가지 타입이 있다.
각각의 HTTP 메시지는 ASCII로 인코딩된 데이터를 전달한다. HTTP/1.x 버전에서는 사람이 읽을 수 있었지만 HTTP/2.0 에서는 HTTP 프레임으로 나누어 지게 되었다. HTTP/2.0은 텍스트 프로토콜이라기 보다는 이진 프로토콜이다.
HTTP/2.0에서 프레임으로 나누어지게 된 이유는 아래 HTTP/1.x 에서의 성능상 결함으로 인한 것이다.
- 본문은 압축되지만 헤더는 압축되지 않는 것
- 연속된 메시지들은 비슷한 헤더 구조를 띄는데, 메시지마다 반복되어 전송되는 것
- 다중 전송이 불가능한 것. 서버 하나에 연결을 여러개 열어야 한다는 것
HTTP2.0를 통해 이러한 결점을 보완할 수 있었다.
1) HTTP 요청
여기서 요청이란 웹 브라우저와 같은 인터넷 통신 플랫폼에서 HTTP를 통해 웹사이트를 로드하는데 필요한 정보를 요청하는 것이다.
보통 요청은 브라우저에 의해 요청이 전송되지만 무엇이든 될 수 있다. (크롤러 ..)
일반적인 HTTP 요청의 포함사항
1. HTTP version type
2. a URL
3. an HTTP method
4. HTTP request headers
5. optional HTTP body
- HTTP method란 무엇인가?
HTTP요청에 들어가는 사항 중 3번에 http method가 있다. HTTP 동사라고도 불린다. HTTP method는 HTTP요청을 통해 서버가 어떤 동작을 수행해야 할 지 가리킨다. 예를 들어 흔히 쓰는 method 중 'GET'과 'POST'를 보면, 'GET'요청의 경우 응답으로 정보를 '받길' 원하는 반면에 'POST' 요청은 일반적으로 클라이언트가 정보를 웹 서버에 '제출'하는 것을 가리킨다.
- HTTP request headers란 무엇인가?
HTTP request에 들어가는 내용으로 request header가 있다. 헤더는 글자 정보를 key-value 형식으로 담고 있다.
HTTP request headers는 모든 HTTP request에 포함된다. 이 헤더에는 어떤 데이터가 요청되고 있는지, 어떤 브라우저가 사용하고 있는지 등의 정보들이 포함된다.
- HTTP request body란 무엇인가?
서버의 데이터를 업데이트 하기 위해 주로 쓰이며 대표적으로 Post 요청에서 쓰인다.
웹 서버에 제출되는 유저 이름, 비밀번호나 form데이터들이 포함된다.
모든 요청들에 body가 포함되지는 않는다. 예를 들어 get, delete의 경우 보통 파라미터에 정보를 담아 요청한다.
body는 크게 두가지 카테고리로 나눌 수 있다.
- 하나의 파일로 구성된 단일 리소스 바디. Content-Type, Content-Length 두가지 헤더로 정의된다.
- 여러 리소스로 구성된 멀티파트 바디. 각각 다른 정보를 포함하고 일반적으로 HTML Form과 관련이 있다.
2) HTTP 응답
HTTP response는 클라이언트가 진행한 HTTP 요청에 대해서 인터넷 서버로 부터 받는 응답이다. '요청'에 기반하여 정보를 소통한다.
일반적으로 HTTP 응답에는 아래 사항들이 포함된다.
1. an HTTP status code
2. HTTP response headers
3. optional HTTP body
HTTP status code란 무엇인가?
HTTP 상태 코드는 세가지 숫자로 이루어져 있고, 응답의 상태를 숫자로 나타낸 것이다.
1xx - Informational
2xx - Success
3xx - Redirection
4xx - Client error
5xx - Server error
xx에 들어가는 숫자들은 00 부터 99 까지 다르게 나타난다.
HTTP response headers란 무엇인가?
http request처럼 http response도 header에 중요한 정보들을 포함해서 응답한다.
예를 들어 response body에 들어가는 데이터의 언어나 형식과 같은 것들이 포함된다.
HTTP response body란 무엇인가?
성공적인 GET요청에 대한 응답에는, 그 요청에 대한 데이터가 포함된 body가 있다.
대부분의 웹 요청의 경우 body에 담긴 데이터는 웹 브라우저에서 웹 페이지로 변환되는 HTML 데이터이다.
다음은 HTTP 헤더들에 대해서 알아보려고 한다.
참고사이트
https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
https://www.cloudflare.com/ko-kr/learning/ddos/glossary/hypertext-transfer-protocol-http/
'Frontend Study - 1 > HTTP' 카테고리의 다른 글
주요 HTTP headers에 대하여 ! (0) | 2023.02.23 |
---|---|
MIME TYPE 이란 무엇인가 ! (0) | 2023.02.19 |