0. HTTP 메시지
HTTP에서 교환하는 정보는 HTTP 메시지라고 불립니다. 리퀘스트 측 HTTP 메시지를 리퀘스트 메시지, 리스폰스 측 메시지는 리퀘스트 메시지라고 부릅니다.
HTTP 메시지는 크게 메시지 헤더와 메시지 바디로 나눌 수 있습니다. 이 두개는 최초에 나타나는 개행 문자(CR+LF)로 메시지 헤더와 메시지 바디를 구분합니다.
- 메시지 헤더
서버와 클라이언트가 꼭 처리해야 하는 리퀘스트와 리스폰스 내용과 속성 등이 작성되어 있다 - CR+LF
CR(carriage return : 16진수 0x0d)
LF(line feed : 16진수 0x0a) - 메시지 바디
꼭 전송되는 데이터
CR과 LF는 타자기에서 쓰이던 방식으로 LF는 종리를 한 라인 위로 올리는 키였고, CR은 타자기 커서를 맨 앞으로 옮기는 키였다.
그래서 CR+LF는 종이를 한 라인 위로 올리기 때문에 다음 줄에 작성하게 되고, 커서는 앞으로 옮겨 다음 줄 맨 앞에 작성하게 된다.
- 리퀘스트 라인
리퀘스트에 사용하는 메소드와 리퀘스트 URI와 사용하는 HTTP 버전이 포함됩니다. - 상태 라인
리스폰스 결과를 나타내는 상태 코드와 설명, 사용하는 HTTP 버전이 포함되어 있습니다. - 헤더 필드
리퀘스트와 리스폰스의 여러 조건과 속성 등을 나타내는 각종 헤더 필드가 포함되어 있습니다.
1. 인코딩
인코딩이라는 단어는 한번쯤 들어봤을 단어입니다. 하지만 인코딩이 정확히 무엇을 하는지 알지는 못하죠. 간단히 말하면 효율을 높이는 작업이라고 생각하시면 됩니다. HTTP에서는 전송 효율을 높이기 위해서 데이터를 변환하여 보냅니다.
압축해서 보내기
메일을 보낼때 zip 파일로 압축해서 보내는 경우가 있습니다. HTTP도 마찬가지로 압축하는 기능을 콘텐츠 코딩(Content Coding)라고 부릅니다. 콘텐츠 코딩은 엔티티에 적용하는 인코딩을 가리키는데 엔티티 정보를 유지한채로 압축합니다. 클아이언트가 수신을 받게 되면 디코딩을 하게됩니다.
엔티티(entity) : 리퀘스트랑 리스폰스의 페이로드(payload, 부가물)로 전종되는 정보, 헤더필드와 엔티티 바디로 구성됨
분해해서 보내기
사이즈가 큰 데이터를 전송할 때에는 데이터를 분할해서 보낼 수 있습니다. 엔티티 바디를 분해해서 보내는 기능을 청크 전송 코딩(Chunked transfer Coding)라고 부릅니다.
2. 여러 데이터를 보내는 멀티파트
메일의 경우에는 메일의 본문이나 복수의 첨부 파일을 포함해 보낼 수 있습니다. 이것은 MIME(Multipurpose Internet Mail Extensions)으로 불리는 메일로 여러 데이터를 다루기 위한 기능을 사용하고 있습니다.
HTTP도 멀티파트에 대응하고 있어 하나의 메시지 바디 내부에 엔티티를 여러 개 포함시킬 수 있습니다. 주로 이미지나 텍스트 파일 등을 업로드할 때 사용되고 있습니다.
- mulitpart/form-data
Web 폼으로부터 파일 업로드에 사용됩니다
- multipart/byteranges
상태 코드 206(Partial Content) 리스폰스 메시지가 복수 범위의 내용을 포함하는 때에 사용됩니다.
HTTP 메시지로 멀티파트를 사용할 때에는 Content-type 헤더 필드를 사용합니다. 그리고 멀티파트 각각의 엔티티를 구분하기 위해 "boundary" 문자열을 사용합니다. 엔티티 선두에는 "--"를 입력해 구분합니다. 위에 나오는 "--AaB03x", "--THIS_STRING_SEPARATES"이 선두 부분이고 마지막에는 끝에 "--"를 붙여 끝내줍니다.
3. 레인지 리퀘스트
네트워크가 불안전하고 속도가 느려서 웹 페이지가 잘 안나오거나 이미지가 잘려서 나오는 경험을 해보셨나요? 한번쯤은 있을 것이라고 생각합니다. 만약 끊겼다면 끊긴 지점부터 다시 데이터를 받아와야 합니다. 이런 기능을 해주는 것이 리줌(resume) 기능입니다.
이 기능을 실현하기 위해서는 끊긴 엔티티부터 다시 다운로드 하거나 범위를 지정해서 다운받아야 합니다. 그때 쓰이는 것이 레인지 리퀘스트(Range Request)라고 부릅니다.
- 300~500 바이트
Range: bytes=300~500
- 501바이트 이상
Range: bytes = 501-
- 처음부터 300 바이트, 그리고 400~600바이트
Range: bytes=-300, 400~600
5. 콘텐츠 네고시에이션(Content Negotiation)
더 많은 정보를 얻기 위해 영어로 검색할 때가 있습니다. 한글로 검색할 때보다 더 많은 정보를 얻을 수 있죠. 그때 구글 검색창을 보면 아래와 같은 안내문이 나옵니다. 하지만 오른쪽 검색 결과는 완전히 영어로 나옵니다. 이렇게 사용자에게 더 좋은 검색 결과를 표시하기 위해 상황에 따라, 검색어에 따라 콘텐츠를 바꿔서 보여줍니다.
콘텐츠 네고시에이션은 클라이언트와 서버간에 콘텐츠 협상을 한다는 의미인데 이것은 더 좋은 정보를 제공하기 위해서 협상하게 됩니다. 협상 기준은 제공하는 리소스 언어와 문자 세트, 인코딩 방식 등을 기준으로 판단하게 됩니다.
서버 구동형 네고시에이션(Server-driven Negotiation)
서버 측에서 콘텐츠 네고시에이션을 하는 방식입니다. 리퀘스트 헤더 필드 정보를 바탕으로 처리합니다. 단순 브라우저가 보내는 정보를 바탕으로 하기 때문에 정확하지 않을 수 있습니다. 예를 들어, 외국에서 사는 한국인이 한글로 검색할 때 문제가 될 수 있습니다.
에이전트 구동형 네고시에이션(Agent-driven Negotiation)
클라이언트 측에서 콘텐츠 네고시에이션을 하는 방식입니다. JavaScript 등을 사용해서 웹 페이지에서 자동으로 정하는 것도 있습니다. 예를 들면, PC용과 스마트폰용 웹 페이지를 자동으로 전환해 주는 것이 이것에 해당합니다.
트랜스페어런트 네고시에이션(Transparent Negotiation)
서버 구동형과 에이전트 구동형을 혼합한 것으로 각각 네고시에이션 하는 방식입니다.
'study > network' 카테고리의 다른 글
2. HTTP 프로토콜이란 (0) | 2020.06.22 |
---|---|
1.4 IP, TCP, DNS 그리고 URI와 UR (0) | 2020.04.21 |
1.3 네트워크의 TCP/IP (0) | 2020.04.14 |
1.2 웹과 HTTP 탄생 배경 (0) | 2020.04.06 |
1.1 웹 HTTP로 나타낸다 (0) | 2020.04.06 |
댓글