이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
문제 상황
-
일반적으로 클라이언트 -> 서버로 요청 시
-
문서 전체를 응답하거나 아예 응답하지 않거나 All or Nothing으로 응답한다.
-
하지만 특정 범위만 요구해야할 필요가 있을 수 있다.
-
예를 들어보자.
파일을 다운로드 받는데 1분이 필요하다 가정을 해보자.
유저가 59초동안 다운을 받다가
네트워크 커넥션의 장애로 인해 중간에 연결이 끊겼다.
그렇다면 다시 1분을 소요하여 다운받는게 합리적일까?
그렇지 않다.
1초동안 받지 못한 데이터에 대해서만 받는게
가장 합리적이다.
-
이런 상황에서 보다 합리적인 요청을 위해서
-
HTTP는 클라이언트가 문서의 일부분이나 특정 범위만 요청할 수 있도록 해준다.
범위 요청 (Range Request)
클라이언트
-
클라이언트가 특정 범위에 대해 요청을 보낼 때
-
Range 헤더를 사용하여 요청 메시지를 구성한다.
GET /bigfile.html HTTP/1.1
Range: bytes=20224- --> 20224 바이트 이후에 대해 다시 요청한다.
-
참고로 문서의 크기를
-
클라이언트 입장에서는 정확하게 모르기 때문에
-
몇 바이트까지 요구하는지는 명시하지 않는다.
Range 헤더의 또다른 용도
-
Range 헤더는 여러 범위로 요청을 하기 위해 사용될 수 있다.
-
각 범위는 순서 없이 정해지며 서로 겹칠 수도 있다.
어떤 문서에 대한 다운로드 시간을 줄이기 위해
동시에 여러 서버에 접속해서 같은 문서에 대해 서로 다른 범위를 요청할 수 있다.
서버
-
범위 요청을 받은 서버는 그에 맞는 응답을 해야한다.
-
그러나 모든 서버가 범위 요청을 처리할 수 있는 것은 아니다.
-
그렇기 때문에 서버는 클라이언트에게 자신이 범위 요청을 처리할 수 있는지
-
응답에 Accept-Range 헤더를 포함시켜 알려줄 수 있다.
-
이 헤더의 값 측정 단위는 주로 byte이다.
-
만약 범위 요청을 처리할 수 있는 서버라면
-
다음과 같은 범위 응답 메시지를 구성하여 응답한다.
HTTP/1.1 200 OK
Content-Range: bytes=20224- --> 20224 바이트 이후에 대해 응답한다.
Example
- 지금까지 알아본 개념을 복습해보자.
Summary
-
(필자 기준으로) HTTP에서 특정 범위 요청을 지원하는지 몰랐다.
-
그 점이 이 글을 쓰게 된 이유이기도 하다.
-
HTTP가 지원하는 특정 범위 요청(Range Request) 개념을 이해하고
-
HTTP 통신 메시지를 주고 받을 때
-
Range 혹은 Content-Range 헤더를 보고
-
이 헤더가 뭐지? 가 아닌
-
현재 범위 요청을 주고 받고 있는 상황이구나 라고
-
주어진 상황을 정확하게 해석할 수 있는 눈을 기르도록 하자.