[HTTP] 3. HTTP 요청 메시지 (Request)

반응형

 

 

HTTP 메시지

HTTP 메시지에는 요청(request) 메시지 와 응답(response) 메시지가 있다.

(좌) HTTP 요청 메시지 (우) HTTP 응답 메시지

 

 

HTTP 요청 메시지 (request)

요청 메시지는 1행의 리퀘스트 라인, 여러 HTTP 헤더로 구성된 메시지 헤더, 공백, 메시지 바디 로 구성된다.

리퀘스트의 헤더는 리퀘스트 헤더, 일반 헤더, 엔티티 헤더, 기타 헤더 의 4개 HTTP 헤더 중 하나로 구성되어 있고 어떤 HTTP 헤더로 구성되는지는 웹브라우저에 따라 다르다.

헤더는 '<field-name>:<field-value>' 으로 구성된다

 

 

1. start line 스타트 라인 (요청메시지: request line 리퀘스트 라인)

클라이언트가 서버에 처리를 요청하기 위한 행이다. 요청 메시지에만 존재하는 행이다.

 

1.1. method (메소드)

리퀘스트(요청) 의 종류를 나타낸다. 

GET /search?q=네트워크&hl=ko HTTP/1.1
Host: www.google.com

 

◾메소드 종류

메소드 내용 버전
GET 서버로부터 데이터 취득 HTTP/0.9~
POST 서버로 데이터 전송 HTTP/1.0~
PUT 서버로 로컬 데이터 전송 HTTP/1.1~
PATCH 리소스의 부분 수정 HTTP/1.1~
DELETE 특정 리소스 삭제 HTTP/1.1~
HEAD 메시지 헤더만 취득 HTTP/1.0~
OPTIONS 서버가 지원하는 메소드나 옵션을 확인 HTTP/1.1~
TRACE 서버로의 경로 확인 HTTP/1.1~
CONNECT 프록시 서버에 터널링 요청 HTTP/1.1~

 

 

1.2. request URI (리퀘스트 URI)

리소스 식별자를 나타낸다. URI 포맷에는 리소스에 액세스하기 위해 필요한 정보를 모두 기술하는 절대 URI , 기준이 되는 URI 로부터의 상대적인 위치를 나타내는 상대 URI 가 있다.

 

◾절대 경로 (Absolute-path[?query]) : "/" 으로 시작하는 경로

GET /search?q=네트워크&hl=ko HTTP/1.1
Host: www.google.com

 

1.3. HTTP version (HTTP 버전)

HTTP 버전을 나타낸다.

GET /search?q=네트워크&hl=ko HTTP/1.1
Host: www.google.com

 

 

2. 메시지 헤더 (message header)

 

2.1. 리퀘스트 헤더 (Request Header)

메시지 헤더 중에서도 리퀘스트 메시지를 제어하기 위한 헤더를 리퀘스트 헤더라 한다.

 

◾RFC2616에 정의된 리퀘스트 헤더

헤더 설명
Accept 텍스트 파일이나 동영상 파일 등 웹브라우저가 받을 수 있는 미디어 타입
Accept-Charset Unicode 나 ISO 등 웹브라우저가 처리할 수 있는 문자열
Accept-Encoding gzip , compress 등 웹브라우저가 처리할 수 있는 메시지 바디 압축 타입
Accept-Language 웹브라우저가 처리할 수 있는 언어셋
Expect 송신하는 리퀘스트의 메시지 바디가 클 때, 서버가 받을 수 있는지 확인
From 사용자의 메일 주소, 연락처를 전달하기 위해 사용
Host 웹브라우저가 요청하는 웹서버의 도메인 이름 (FQDN) 과 포트번호
HTTP/1.1 에서 필수 항목 헤더
* FQDN (Fully Qualified Domain Name) : 전체 주소 도메인 이름
Referer 직전에 링크되었던 URL
(예) 구글에서 검색했을 경우, https://www.google.com/ 
→ 웹서버의 액세스 로그에 기록/분석하여 세일즈 프로모션등의 전략 수립 가능
User-Agent 웹브라우저 정보
사용자의 환경을 나타내는 헤더
→ 사용자가 이용하는 웹브라우저의 종류, 버전, OS 등을 분석하여 웹사이트의 콘텐츠를 최적화 하는데 이용 가능

※ 참고로 Referer , User-Agent 등의 헤더를 곧이곧대로 믿는 것은 위험하다. 각종 디버깅 도구나, 웹브라우저 확장 기능으로 간단하게 변조가능한 데이터이기 때문이다. 따라서 참고로 이용하는 것이 좋다.

 

위에 기술된 이외의 헤더도 존재한다.

 

 

2.2 일반 헤더 (General Header)

리퀘스트 메시지, 리스폰스 메시지 모두에서 범용으로 사용하는 헤더

 

◾RFC2616에 정의된 일반 헤더

