[HTTP] 4. HTTP 응답 메시지 (Response)

반응형

HTTP 메시지

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

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

 

HTTP 응답 메시지 (response)

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

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

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

 

 

1. start line 스타트 라인 (응답메시지: status line 스테이터스 라인)

웹서버가 웹 브라우저(클라이언트)에 대해 처리 결과를 반환하는 행이다.

 

1.1. HTTP version (HTTP 버전)

HTTP 버전을 나타낸다.

HTTP/1.1 200 OK
HTTP/1.1 404 Not Found

 

 

1.2. status code (스테이터스 코드)

처리 결과를 나타내는 코드

HTTP/1.1 200 OK
HTTP/1.1 404 Not Found

 

1.3. reason phrase (리즌 프레이즈)

처리 결과의 이유

HTTP/1.1 200 OK
HTTP/1.1 404 Not Found

 

◾대표적인 스테이터스 코드와 리즌 프레이즈

  클래스 스테이터스 코드 리즌 프레이즈 설명
1xx Informational 100 Continue 클라이언트는 리퀘스트를 계속할 수 있다.
101 Switching Protocols Upgrade 헤더를 사용해 프로토콜 또는 버전을 변경한다.
2xx Sucess 200 OK 정상적인 처리 종료
3xx Redirection 301 Moved Permanently Location 헤더를 사용해 다른 URI에 리다이렉트 한다. 영구 대응
302 Found Location 헤더를 사용해 다른 URI로 리다이렉트 한다. 임시 대응
304 Not Modified 리소스가 업데이트되지 않음
4xx Client Error 400 Bad Request 리퀘스트 구문에 오류가 있다
401 Unauthorized 인증 실패
403 Forbidden 해당 리소스에 대해 액세스가 거부됨
404 Not Found 해당 리소스가 존재하지 않음 
406 Not Acceptable 대응하는 종류의 파일이 없음
412 Precondition Failed 전제 조건을 만족하지 않음
5xx Server Error 500 Internal Server Error 서버가 처리 방법을 모름
502 Bad Gateway 서버가 요청을 처리할때 게이트웨이로 작업하는 동안 장애 발생
503 Service Unavailable 웹서버 애플리케이션에 장애 발생

 

 

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)

실제로 보내는 데이터가 들어있는 필드이다. HTML 데이터나 이미지 , 동영상 파일 등 실제로 보내는 데이터가 들어있다.

옵션 사항이다. 스테이터스 코드에 따라 있거나 없을수도 있다.

 

 

정리

위의 내용은 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 프레임으로 송신한다.

리즌 프레이즈는 사라졌다.

  • HTTP 버전 → :version
  • 스테이터스 코드 → :status
  • 리즌프레이즈  x 사라짐

 

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

 

반응형