
HTTP 클라이언트가 전송하는 메시지의 형식은 다음과 같다. 클라이언트는 임의의 호스트이며, HTTP 서버는 www.httpstudy.com이라 가정한다.
출처 : https://eunhyejung.github.io/network,server/2018/09/19/Http-Concept.html
GET : 요청문(Request Line)의 요청 메서드
/content1.html : URL
HTTP/1.1 : HTTP 버전
Host
클라이언트가 요청하는 자원이 있는 서버의 주소
Connection
클라이언트와 서버 간의 연결 유지 여부 제어.
- 주요 옵션
- Keep-Alive
Connection 헤더의 값으로 Keep-Alive를 설정하면 클라이언트와 서버 간의 TCP 연결을 재사용할 것임을 지정한다. 이는 동일한 호스트에 대한 여러 요청이 있을 때 연결 지연을 줄여준다. HTTP/1.1에서는 기본적으로 Keep-Alive가 활성화되어 있다.
- Close
Connection 헤더의 값으로 Close를 설정하면 현재 TCP 연결을 요청이나 응답 후에 닫을 것임을 지정한다. 이는 서버가 요청을 처리한 후 연결을 끊고자 할 때 사용된다. HTTP/1.0에서는 기본적으로 해당 헤더를 사용하여 요청 후에 연결을 닫았지만, HTTP/1.1에서는 Keep-Alive가 기본이므로 Close를 명시적으로 지정해야 연결이 닫힌다.
- Upgrade
Connection 헤더의 값으로 Upgrade를 설정하면 클라이언트와 서버 간의 프로토콜 업그레이드를 요청한다. 이는 보통 HTTP/1.1에서 WebSocket 등의 프로토콜로 전환할 때 사용된다
User-Agent
클라이언트의 소프트웨어(웹 브라우저)의 정보를 나타낸다. 이를 통해 서버는 요청을 보낸 소프트웨어나 디바이스를 식별할 수 있다.
Accept
클라이언트가 서버로부터 어떤 종류의 콘텐츠를 받아들일 수 있는지를 나타낸다. 이는 MIME 타입으로 표시된다.
Accept-Language
클라이언트가 지원하는 언어를 나타낸다. 서버는 해당 정보를 사용하여 적절한 언어로 응답을 반환할 수 있다.
Accept-Encoding
클라이언트가 서버로부터 받을 수 있는 콘텐츠 인코딩(압축) 방법을 지정한다. 서버는 이를 고려하여 적절한 압축 방법을 선택하여 응답을 압축한다. 이를 통해 대역폭을 절약하고 웹 페이지의 성능을 향상시킬 수 있다.
- 주요 옵션
- gzip
GNU zip 알고리즘을 사용하여 데이터를 압축한다. 해당 옵션은 가장 많이 사용되고 흔한 압축 방법이다.
- deflate
zlib 알고리즘을 사용하여 데이터를 압축한다. 해당 옵션은 더 이상 권장되지는 않으며, 대부분의 클라이언트와 서버가 gzip을 사용한다.
- br
Brotli 알고리즘을 사용하여 데이터를 압축한다. Brotli는 gzip보다 더 효율적인 압축을 제공하므로 최신 브라우저들이 더 선호하는 형식 중 하나이다.
Content-Length
본문의 크기를 바이트 단위로 나타낸 것이다.
If-Modified-Since
클라이언트가 서버로부터 리소스를 요청할 때, 클라이언트는 이전에 받았던 리소스의 마지막 수정 날짜를 "If-Modified-Since" 헤더에 포함하여 서버에게 전달한다. 서버는 해당 헤더에 포함된 날짜와 요청된 리소스의 실제 수정 날짜를 비교하여, 리소스가 해당 날짜 이후에 수정되었는지를 확인한다.
만약 리소스가 지정된 날짜 이후에 수정되지 않았다면, 서버는 HTTP 상태 코드 304 (Not Modified)를 반환하고 응답 본문을 보내지 않는다. 클라이언트는 이 경우에 로컬 캐시에 있는 리소스를 사용하여 페이지를 렌더링하므로, 네트워크 대역폭을 절약하고 페이지 로딩 속도를 향상시킬 수 있다.
주로 정적인 콘텐츠(예: HTML 파일, 이미지, 스타일 시트 등)를 요청할 때 캐시 효율을 높이는 데 사용된다.
- 이 외 주요 Request Header
- Referer
현재 요청을 보내기 전에 클라이언트가 어디에서 왔는지를 나타낸다. 보통 이전 페이지의 URL을 나타낸다.
- Cookie
클라이언트가 이전 요청에서 서버로부터 받은 쿠키 정보를 나타낸다. 이를 통해 사용자의 상태나 세션 정보를 유지할 수 있다.
- Authorization
클라이언트가 서버에 접근할 때 사용하는 인증 정보를 포함한다. 보안 접근에 사용된다.
이전 클라이언트의 요청에 따라 다음과 같이 /content1.html 파일의 내용을 Response Body에 담아 응답한다.
출처 : https://eunhyejung.github.io/network,server/2018/09/19/Http-Concept.html
HTTP/1.1 : HTTP 버전
200 : 상태 코드
OK : 상태 이름
Date
서버가 응답을 보낸 시간을 나타낸다. 해당 헤더를 통해 클라이언트는 서버가 응답을 보낸 시간을 알 수
있다.
Server
클라이언트에게 해당 응답을 제공하는 서버를 나타낸다.
Last-Modified
응답 본문의 마지막 수정 날짜를 나타낸다. 클라이언트는 해당 값을 사용하여 캐시된 리소스가 변경되었는지를 확인한다.
Content-Encoding
응답 본문의 압축 방식을 나타낸다. 예를 들어, "gzip"은 GNU zip 알고리즘을 사용한 압축을 나타낸다.
Content-Type
응답 본문의 콘텐츠 타입을 MIME 방식으로 나타낸다. 예를 들어, "text/html"은 HTML 문서를 나타내고, "image/jpeg"는 JPEG 이미지를 나타낸다.
- 일반적으로 사용되는 MIME 타입
- text/plain: 일반 텍스트 문서
- text/html: HTML 문서
- image/jpeg: JPEG 이미지
- image/png: PNG 이미지
- application/json: JSON 데이터
- application/xml: XML 데이터
- application/pdf: PDF 문서
Keep-Alive
Keep-Alive 연결의 유지 시간과 최대 요청 횟수를 설정한다.
- timeout=5
해당 매개변수는 Keep-Alive 연결을 유지하는 시간을 초 단위로 지정한다. 즉, 클라이언트가 서버에게 마지막 요청을 보낸 후에도 연결을 유지한 상태로 유지되는 시간이 5초이다. 이 시간이 경과하면 서버는 Keep-Alive 연결을 닫을 수 있다.
- max=100
해당 매개변수는 Keep-Alive 연결에서 처리할 수 있는 최대 요청 횟수를 지정한다. 즉, 클라이언트와 서버 간의 한 번의 TCP 연결에서 처리할 수 있는 최대 요청 횟수는 100번입니다. 해당 값을 설정하여 너무 오랫동안 열려 있는 연결을 방지하고 서버 부하를 분산시킬 수 있다.
- 이 외 주요 Response Header
- Location
리다이렉션된 리소스의 위치를 나타낸다. 해당 헤더는 주로 3xx 상태 코드 응답에서 사용된다.
- Set-Cookie
서버측에서 클라이언트에게 세션 쿠키 정보를 설정한다. 이를 통해 세션 상태를 유지하거나 사용자를 추적할 수 있다.
- Cache-Control
클라이언트와 중간 캐시 서버에게 캐싱 동작을 지시한다.
- public
리소스가 공유 캐시에 저장될 수 있음을 나타낸다. 이는 중간 프록시 서버와 같은 공용 캐시에서 리소스를 캐시할 수 있음을 의미한다.
- private
리소스가 개인 캐시에만 저장될 수 있음을 나타낸다. 이는 브라우저와 같은 개인 사용자 캐시에서만 리소스를 캐시할 수 있음을 의미한다.
- no-cache
클라이언트는 캐시된 리소스를 사용하기 전에 항상 서버에 확인을 요청해야 함을 나타낸다. 캐시된 리소스를 즉시 사용하지 않고, 항상 서버에 재검증을 요청해야한다.
- no-store
리소스를 캐시하지 말아야 함을 나타낸다. 클라이언트 및 중간 캐시는 리소스를 저장해서는 안 된다.
- max-age=
캐시된 리소스의 최대 유효 기간을 지정한다. 이는 리소스가 캐시에서 만료되기 전에 얼마 동안 캐시될 수 있는지를 나타낸다.
- s-maxage=
max-age와 유사하지만, max-age는 주로 개인 캐시 (ex. 브라우저 캐시)에 대한 지시이고, s-maxage는 공유 캐시 (ex. CDN 또는 프록시 서버)에 대한 지시이다. 따라서 s-maxage가 설정된 경우, 중간 프록시 서버에서만 해당 지정된 유효 기간을 사용하여 리소스를 캐시할 수 있다.
- Expires
해당 리소스의 만료 날짜와 시간을 나타낸다. 해당 헤더는 특정 리소스가 언제 더 이상 유효하지 않고 캐시에서 삭제해야 하는지를 명시한다.
텔넷 프로그램을 통해 HTTP 통신이 어떻게 이루어지는지 다음 그림을 통해 확인할 수 있다.
출처 : ⌜쉽게 배우는 데이터 통신과 컴퓨터 네트워크⌟, 437p, 그림 13-7
텔넷 명령으로 80번 포트로 TCP 접속을 시도한다.
80번 포트로 대기하고 있던 HTTP 서버와 연결된다.
HTTP 서버는 클라이언트의 요청을 기다리고, 사용자가 요청 메시지를 입력한다.
요청 메시지를 수신한 HTTP 서버는 응답 메시지를 회신하고 HTTP 동작을 완료한다.