1. HTTP(Hyper Text Transfer Protocol) 개요
- 프로토콜(Protocol)은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계를 말한다.
- HTTP 프로토콜은 인터넷상에서 데이터를 주고받기 위해 서버/클라이언트 모델을 따르는 프로토콜을 말한다.
- 서버와 클라이언트는 서로 간의 요청과 응답(Request & Response)를 통해 서로 정보를 주고 받는다.
- HTTP는 비연결 지향(Connectionless)으로 클라이언트가 보낸 요청에 대한 응답이 오면 바로 연결이 끊어지며 이로 인해 과도한 서버의 부하를 줄일 수 있다.
- 하지만 이러한 비연결성은 동시에 모든 클라이언트의 요청에 대해 매번 새로운 연결을 시도 및 해제해야 한다는 점에서 이에 대한 오버헤드가 발생한다는 단점이 있다.
- 이러한 오버헤드를 줄이고자 KeepAlive 속성을 사용할 수 있는데, 이는 지정된 시간 동안 서버와 클라이언트 간의 패킷 교환이 없을 경우 서로의 상태를 확인차 패킷을 주기적으로 보내는 것을 말하며 여기서 패킷을 주고 받으면서 반응이 없을 경우 접속을 끊는 것이다.
- 하지만 이 역시 주기적으로 클라이언트와의 연결을 체크한다는 점에서 비연결 지향으로 인한 오버헤드의 근본적인 해결책이 될 수는 없다.
그렇다면 HTTP의 요청과 응답 과정에서 주고받는 메시지와, 구체적인 동작 방식에 대해 자세히 알아보자
2. HTTP 메시지와 HTTP 헤더
1) HTTP 메시지와, 메시지 헤더
HTTP 프로토콜의 요청과 응답에는 메시지 헤더가 포함되어 있는데, 이는 서버나 클라이언트에서 요청과 응답을 처리하기 위한 정보를 담고 있다. 보통 요청과 응답을 처리하면서 주고 받게 되는 HTTP 메시지는 [메시지 헤더+개행문자+메시지 바디]의 구조로 되어 있으며 각각의 메시지 헤더를 구성하는 요소는 아래와 같다.
- 요청 메시지 헤더
리퀘스트라인, 리퀘스트 헤더 필드, 일반 헤더 필드, 엔티티 헤더 필드, 그 외
- 응답 메시지 헤더
상태 라인, 리스폰스 헤더 필드, 일반 헤더 필드, 엔티티 헤더 필드, 그 외
이처럼 HTTP 메시지의 헤더 필드는 요청과 응답 양쪽에 모두 존재하면서 메시지 바디의 크기, 사용 언어, 인증정보 등의 중요한 정보를 담고 있다.
2) HTTP 헤더 필드
HTTP 헤더 필드는 헤더 필드명과 필드값으로 구성되어 있으며, 각각의 요소롤 ":"으로 구분한다.
Content-Type:text/html
위의 헤더 필드는 메시지 바디의 객체 타입을 가리키는 Content-Type이라는 필드명과, 필드값에 해당하는 text/html의 구조로 이루어져 있는 것이다. 하나의 HTTP 헤더 필드는 여러 개의 필드값을 가질 수도 있다.
만일 HTTP 헤더 필드가 중복된 경우에는 이에 대해 명확히 사양으로 정해진 바가 없기 때문에 브라우저에 따라 각기 다른 동작을 하게 되는데, 최초 헤더 필드를 우선적으로 처리하거나 마지막 헤더 필드를 우선적으로 처리할 수도 있다.
HTTP 헤더 필드는 용도에 따라 아래와 같은 4종류로 분류된다.
- 일반 헤더 필드(General Header Fields)
응답, 요청 메시지에 둘 다 사용되는 헤더를 말한다. 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더이다.
- 요청 헤더 필드(Request Header Fields)
요청 메시지에 사용되는 헤더로, 리퀘스트 정보 혹은 리스폰스 콘텐츠에 대한 우선순위 등에 대한 정보를 담고 있다.
- 응답 헤더 필드(Response Header Fields)
서버측에서 송신한 응답 메시지에 사용되며 서버 정보나 클라이언트의 추가 정보 요구 등에 대한 정보를 담고 있다.
- 엔티티 헤더 필드(Entity Header Fields)
응답, 요청 메시지에 포함된 엔티티에 사용되는 헤더로 콘텐츠 갱신시간 등과 같은 엔티티 관련 정보를 담고 있다.
엔티티(entity)
요구나 응답 메시지의 페이로드(payload)로서 전송되는 정보로, 엔티티 헤더 필드 형태의 메타 정보와 엔티티 바디 형태의 내용으로 구성되어 있다. 메시지 바디의 콘텐츠를 나타내며 요청과 응답에 모두 사용된다.
보통 HTTP/1.1에 정의된 헤더 필드는 세부적으로 용도에 따라 총 47종류로 정의되는데 각각의 헤더필드는 아래 링크를 참고하면 된다.(다 언급하면 글이 너무 길어지니..)
www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
한편 HTTP 헤더 필드가 위에서 언급한 47종류만 있는 것은 아니다. 대표적으로 Set-Cookie, Cookie가 있는데, 이는 쿠키를 위한 헤더필드로 HTTP/1.1의 RFC2616에 포함된 것은 아니지만 서버와 클라이언트 간의 연결 상태 관리를 위해 널리 사용되고 있다.
(쿠키에 대한 설명은 2020/12/24 - [네트워크&서버] - 쿠키와 세션를 참고하자)
Set-Cookie 헤더필드는 서버에서 클라이언트로 응답할 때, 상태 관리를 위한 정보를 전달하며 Cookie 헤더필드는 반대로 클라이언트에서 서버로 요청할 때 원하는 HTTP 상태 관리 정보를 전달한다.
3. HTTP 메소드와 응답코드
HTTP는 요청 메소드를 정의함으로서, 원하는 행동 방식을 지정할 수 있다. 이전 포스팅에서 살펴본 , GET과 POST 방식 역시 HTTP 요청 메소드의 일부이다. 구체적인 HTTP 메소드의 종류는 아래와 같다.
1) HTTP 메소드
- GET : URI 형식으로 웹서버측 데이터를 요청하는 메소드이다. 보통 매개변수(parameter)를 넘겨서 이에 해당하는 본문 형식을 받는 방식을 취한다.
- HEAD : GET과 유사하지만 실제 문서나 데이터를 요청하는 것이 아닌 이에 대한 정보를 요청하는 메소드이다. 따라서 응답 메시지에 바디없이 HTTP 헤더 정보만을 보낸다.
- POST : 클라이언트에서 서버로 전달하고자 하는 정보를 서버로 전송하는 메소드이다.
- PUT : POST와 유사하게 정보를 서버로 보내지만, 보통 갱신 위주로 이루어지는 메소드이다.
- DELETE : 웹리소스를 제거할 때 사용된다.
- CONNECT : 프록시 서버와 같은 중간 서버를 경유한다.
프록시 서버(Proxy Server)
서버와 클라이언트의 양쪽 역할을 하는 중계 프로그램으로, 클라이언트로부터 요청을 서버에 전송하고, 서버로부터의 응답을 클라이언트에 전송한다. 리소스 본체를 가진 오리진 서버(Origin Server)와 클라이언트를 매개하는 것이다.
HTTP 통신을 할 때 프록시 서버를 여러 대 경유하는 것도 가능하며 이 경우 Via 헤더 필드에 릴레이한 정보를 추가한다.
- OPTIONS : 웹서버측에 제공하는 메소드에 대한 질의로, Allow:GET, POST, HEAD와 같은 방식으로 메시지를 보내 질의한다.
- TRACE : 요청 리소스가 수신되는 경로를 보여준다.
2) HTTP 응답 코드
HTTP 응답코드의 경우 크게 5개의 클래스로 분류할 수 있다. 보통 1xx, 2xx, 3xx와 같은 형식인데, 여기서 상태코드의 첫번째 숫자가 응답의 클래스를 의미하게 된다. 각각의 첫자리들의 의미는 아래와 같다.
- 1xx(정보) : 요청을 받았으며 프로세스를 계속한다.
- 2xx(성공) : 요청을 성공적으로 받았으며, 인식했고 수용했다.
- 3xx(재연결) : 요청 완료를 위한 추가 작업 조치가 필요하다.
- 4xx(클라이언트 오류) : 요청 문법이 잘못되는 등의 이유로 요청 처리가 불가능하다.
- 5xx(서버 오류) : 서버가 유효한 요청에 대해 충족을 실패했다.
간혹 흔히 보이는 '404 Not Found'의 경우, 클라이언트 오류 코드의 대표적인 예로 요청한 페이지가 존재하지 않는 것을 의미한다.
구체적인 응답 코드들의 종류와 기능은 아래 링크를 참고하도록 하자
ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
참고 :
developer.mozilla.org/en-US/docs/Web/HTTP/Methods
developer.mozilla.org/en-US/docs/Web/HTTP/Headers
'네트워크&서버' 카테고리의 다른 글
네트워크 계층(1) - TCP/IP 4계층 (2) | 2020.12.27 |
---|
댓글