헤더 내용
Cache-Control 웹브라우저에 일시적으로 보존하는 캐시 제어, 캐시를 하지 않는 또한 캐시를 하는 시간을 설정할 수 있음
프라이빗 캐시(private cache) : 주로 웹브라우저에 저장
공유 캐시(shared cache) : 프록시 서버나 CDN의 에지 서버에 저장
Connection
(Keep-Alive)
keep-alive (지속적 연결) 를 제어하는 헤더
keep-alive 에 대응하는 것을 알리고, TCP 커넥션을 클로즈할 때 사용
브라우저가 keep-alive 설정하여 요청하면, 웹서버도 마찬가지로 keep-alive 를 설정하여 응답한다.
Date HTTP 메시지를 생성한 일시
Pragma 캐시에 관해 HTTP/1.0 과의 하위 호환성을 목적으로 사용
Trailer 메시지 바디의 뒤에 기술하는 HTTP 헤더를 알림. 청크(chunk) 전송 인코딩을 사용할 때 사용 가능
Transfer-Encoding 메시지 바디의 전송 코딩 타입
Upgrade 다른 프로토콜 또는 다른 버전으로 전환
Via 경유한 프록시 서버를 추가로 기술. 루프 회피를 목적으로 사용
Warning HTTP 메시지에 반영되지 않은 스테이터스나 메시지의 변화에 관한 추가 정보

 위에 기술된 이외의 헤더도 존재한다.

 

 

2.3. 엔티티 헤더 (Entity Header)

리퀘스트 메시지와 리스폰스 메시지에 포함되는 메시지 바디에 관련한 제어 정보를 포함하는 헤더

 

◾RFC2616에 정의된 엔티티 헤더

헤더 내용
Allow 서버가 클라이언트에게 대응하는 메소드를 알림
Content-Encoding 서버가 실행한 메시지 바디의 압축 타입
Content-Language 메시지 바디에 사용된 언어셋
Content-Length 메시지 바디 크기. 바이트 단위
HTTP/1.1 에서는 Keep-Alive 으로 하나의 커넥션를 사용하는 경우가 있기 때문에 반드시 TCP 커넥션이 클로즈 된다고 단언할 수 없다. 따라서 Content-Length 로 메시지길이를 확인해줘야 한다. 
Content-Location 메시디 바디의 URI
Content-Type 텍스트 파일이나 이미지 파일 등 메시지 바디의 미디어 타입
Expires 리소스의 유효기간 일시
Last-Modified 리소스가 가장 마지막으로 업데이트 된 일시

 위에 기술된 이외의 헤더도 존재한다.

 

 

2.4. 기타 헤더

주요한 헤더로 분류되지는 않지만, 자주 사용하는 헤더

 

◾기타 헤더

헤더 내용
Set-Cookie 서버가 세션 관리에 사용하는 세선 ID나 사용자 개별 설정 등을 웹브라우저로 전송
웹브라우저가 로그인에 성공하면 서버는 세션 ID 를 발행하고 Set-Cookie 헤더에 설정해서 응답. 그뒤 요청은 Cookie 헤더에 세션 ID를 설정해서 수행한다.
Cookie 웹브라우저가 Set-Cookie 를 통해 주어진 Cookie 정보를 서버에 전송
X-Forwarded-For 부하 분산 장치로 NAPT 되는 환경에서 변환 전의 IP 주소를 저장
어느 IP 주소로부터 액세스되었는지 특정할 수 있다.
X-Forwarded-Proto 클라이언트가 사용하고 있는 프로토콜을 저장.
부하 분산 장치에서 SSL 오프로드하는 환경 등에서, 원 프로토콜(HTTP 또는 HTTPS) 를 특정할 때 사용

※ Cookie (쿠키) : HTTP 헤더와의 통신에서 특정한 정보를 브라우저에 저장시키는 구조 및 저장한 파일. 웹브라우저상에서 FQDN별로 관리된다.

 

 

3. CRLF 공백 (\r\n)

 

4. 메시지 바디 (message body)

실제로 보내는 데이터가 들어있는 필드이다. 메시지 바디는 옵션사항이므로 메소드에 따라 있거나 없을 수 있다.

 

 

 

정리

위의 내용은 HTTP/1.1 의 HTTP 메시지이다.

HTTP/1.1 은 헤더와 메시지 바디를 줄바꿈 (CRLF) 로 구분한 텍스트 형식의 메시지 단위로 TCP 커넥션으로 보낸다. 텍스트형식은 사람이 이해하기 쉽지만, 컴퓨터는 바이너리 형식으로 변환 처리가 필요하다.

 

 

 

HTTP/2 의 메시지 포맷

HTTP/2 는 메시지 헤더를 HEADERS 프레임 (HEADERS frame) 에, 메시지 바디를 DATA 프레임 (DATA frame) 에 각각 분할해서 저장하고 바이너리 형식의 프레임 단위로 스트림에 보낸다. 그때 프레임에 스트림을 식별하는 스트림 ID (stream ID) 를 부여한다. 즉 바이너리 형식이므로 변환 처리가 필요없어진다. 이렇게 하면 헤더를 압축할 수 있고(헤더압축), 스트림 여러개를 하나로 묶을 수 있게 된다.(멀티플렉싱)

 

1. HEADERS frame 헤더 프레임

HTTP/2 는 바이너리 형식으로 변경되면서 요청 메시지의 리퀘스트 라인도 헤더로 취급한다.  

HTTP/1.1 의 리퀘스트 라인을 다음과 같이 저장한 뒤 HEADERS 프레임으로 송신한다.

  • 메소드 →  :method
  • 리퀘스트 URI →  :path
  • HTTP 버전 → :version

 

◾HTTP/2 의 리퀘스트 메시지 포맷

반응형