본문 바로가기

CS 전공지식/네트워크

[네트워크] OSI 7계층(HTTP 1편)

이전 시간에는 응용 계층과 DNS 프로토콜에 대해 알아보았습니다.

오늘은 응용 계층의 또 다른 프로토콜인 HTTP 프로토콜에 대해 알아보겠습니다.

 


 

HTTP

HTTP(HyperText Transfer Protocol) 프로토콜은 약자 그대로 해석을 하면 하이퍼 텍스트 문서를 전송하기 위해 사용되는 프로토콜입니다. 구체적으로 설명하면 하이퍼 텍스트인 HTML 문서를 전송하는 것으로 웹 브라우저와 웹 서버 사이의 통신에 관한 절차를 규정한 프로토콜입니다.

웹 브라우저와 웹 서버 사이에서 통신할 때는, 웹 브라우저가 웹 서버에 웹 페이지를 요청(Request)하는 것과 웹 서버가 웹 브라우저에게 응답(Response)하는 것이 있습니다. 중요한 특징 중 하나는 HTTP 통신은 반드시 웹 브라우저의 요청(Request)이 있어야 시작된다는 것입니다. 요청 없이 웹 서버가 응답(Response)하는 경우는 있을 수 없습니다.

 

- HTTP 메시지

HTTP에서 사용되는 데이터 단위를 "HTTP 메시지"라고 합니다. 이전에도 계속 언급했던 것처럼 메시지는 헤더와 실제 데이터로 이루어져 있습니다.

HTTP 메시지의 헤더에는 웹 서버와 웹 브라우저 사이의 요청과 응답할 때 데이터를 처리하기 위한 정보가 담깁니다. 헤더 앞에는 시작 줄이라는 정보가 추가되는데 헤더와 시작 줄을 묶어서 HTTP 헤드라고 합니다. HTTP 요청 메시지의 시작 줄에는 서버가 실행해야 할 요청이, HTTP 응답 메시지의 시작 줄에는 서버가 요청을 실행한 결과가 표시됩니다.

실제 데이터는 HTTP 본문 또는 HTTP 바디라고 합니다. HTTP 헤드와 HTTP 바디는 공백 줄로 구분 짓습니다.

 

HTTP - HTTP 메시지

 


 

- HTTP 시작 줄

(1) 요청

웹 브라우저가 웹 서버에게 웹 페이지를 보내달라는 요청을 할 때, 시작 줄에 무슨 페이지를 어떻게 보내달라는 내용을 담아 요청하고, 이를 위해 URL과 메서드를 이용합니다.

URL은 웹 페이지가 저장된 위치입니다. 즉 해당 위치에 있는 문서를 보내달라는 의미입니다. 메서드는 'GET', 'POST' 등으로 메서드 별로 의미가 다릅니다.

HTTP 요청 메서드 의미
GET 데이터 조회
HEAD 서버 정상 작동 여부 확인
POST 데이터 생성
PUT 데이터 수정
DELETE 데이터 삭제
CONNECT 프록시 서버를 경유하여 SSL 통신
OPTIONS 서버가 지원하는 메서드 확인

 

(2) 응답

웹 서버가 웹 브라우저의 요청에 대한 응답을 할 때, 시작 줄에 상태 코드를 통해 처리 결과를 알려줍니다. 상태 코드는 요청을 웹 서버가 정상적으로 처리했는지, 아니면 에러가 발생했는지 여부를 알려주는 코드입니다.

상태 코드는 5개의 그룹으로 분류됩니다.

상태 코드 분류 의미
100~199 information 정보 응답
200~299 success 성공 응답
300~399 redirection 리다이렉션 메시지
400~499 client error 클라이언트 에러 응답
500~599 server error 서버 에러 응답

