리퀘스트와 리스폰스의 동작
리퀘스트 메시지 : 리퀘스트 라인 + 리퀘스트 헤더 필드 + 일반 헤더 필드 + 엔티티 헤더 필드 + 그외
리스폰스 메시지 : 상태 라인 + 리스폰스 헤더 필드 + 일반 헤더 필드 + 엔티티 헤더 필드 + 그외
- 메시지 : HTTP 통신의 기본 단위. 옥텟 시퀀스(8비트)로 구성되며 통신을 통해 전송된다.
- 엔티티 : 리퀘스트와 리스폰스의 페이로드로 전송되는 정보.
- HTTP 메시지 바디
: 리퀘스트와 리스폰스에 관한 엔티티 바디를 운반
: 전송 코딩이 적용되면 메시지 바디와 엔티티 바디의 내용이 달라진다.
인코딩을 하면 다량의 액세스를 효율 좋게 처리할 수 있기 때문에 전송 효율이 좋다.
단, CPU 등 리소스 소모는 더 크다.
콘텐츠 코딩
: 엔티티에 적용되는 인코딩
: 엔티티 정보를 유지한 채로 압축해서 송신하고, 수신 측에서 엔티티를 디코딩한다.
: gzip, compress, deflate, identity 등
청크 전송 코딩
: 엔티티 바디를 청크로 분할하는 인코딩
: 다음 청크 사이즈를 16진수로 표시
: 수신한 클라이언트에서 원래의 엔티티 바디로 디코딩한다.
MIME (Multipurpose Internet Mail Extensions. 다목적 인터넷 메일 확장 사양)
: 메일에 텍스트, 영상, 이미지 등 여러 데이터가 포함된 경우.
: 바이너리 데이터를 문자열에 인코딩하는 등의 방법으로 멀티 파트(여러 종류의 데이터)를 수용한다.
HTTP의 멀티파트 대응
: 메시지 바디 내부에 여러 엔티티를 포함시킨다.
: Content-type 헤더 필드를 사용한다.
: 멀티 파트 각각의 엔티티를 구분하기 위해 boundary 문자열을 사용하며, 파트마다 헤더 필드가 포함된다.
: 파트 내부에 멀티파트가 포함될 수도 있다.
멀티파트의 종류
(1) multipart/form-data
: web 폼으로부터 파일 업로드에 사용
(2) multipart/byteranges
: 상태 코드 206 리스폰스 메시지가 복수 범위의 내용을 포함하는 경우
다운로드 중 커넥션이 끊어졌을 때, 처음부터 다시 다운로드해야 하는 문제를 해결하기 위해 리줌(resume) 기능 사용
레인지 리퀘스트 (range request)
: 이전에 다운로드하던 곳을 기억하기 위해, 엔티티의 범위를 지정해서 리퀘스트 한다.
: Range 헤더 필드를 사용, 리소스의 바이트 레인지를 지정한다.
레인지 리퀘스트의 리스폰스
: 상태코드 206의 리스폰스 메시지를 돌려 받는다.
: 복수 범위의 레인지 리퀘스트의 경우, multipart/byteranges 리스폰스를 받는다.
: 서버가 레인지 리퀘스트를 지원하지 않는 경우, 상태 코드 200 메시지와 함께 완전한 엔티티가 돌아온다.
콘텐츠 네고시에이션 (Content Negotiation)
: 한 사이트에 영어판과 한국어판이 존재하는 것처럼, 같은 콘텐츠지만 여러 페이지를 갖는 웹 페이지
: 클라이언트와 서버가 제공하는 리소스의 내용에 대해 교섭하여, 클라이언트에게 더 적합한 리소스를 제공한다.
: 언어, 문자 세트, 인코딩 방식을 기준으로 리소스를 판단한다.
콘텐츠 네고시에이션의 종류
(1) 서버 구동형 네고시에이션 (Server-driven Negotiation)
: 서버 측에서 리퀘스트 헤더 필드의 정보를 참고하여 자동으로 처리한다.
: 브라우저에서 보내는 정보를 기반으로 하기에, 정말로 클라이언트에게 적합한지 알 수 없다.
(2) 에이전트 구동형 네고시에이션 (Agent-driven Negotiation)
: 클라이언트 측에서 브라우저에 표시된 선택지를 수동으로 선택하여 처리한다.
: JS를 이용, OS 종류, 브라우저의 종류에 따라 웹 페이지가 자동으로 전환되는 경우에 해당한다.
(3) 트랜스페어런트 네고시에이션 (Transparent Negotiation)
: 서버 구동형 + 에이전트 구동형
: 서버와 클라이언트가 각각 처리한다.