728x90
반응형
개념
- 팀 버너스 리 박사에 의해 개발된 HTTP(Hypertext Transfer Protocol)는 하이퍼텍스트 문서를 전송하기 위해 사용되는 프로토콜
- 통신 규약으로 웹의 핵심 기술
- 여기서 말하는 하이퍼 텍스트 문서는 HTML파일
버전
- HTTP/0.9
- 최초로 웹이 만들어 졌을 때 오직 HTML을 받아 오기 위해 만들어 졌다.
- 그리하여 버전 번호도 없고 명세서도 없으며, 정식 사양이 아니었다.
- 이후 HTTP/1.0부터 정식 사양으로 되면서 이전이란 의미로 HTTP/0.9라는 버전이 붙여졌다.
- HTTP/0.9은 GET 메서드만 지원하며, 특별한 기능은 없다.
- HTTP/0.9에서 HTTP/1.0로 빠르게 대체되었다.
- HTTP/1.0
- HTTP의 정식 사양으로 처음으로 널리 사용하기 시작한 버전으로 RFC1945가 발행되었다.
- HTTP/1.0부터 POST, HEAD 메서드, 헤더를 지원하며 요청의 결과를 알 수 있는 상태 코드가 추가되었다.
- HTML 파일을 외 다른 파일들도 전송이 가능하게 되었다.
- 하지만, 각 요청마다 새로운 연결을 맺고 끊고 다시 새로운 연결을 맺는 비효율적인 비 연결지향(Connectionless) 방식으로 성능이 떨어진다.
- HTTP/1.0 +
- HTTP/1.0은 비효율적인 연결에 대한 문제가 있었다.
- HTTP/1.0 +에서는 "Keep-Alive 커넥션"을 지원함으로써 여러 번 커넥션을 맺는 설계상의 문제를 해결하였다.
- HTTP/1.1
- HTTP/1.1은 현재 가장 많이 사용되고 있는 버전으로 HTTP의 설계상 문제들을 해결하고 성능을 최적화하였다.
- HTTP/1.0 +에서는 Keep-Alive 커넥션을 통해 지속 연결(Persistence Connection)을 지원하였으나, HTTP/1.1부터 Keep-Alive는 명세에서 빠지고 기본으로 지속 연결이 활성화 되어 있다.
- 모든 요청이 끝나면 "Connection: close" 헤더를 통해 연결 종료를 알린다.
- 또한, 기존이 "GET, POST, HEAD" 3가지 뿐이었던 메서드가 "OPTIONS, PUT, DELETE" 등 많은 메서드가 추가되었다.
- HTTP/2.0
- HTTP의 성능 문제는 여전히 문젯거리로 존재하였다.
- 특히 요즘 웹의 경우 하나의 웹 페이지를 보기 위해서 수십개의 요청을 보내야 정상적으로 페이지를 볼 수 있다.
- 그리하여 이런 문제를 해결할 수 있는 HTTP/2.0이 등장하였다.
- HTTP/2.0은 성능 향상에 초점을 둔 프로토콜로 멀티플렉싱 스트림, 헤더 압축, 서버 푸시 등의 기능이 추가되었다.
- 2015년 HTTP/2.0을 공식 발표하였다. 아직 대부분 HTTP/1.1을 사용중이며, Google 계열 사이트는 HTTP/2.0을 지원하고 있으며, 점차 HTTP/2.0을 지원하는 추세이다. 그러나 국내 사이트들은 아직 HTTP/1.1만 지원하고 있다.(Google에서 3.0을 개발하고 있다는 얘기가 있는 것 같기도 하고~...아닌 것 같기도 하고~...)
OSI 7 Layer에서 바라 본 HTTP 프로토콜
- OSI 계층 모델은 각 기능별 모듈화 된 기능을 계층별로 총 7계층으로 구성되어 있다.
- 그러나 이는 교육에 대한 적합한 모델로 실제 TCP/IP 계층 모델을 표준으로 하고 있다.
- 웹에서 사용되는 HTTP, HTTPS 프로토콜은 응용 계층에 해당된다.
OSI 계층 모델 | TCP/IP 계층 모델 | 계층별 프로토콜 |
응용 계층 Application Layer |
응용 계층 Application Layer |
HTTP, HTTPS, SMTP, FTP, TELNET, SSH, DNS |
표현 계층 Presentation Layer |
||
세션 계층 Session Layer |
||
전송 계층 Transport Layer |
전송 계층 Transport Layer |
TCP, UDP |
네트워크 계층 Network Layer |
인터넷 계층 Internet Layer |
IP, ICMP, ARP |
데이터링크 계층 Data-Link Layer |
네트워크 액세스 계층 Network Access Layer |
MAC |
물리 계층 Pysical Layer |
TCP/IP 통신에 대한 이해
- 우리는 인터넷을 이용하기 위해서 TCP/IP 기반의 통신을 하며, 대부분의 네트워크 통신은 TCP/IP 기반 통신을 근간으로 한다.
- 이때 통신을 하기 위한 중요한 정보가 있는데 IP(Internet Protocol)과 PORT가 있다.
- IP를 통해 물리적 호스트 대상을 찾으며, PORT를 통해 논리적 대상을 찾는다.
통신 방식에 대한 간단한 설명
- 처음에 최초에는 3-way hand shake를 진행하게 된다.
- 이것은 서로가 3번의 통신을 주고 받는 것을 의미한다.
- 이 3-way handshake는 TCP 프로토콜에 의해서 이루어지는 연결 방식이다.
- 그래서 TCP는 3-way hand shake 때문에 종단 간의 신뢰성 있는 정보 전송을 제공해 줄 수 있는 프로토콜이라고 하는 것이다.
- 그리하여 3-way hand shake이 진행이 되고 이후에 서로 통신이 본격적인 HTTP 전송 및 데이터가 전송이 되는 것이다.
- 먼저 3-way hand shake를 진행한 다음, 그 다음에 이 데이터를 주고 받게 된다.
- 우선 여기서는 IP와 PORT가 있어야 하는데, 간단하게 예시를 들어 설명해 보겠다.
- 만약 주소가 "경기도 고양시 일산동구 네모네모로 77 네카라쿠배아파트 123동 456호"라고 한다면, 여기서 IP는 "경기도 고양시 일산동구 네모네모로 77 네카라쿠배아파트 123동"이 되고 PORT는 "456호"는 의미한다고 보면 된다.
- 위의 이 개념으로 본다면 먼저 웹 브라우저에서 최초의 통신을 하게 된다.
- 그리고 url창을 통해 www.naver.com 을 치면 통신을 하기 위해 임의의 포트를 할당하게 된다.
- 그 다음 이제 목적지 IP가 세팅이 되며, 목적지 PORT도 세팅이 된다. 보통 이 경우에는 기본적으로 80포트가 세팅된다.
- 이렇게 되면 출발지의 IP와 PORT, 목적지의 IP와 PORT가 세팅이 되고 이렇게 되어야만 요청과 응답을 받을 수 있다.
- 그렇게 하여 IP를 통해 최종 서버까지 찾아 들어가고 서비스 중인 80포트를 통해서 데이터를 받게 되고 어플리케이션 단에서 처리할 수 있다.
- 그리고 다시 응답을 전송해주게 된다. 이렇게 통신 원리가 이루어진다고 보면 되겠다.
연결 관리 방식
- HTTP 프로토콜의 연결 관리 방식은 크게 비 지속 연결(Non-Persistent Connection)과 지속 연결(Persistent Connection) 두 가지로 나뉜다.
- HTTP 버전에 따라 사용되는 연결 방식이 다른데 HTTP/0.9, HTTP/1.0까지는 비 지속 연결이며, HTTP/1.0+, HTTP/1.1, HTTP/2.0은 지속 연결이다.
- HTTP/1.0+에서 Keep-Alive 커넥션을 통해 지속 연결을 지원하며, HTTP/1.1부터는 명세에서 빠지고 지속 연결을 기본으로 한다.
- 즉, Kepp-Alive 사용 없이 모든 연결을 지속 연결로 한다.
- 종종 HTTP/1.1부터 Keep-Alive를 지원한다고 하는데 그것을 잘못된 내용이고 HTTP/1.0+에서부터 지원하게 된 것이며, HTTP/1.1에서 Keep-Alive는 기본 사양이다.
연결 관리 방식 - 비 지속 연결(Non-Persistent Connection)
- 비 지속 연결은 초기 HTTP에서 사용하던 방식으로 HTTP/1.0까지 사용되었다.
- 초기의 웹은 단순히 문서를 전달하는 방식으로 지속 연결이 필요하지 않았다.
- 때문에 한번의 요청과 응답 과정을 거치면 바로 연결을 끊어버렸다.
- 오늘 날의 웹 문서의 경우 인터페이스를 구성하기 위해 많은 리소스가 필요한데 리소스 요청 시마다 3-way hand shake를 수행해야 하기 때문에 오늘날의 웹과 부적합한 연결 방식이다.
연결 관리 방식 - 지속 연결(Persistent Connection)
- 웹의 기술 흐름에 맞게 HTTP/1.0+에서 Keep-Alive연결을 지원한다.
- 헤더에 "Connection: Keep-Alive"란 것이 명시가 되어 있으면, 지속 연결을 사용한다는 것이다.
- HTTP/1.1부터는 "Connection: Keep-Alive" 헤더 필요 없이 기본으로 지속 연결을 사용한다는 것이다.
- 단 한번의 3-way handshake 과정으로 여러 번의 요청과 응답 과정을 거치며, 비 지속 연결에 비해 시간이 단축된다는 것을 알 수 있다.
HTTP 메세지 - 메세지 구조
- 웹 브라우저가 요청할 때 보내는 메세지를 요청 메세지(Request Message)라고 부른다.
- 웹 서버가 HTTP 요청 메세지를 받고 응답할 때 보내는 메세지를 응답 메세지(Response Message)라고 부른다.
- 메세지 구조는 시작줄, 메세지 헤더, 메세지 바디로 나뉜다.
- 각 행은 개행문자(\r\n)를 기준으로 분류를 한다.
HTTP 메세지 - 개행문자
- 개행 문자는 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열이다.
- 새 줄 문자 혹은 줄 바꿈 문자라고도 한다.
- OS 혹은 프로토콜마다 개행문자의 ASCII 값이 다른데 HTTP와 같은 인터넷 프로토콜의 경우 ASCII의 CR+LF를 개행 문자로 사용하도록 규정하고 있다.
- CR은 캐리지 리턴(Carriage Return)으로 문자는 "\r", Hex 값으로는 "0x0D"으로 표현된다.
- LF는 라인 피드(Line Feed)로 문자는 "\n", Hex값으로는 "0x0A"로 표현된다.
- HTTP 통신 상에서 이러한 개행 문자로 라인을 구부한여 데이터 식별을 하게 된다.
- 메세지 헤더는 꼭 한개일 필요는 없고 여러 개가 들어올 수 있다.
- 만약 개행문자가 두개가 연속으로 들어오는 경우에는 그 시점으로 뒤에 문자열은 메세지 바디라고 보면 된다.
HTTP 메세지 - 요청 메세지(Request Message)
- 요청 메세지의 시작줄은 요청 라인으로 메서드, 요청 URL, 버전이 들어가며, 메세지 헤더는 요청의 속성과 추가 정보들이 포함되어 있다.
- 메세지 바디 부분은 엔티티 바디가 들어가며, 메세지의 데이터가 들어가는 부분으로 데이터 수송을 목적으로 설계하였다.
- 여기서 엔티티 바디는 메서드에 따라 존재 유/무가 결정되는 선택적인 부분이다.
HTTP 메세지 - 응답 메세지(Response Message)
- 응답 메세지의 시작줄은 상태 라인으로 버전, 상태코드, 응답 문구가 들어가며, 메세지 헤더는 응답의 속성과 추가 정보들이 포함되어 있다.
- 메세지 바디 부분은 엔티티 바디가 들어가며, 메세지의 데이터가 들어가는 부분으로 데이터 수송을 목적으로 설계하였다.
- 여기서 엔티티 바디는 메서드에 따라 존재 유/무가 결정되는 선택적인 부분이다.
HTTP 메서드 - GET/POST 메서드
- HTTP 메서드에는 여러가지가 있으나, GET/POST 메서드가 일반적으로 웹 통신시 가장 많이 사용되는 메서드이다.
- GET/POST 메서드는 클라이언트에서 서버에 데이터를 전달할 때 사용되는 방식으로 GET/POST 메서드 별로 차이가 있다.
HTTP 상태 코드
- 클라이언트가 요청을 할 경우 서버는 요청에 대한 상세 결과를 알려 주는데 그것이 상태 코드(Status Code)이다
- 상태 코드는 3자리 숫자로 구성되어 있으며, 뒤에 응답 문구가 붙는다.
- 응답 문구는 상태 코드에 대한 설명이다.
- 상태코드는 외울 필요까지는 없지만, 자주 반환되는 몇개만 알고 있으면 된다.
분류 | 전체 범위 | 정의된 범위 | |
1XX | 정보 | 100 ~ 199 | 100 ~ 101 |
2XX | 성공 | 200 ~ 299 | 200 ~ 206 |
3XX | 리다이렉션 | 300 ~ 399 | 300 ~ 305 |
4XX | 클라이언트 에러 | 400 ~ 499 | 400 ~ 415 |
5XX | 서버 에러 | 500 ~ 599 | 500 ~ 505 |
**전체 범위 내에서 정의된 범위만 사용이 되며, HTTP 버전이 업그레이드 됨에 따라 정의될 코드가 늘어날 예정이다.
코드 | 응답 문구 | 내용 |
200 | OK | 정상적으로 처리 됨 |
302 | Found | 다른 페이지로 이동 |
304 | Not Modified | 수정되지 않음 |
400 | Bad Request | 클라이언트 요청 에러 |
403 | Forbidden | 접근 권한 없음 |
404 | Not Found | 존재하지 않음 |
500 | Internal Server Error | 서버 측 에러 |
HTTP 상태 코드 - 상태 코드의 에러 페이지에 따른 웹 서버 식별
- 상태 코드에 따라 출력되는 에러 페이지는 에러 페이지는 서버 별로 다르기 때문에 이를 통해 사용되는 웹 서버 혹은 웹 어플리케이션 서버를 식별할 수 있다.
HTTP 메세지 헤더
- 메세지 헤더는 메세지를 구성하는 요소로 클라이언트와 서버가 무엇을 알지 결정하고 처리하기 위한 정보들이 들어 있다.
- 요청 메세지와 응답 메세지에는 반드시 메세지 헤더가 포함이 되어 있다.
- 헤더의 종류에는 크게 5가지로 분류가 되며, 확장 헤더는 HTTP 명세에는 추가되지 않은 비 표준 헤더이다.
- HTTP/1.1 에 정의되어 있는 헤더는 총 47가지이다.
종류 |
일반 헤더(General Header) |
요청 헤더(Request Header) |
응답 헤더(Response Header) |
엔티티 헤더(Entity Header) |
확장 헤더(Extension Header) |
728x90
반응형
'Network' 카테고리의 다른 글
쿠키와 세션 (2) | 2024.09.08 |
---|---|
HTTP GET / POST (1) | 2024.09.08 |
자원을 지정하는 URL (2) | 2024.09.07 |
웹을 구성하는 3대 요소 (0) | 2024.09.07 |
웹의 탄생, 그리고 발전 (15) | 2024.09.07 |