100번대 코드는 요청에 대한 처리가 계속되고 있다는 정보를 제공하는 코드로 특수한 용도 외에는 거의 사용되지 않습니다. 200번대 코드는 요청에 대해 성공적으로 작업이 처리됐음을 알려줍니다. 300번대 코드는 요청을 완료하기 위해서 추가 동작이 필요함을 의미합니다. 400번대 코드는 클라이언트가 보낸 요청에 오류가 있음을 알려줍니다. 그중 404 에러가 가장 흔히 볼 수 있는 에러인데, 이는 잘못된 URL로 접속하려고 할 때 보내주는 코드입니다. 500번대 오류는 서버 내부에 오류가 있음을 알려줍니다. 따라서 서버를 구현하다가 테스트할 때 500대 에러가 발생하면 어딘가에 오타가 났구나 생각할 수 있습니다.

(추가적으로 100~ 599까지의 숫자가 모두 사용되는 것은 아닙니다.)

 

가장 흔하게 사용되는 상태 코드를 살펴보면

200 요청이 정상적으로 처리됨
301 요청한 리소스가 새로운 URL로 영구 이전됨
401 인증이 필요함
404 요청한 URL에 해당하는 리소스를 찾지 못함
503 현재는 서버가 요청을 처리할 수 없음

이렇게 5가지가 있습니다.

 


 

- HTTP 헤더와 바디 

(1) 헤더

HTTP 헤더는 요청과 응답에 필요한 부가 정보를 선택해서 넣기 때문에 0개 또는 1개 이상의 헤더가 존재할 수 있습니다.

헤더는 요청 헤더, 응답 헤더, 일반 헤더, 엔터티 헤더, 확장 헤더로 분류됩니다.

요청 헤더 요청 메시지를 위한 헤더, 요청에 필요한 부가정보(클라이언트가 요청에 따라 받을 수 있는 데이터 타입, 클라이언트의 브라우저 정보 등)가 저장됨
응답 헤더 응답 메시지를 위한 헤더, 응답에 필요한 부가정보(클라이언트에게 보낼 데이터 타입, 서버 애플리케이션 정보 등)가 저장됨
일반 헤더 기본적이고 유용한 정보를 제공하기 위한 헤더, 부가정보(메시지 생성 일시, 클라이언트와 서버 간의 연결 등)
엔터티 헤더 HTTP 바디에 포함된 데이터의 타입, 데이터의 길이 등 바디에 관한 정보가 담긴 헤더
확장 헤더 애플리케이션 개발자들에 의해 만들어져 사용되고 있는 비표준 헤더

 

(2) 바디

HTTP 바디에는 요청과 응답에 필요한 데이터가 들어갑니다.

응답 메시지의 바디에는 보통 웹 브라우저가 요청한 데이터가 저장됩니다. 웹 브라우저에서 웹 페이지를 요청한다면 웹 페이지의 리소스인 HTML 파일의 내용이 HTTP 바디에 저장됩니다.

반면 요청 메시지는 보통 요청 이외에 서버에 전송할 데이터가 없으므로 HTTP 바디 부분이 비어있습니다. 데이터 생성 메서드인 POST 메서드를 사용하는 경우에만 HTTP 요청 바디에 데이터가 저장됩니다.

 


 

 

- Connectionless

HTTP의 특징은 connectionless 입니다. 이는 클라이언트와 서버가 한번 연결을 맺은 후 클라이언트의 요청에 대한 서버의 응답이 끝나면 연결을 끊어버리는 것을 의미합니다.

불특정 다수를 대상으로 하는 서비스에 적합하고, 수많은 사람이 웹 서비스를 이용하더라도 접속 유지는 최소한으로 하기 때문에 많은 요청을 처리할 수 있다는 장점이 있습니다.

하지만 연결을 끊어버리기 때문에 클라이언트의 이전 상태를 알 수 없다는 단점이 있습니다.

 


 

지금까지 HTTP 프로토콜에 대해 알아보았습니다.

하지만 아직 다루지 못한 내용이 많기 때문에 다음 시간에도 HTTP 프로토콜에 대해 알아볼 예정입니다.