##본 포스팅은 '그림으로 배우는 Http & Network Basic - 우에노 센'을 읽고 쓴 요약/정리 글입니다.
HTTP 메시지
HTTP에서 교환하는 정보는 HTTP 메시지로, 리퀘스트 메시지와 리스폰스 메시지가 있다.
HTTP 메시지는 복수행의 데이터로 구성된 텍스트 문자열이다.
크게 구분하면 메시지 헤더와 메시지 바디로 구분한다.
리퀘스트 메시지와 리스폰스 메시지의 메시지 헤더 내부는 다음과 같은 데이터로 구성되어있다.
- 리퀘스트 라인
리퀘스트에 사용하는 메소드, 리퀘스트 URI, 사용하는 HTTP 버전 - 상태라인
리스폰스 결과를 나타내는 상태 코드와 설명, 사용하는 HTTP 버전 - 헤더 필드
리퀘스트와 리스폰스의, 여러 조건과 속성 등을 나타내는 각종 헤더 필드가 포함
인코딩을 통한 전송 효율 향상
HTTP로 데이터를 전송할 경우 그대로 전송할 수도 있지만, 전송할 때에 인코딩(변환)을 실시함으로써 전송 효율을 높일 수 있다.
전송할 때 인코딩을 하면 다량의 액세스를 효율 좋게 처리할 수 있다.
단지, 컴퓨터에서 인코딩 처리를 해야 하기 떄문에 CPU 등의 리소스는 보다 많이 소비하게 된다.
> 메시지 바디와 엔티티 바디의 차이
- 메시지 바디 : HTTP 통신의 기본단위
- 엔티티 : 리퀘스트랑 리스폰스의 페이로드로 전송되는 정보
HTTP 메시지 바디의 역할은 리퀘스트와 리스폰스에 관한 엔티티 바디를 운반하는 일이다.
둘은 같지만, 전송 코딩이 적용된 경우엔 엔티티 바디의 내용이 변화하게 된다.
> 전송 방식
1. 압축해서 보내는 콘텐츠 코딩
파일을 압축하는 엔티티에 적용하는 인코딩 방식이다.
2. 분해해서 보내는 청크 전송 코딩
HTTP 통신에서는 리퀘스트했었던 리소스 전부에서 엔티티 바디의 전송이 완료되지 않으면 브라우저에 표시해주지 않는다.
사이즈가 큰 데이터를 전송하는 경우에 데이터를 분할해서 조금씩 할 수 있다.
* 분해한 것을 청크라고 부른다.
다양한 요청과 응답 방식
> 여러 데이터를 보내는 멀티파트
메일의 경우에는 메일의 본문이나 복수의 첨부 파일을 붙여서 함께 보낼 수 있다.
이것은 MIME(Multipurpose Internet Mail Extensions : 다목적 인터넷 메일 확장 사양)으로 불리는 메일로, 텍스트나 영상, 이미와 같은 여러 다른 데이터를 다루기 위한 기능을 사용한다.
멀티파트는 여러 다른 종류의 데이터를 수용할 수 있다.
HTTP도 멀티파트에 대응하고 있어, 하나의 메시지 바디 내부에 엔티티를 여러개 포함시켜 보낼 수 있다.
주로 이미지나 텍스트 파일 등을 업로드할 때 사용하고 있다.
멀티 파트에는 다음과 같은 것이 있다.
- multipart/form-data
Web 폼으로부터 파일 업로드에 사용된다.
- multipart/byteranges
상태 코드 206 리스폰스 메시지가 복수 범위의 내용을 포함하는 때에 사용된다.
HTTP 메시지로 멀티파트를 사용할 때에는 Content-type 헤더 필드를 사용한다.
멀티파트 각각의 엔티티를 구분하기 위해 "boundary" 문자열을 삽입한다. 또한 멀티파트는 파트마다 헤더 필드가 포함된다.
> 일부만 받는 레인지 리퀘스트
예전에는 다운로드 중에 커넥션이 끊어지게 되면 처음부터 다시 다운로드를 해야 했기 때문에, 대용량의 이미지와 데이터를 다운로드하기가 힘들었다.
리러한 문제를 해결하기 위해서 일반적인 리줌(Resume)이라는 기능이 필요하게 되었다.
리줌을 통해 이전에 다운로드를 한 곳에서부터 다운로드를 재개할 수 있다.
이 기능을 실현하기 위해서는 "엔티티의 범위를 지정하여" 리퀘스트를 해야하는데, 이것을 "레인지 리퀘스트"라고 부른다.
이 때 범위는 전체 10,000 바이트 정도의 크기에서 5,001~10,000범위만을 리퀘스트할 수 있다.
리퀘스트할 때에는 Range 헤더 필드를 사용하여 리소스 바이트 레인지를 지정한다.
레인지 리퀘스트에 대한 리스폰스는 상태코드 206이라는 메시지가 되돌아오며,
레인지 리퀘스트를 지원하지 않는 경우에는 상태 코드 200 OK라는 리스폰트 메시지로 완전한 엔티티가 되돌아온다.
> 최적의 콘텐츠를 돌려주는 콘텐츠 네고시에이션
같은 콘텐츠(내용)이고 같은 URI로 접근할 수 있지만 여러 개의 페이지를 지닌 웹 페이지가 있다.
예) 구글이지만, 영어판과 한국어판 페이지로 나뉨
콘텐츠 네고시에이션이란 클라이언트와 서버가 제공하는 리소스의 내용에 대해서 교섭하는 것이다.
클라이언트에 더욱 적합한 리소스를 제공하기 위한 구조이다.
다음과 같은 종류들이 있다.
1. 서버 구동형 네고시에이션(Server-driven Negotiation)
서버 측에서 리퀘스트 헤더 필드의 정보를 참고하여 자동적으로 처리를 하는 것이다.
단지, 브라우저가 보내는 정보를 근거로 하기 때문에 유저에게 정말로 적절한 것이 선택되었다고 할 수 없다.
2. 에이전트 구동형 네고시에이션(Agent-driven Negotiation)
클라이언트 측에서 콘텐츠 네고시에이션을 하는 방식으로, 브라우저에 표시된 선택지 중에서 유저가 수동으로 선택한다.
예를 들어, OS의 종류나 브라우저의 종류 등에 의해서 PC용과 스마트폰용의 웹 페이지르 자동으로 전환하는 것이 이에 해당한다.