목차
- HTTP 개념 및 특성
- HTTP 버전
- HTTP 메시지 구조
- HTTP Request 메시지
- HTTP Response 메시지
- HTTP 상태 코드
1. HTTP 개념 및 특성
HTTP는 HyperText Transfer Protocol의 약자로, OSI 7계층에서 애플리케이션 계층에서 동작하는 프로토콜이다. 웹 상에서 데이터를 송수신하기 위해 사용되며, 80번 포트를 사용하고 있다. 클라이언트가 서버에게 데이터를 요청할 때 HTTP 요청을 보내고, 서버는 클라이언트가 요청한 데이터를 담아 HTTP 응답을 보냄으로써 통신한다.
(특성)
- 클라이언트 - 서버 구조
웹 상에서 데이터를 요청하는 쪽을 클라이언트, 데이터를 응답하는 쪽을 서버라고 한다. 두 개의 컴퓨터를 클라이언트와 서버로 구분한다는 것은 데이터 요청 혹은 데이터 응답에 따라 역할을 분리시킨 것과 같다.
- 무상태성, stateless
서버가 클라이언트의 상태를 보존하지 않는다. 따라서 클라이언트는 서버에 데이터를 요청할 때 인증 정보 등의 추가적인 데이터를 포함해야 한다. stateless는 클라이언트가 항상 같은 서버에 연결될 필요가 없으므로 scale-out에 좋다.
- 비연결성, connectionless
클라이언트가 서버의 응답을 받으면 TCP/IP 연결을 종료한다. 연결을 유지하지 않기 때문에 서버 자원을 효율적으로 사용할 수 있다. 하지만 웹 브라우저를 하나 띄울 때 클라이언트는 HTML, 자바스크립트, 이미지 등 여러 자원을 요청하는데, 각 자원마다 3-way handshake 과정을 거치게 된다면 불필요한 리소스가 낭비된다. 따라서 웹 브라우저를 띄우기 위해 모든 자원을 요청할 동안만 TCP/IP 연결을 지속하는 "지속 연결, Persistaent Connections"을 통해 성능을 개선했다.
2. HTTP 버전
1) HTTP 0.9
- 요청은 단일 라인으로 구성되며, 메서드는 GET만 존재
- 응답은 파일 내용 자체로 구성되어, 극도로 단순
- HTTP 헤더 존재 X
- HTTP 상태 코드 존재 X
2) HTTP 1.0
- HTTP 헤더 도입
- HTTP 상태 코드 도입
- 로컬 캐시 지원
- 프로토콜 확장 지원
- Content-type을 통해 HTML 문서 외 다른 파일 전송 가능
(Request)
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
(Response)
GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(image content)
3) HTTP 1.1 : 표준
- 1997년에 발표되어 표준 프로토콜로 지정
- 캐시 제어 메커니즘 도입
- 언어, 인코딩 방식 등 지원
- Persistent Connection 도입으로 TCP/IP 연결에 대한 성능 개선
- Pipelining 도입으로 응답을 기다리는 오버해드 개선
4) HTTP 2.0
- HTTP 1.x를 기반으로 구글이 개발한 SPDY 프로토콜
- 텍스트 기반이 아닌 이진 프로토콜로 오류 발생 가능성을 낮춤
- 다중화 프로토콜 도입으로 동일 연결에 대한 병렬 요청 처리 가능
- 헤더 압축
5) HTTP 3.0
- 구글이 개발한 UDP 기반 QUIC 프로토콜
- TCP의 3-way handshake 과정 최적화에 초점을 맞춤
- 오류 제어 기능 강화
- 혼잡 제어 기능 강화
3. HTTP 메시지 구조
HTTP는 요청과 응답 메시지 모두 동일한 구조를 띄고 있다. 위에서부터 차례로 시작 라인, 헤더, 공백 라인, 바디(본문)로 구성되어 있으며, 요청 메시지인지 혹은 응답 메시지인지 헤더와 바디에 포함된 내용이 조금씩 달라진다.
4. HTTP Request 메시지
- Request Line
- Method : GET, POST, PUT 등과 같은 종류가 있으며, 메시지를 전달하는 방식을 설정한다.
- URL : 리소스의 경로를 알 수 있으며, 도메인과 URL을 합쳐 필요한 데이터를 질의한다.
- Version : 사용된 HTTP 버전을 표시하며, HTTP 버전에 따라 사용되는 프로토콜이 달라진다.
- Header
- Host : 요청한 서버의 도메인명 혹은 IP 주소
- Accept : 클라이언트가 받아들일 수 있는 MIME 타입
- Accept-Language : 클라이언트가 사용하는 언어
- Accept-Encoding : 클라이언트가 사용하는 인코딩 방식
- User-Agent : 클라이언트의 브라우저 및 OS 정보
- Content-Type : 요청 바디의 MIME 타입
- Content-Length : 요청 바디의 길이
- Authorization : 인증 토큰을 서버로 보낼 때 사용
5. HTTP Response 메시지
- Status Line
- Version : 사용된 HTTP 버전을 표시하며, HTTP 버전에 따라 사용되는 프로토콜이 달라진다.
- Status Code : 클라이언트의 요청이 잘 처리되었는지 숫자를 통해 응답한다.
- Status Message : Status Code에 대한 결과를 사람이 이해할 수 있도록 나타낸다.
- Header
- Date : 메시지 생성 날짜
- Server : 서버의 브라우저 및 OS 정보
- ETag : 쿠키/캐시 관련된 헤더로 HTTP 컨텐츠가 바뀌었는지 검사
- Content-Length : 응답 바디 길이
- Content-Type : 응답 바디 MIME 타입
6. HTTP 상태 코드
클라이언트가 보낸 요청에 대한 처리 결과를 숫자로 나타내어 Response 메시지에 포함한다. 100 ~ 500번대 숫자로 이루어져 있으며, 400번대와 500번대의 숫자는 클라이언트 혹은 서버 측의 사정으로 요청을 정상적으로 처리하지 못한 상태이다.
- 100번대 : 정보, 요청을 받았으며 처리를 계속 진행
- 200번대 : 성공, 요청을 성공적으로 받았으며 처리를 끝냄
- 300번대 : 리다이렉션, 요청 완료를 위해 추가 작업이 필요
- 400번대 : 클라이언트 오류, 요청 메시지에 대한 문법이 잘못되었거나 클라이언트가 요청을 처리할 수 없음
- 500번대 : 서버 오류, 서버가 요청을 처리할 수 없음
댓글