2020. 4. 19. 23:54ㆍ카테고리 없음
개념
팀 버너스 리 박사에 의해 개발된 HTTP는 하이퍼텍스트 문서를 전송하기 위해 사용되는 프로토콜 즉 통신 규약으로 웹의 핵심 기술입니다. 여기서 하이퍼 텍스트 문서는 HTML 파일입니다.
버전
HTTP 버전은 HTTP/0.9 , HTTP/1.0 , HTTP/1.0+ , HTTP/1.1 , HTTP/2.0이렇게 5가지로 나눌 수 있습니다.
여기서 각 버전마다 특징을 설명하면
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 파일들 외 다른 파일들도 전송이 가능하게 되었습니다 하지만 각 요청마다 새로운 연결을 맺고 끊고 다시 새로운 연결을 맺는 비효율 적인 비연결 지향으로 성능이 떨어집니다.
- RFC란 비평을 기다리는 문서라는 의미로 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등을 아우르는 메모를 나타냅니다.
HTTP/1.0+: HTTP/1.0는 비효율적인 연결에 대한 문제가 있었습니다 그 문제점 들을 HTTP/1.0+에서 Kepp-Alive커넥션을 지원함으로써 여러 번의 커넥션을 맺는 설계상의 문제를 해결하게 됩니다.
HTTP/1.1: HTTP/1.1 은 현재 가장 많이 사용되는 버전으로 HTTP의 설계상 문제들을 해결하고 성능을 최적화시켰습니다 http/1.0+에서는 Keep-Alive 커넥션을 통해 지속 연결을 지원하였으며 HTTP/1.1부터는 Keep-Alive는 명세에서 빠지고 기본으로 지속 연결이 활성화가 됩니다. 모든 요청이 끝나면 Connecton:close 해더를 통해 연결 종료를 알립니다. 또한 기존의 3가지뿐이었던 메서드 GET, POST, HEAD 가 추가되어 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만 지원하고 있습니다.
OSI 7 Layer에서 바라본 HTTP 프로토콜
OSI계층 모델은 각 기능별 모듈화 된 기능을 계층별로 총 7 계층으로 구성되어있습니다 그러나 이는 교육에 대한 적합한 모델이지 실제로 사용하는 모델은 TCP/IP계층 모델을 표준으로 사용하고 있으며 웹에서 사용되는 HTTP HTTPS 프로토콜은 응용 계층에 해당됩니다
TCP/IP 통신에 대한 이해
그ᄅ면 표준으로 사용하는 TCP/IP 통신에 대해 알아보겠습니다.
우리는 인터넷을 이용하기 위해 TCP/IP 기반의 통신을 하며 대부분의 네트워크 통신은 TCP/IP 기반 통신을 근간으로 합니다 이때 통신을 하기 위한 중요한 정보를 주고받기 위해 IP와 port가 있어야 하며 IP를 통해 물리적 호스트 대상을 찾으며 port를 통해 논리적인 대상을 찾습니다.
그럼 동작하는 과정을 위의 사진을 통해 설명하겠습니다.
최초에는 3-way hand shake를 진행하며 서로 주고받습니다 3-way hand shake은 tcp 프로토콜에 의해서 이루어진 연결방식입니다 그렇기에 tcp는 3-way hand shake 때문에 신뢰성 있는 전보 전송을 제공해주는 프로토콜입니다.
그 후 IP를 가져오며 IP를 예시로 하면 대략적인 주소입니다 부산 OO동 같은 느낌입니다 그리고 PORT는 정확한 주소라고 생각하시면 됩니다 OO아파트 OO 동 OOO호 같은 것이죠 이렇게 IP와 PORT를 가져오고 찾아가며 서로의 정보를 주고받을 수 있습니다.
연결 관리 방식
HTTP 프로토콜의 연결 관리 방식은 크게 비 지속 연결과 지속 연결 이렇게 2가지로 분류됩니다. HTTP버전에 따라 사용되는 연결 방식이 다른데 HTTP/0.9, HTTP/1.0 까지는 비 지속 연결이며 HTTP/1.0+, HTTP/1.1, HTTP/2.0은 지속 연결입니다 HTTP/1.0+에서 keep-Alive커넥션을 통해 지속 연결을 지원하며 HTTP/1. 1부 터는 명세에서 빠지고 지속 연결을 기본으로사용 없이 모든 연결을 지속 연결로 합니다.
가끔 학원이나 온라인상의 포스팅에서 HTTP/1.1부터 keep-Alive를 지원한다고 하는데 이것은 잘못된 것입니다.
연결 관리 방식 - 비 지속 연결
그러면 연결 관리 방식 중에 비 지속 연결을 알아보겠습니다.
비 지속 연결은 초기 HTTP에서 사용되던 방식으로 HTTP/1.0까지 사용되었습니다. 초기 웹은 단순한 문서를 전달하는 방식으로 지속 연결이 필요하지 않아 한 번의 요청과 응답 과정을 거치면 연결을 끊어버렸습니다. 그리고 오늘날의 웹문서의 웹 문서의 경우 인터페이스를 구성하기 위해 많은 리소스가 필요한데 리소스 요청 시마다 3-way hand shake를 수행해야 하기 때문에 오늘날의 웹과 부적합한 연결방식입니다.
연결 관리 방식 - 지속 연결
위의 부적합한 연결방식을 바꾸기 위해 생긴 것이 지속 연결 방식입니다.
지속 연결은 웹의 기술 흐름에 맞게 HTTP/1.0+에서 Keep-Alive연결을 지원합니다 헤더에 Connection: Keep-Alive란 것이 명시가 되어 있으면 지속 연결을 사용한다는 것입니다 HTTP/1.1부터는 Connection: Keep-Alive 해더 필요 없이 기본으로 지속 연결을 하게 됩니다 단 한 번의 3-way hand shake과정으로 여러 번의 요청과 응답 과정을 거치며 비 지속 연결에 비해 시간이 확인히 단축된다는 것을 알 수 있습니다.
HTTP메시지-메시지 구조
HTTP메시지로 웹 브라우저가 요청 할때 보내는 메시지를 요청 메시지라 부르며 웹 서버가 HTTP요청 메시지를 받고 응답할때 보내는 메시지를 응답 메시지라고 부릅니다 메시지 구조는 시작줄,메시지 헤더,메시지 바디로 나뉘며 각 행은 개행 문자를 기중으로 분류합니다.
HTTP메시지-개행문자
개행 문자는 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열 입니다. 새 줄 문자 혹은 줄바꿈 문자라고도 합니다.
OS혹은 프로토콜마다 개행문자의 ASCII값이 다른데 HTML와 같은 인터넷 프로토콜의 경우 ASCII의 CR+LF를 개행 문자로 사용되도록 규정하며 CR은 캐리지 리턴으로 문자는 "\r" ,HEX값으로"0x0D"으로 표현됩니다 LF는 라인 피드로 문자는 "\n",HEX 값으로 "0x0A"로 표현됩니다.
HTTP통신 상에서 이러한 개행 문자로 라인을 구분하여 데이터 식별을 하게됩니다.
HTTP메시지-요청 메시지
요청 메시지의 시작줄은 요청 라인으로 메소드 요청URL 버전이 들어가며 메시지 헤더는 요청의 속성과 추가 정보들이 포함되어 있습니다 메시지 바디 부분은 엔티티 바디가 들어가면 메시지의 데이터가 들어가는 부분으로 데이터 수송을 목적으로 설계하였습니다 여기서 엔티티 바디는 메소드에 따라 존재 유/무가 결정되는 선택적인 부분입니다.
HTTP메시지-응답 메시지
요청 메시지의 시작줄은 상태 라인으로 버전 상태 코드 응답 문구가 들어가며 메시지 헤더 응답의 속성과 추가정보들이 포합되어 있으며 메시지 바디부분은 엔티티 바디가 들어가며 메시지의 데이터가 들어가는 부분으로 데이터 수송을목적으로 설계하였습니다 여기서 엔티티 바디는 메소드에 따라 존재 유/무가 결됩되는 선택전인 부분입니다.
HTTP메서드 GET/POST메소드
- HTTP메소드에는 여러가지가 있으나 GET/POST 메소드가 일반적으로 웹 통신시 가장 많이 사용되는 메소드입니다.
- GET/POST 메소드는 클라이언트 에서 서버에 테이터를 전달할 떄 사용되는 방식으로 GET/POST메소드 별로 차이가없습니다.
HTTP 상태 코드
클라이언트가 요청을 할 경우 서버는 요청에 대한 상세 결과를 알려 주는데 그것이 상태 코드입니다.
상태코드는 3자리 숫자로 구성되어 있으며 뒤에 응답 문구가 붙습니다 응답문구는 상태코드에 대한 설명으로 상태 코드를 외울 필요는 없으며 자주 반환 되는 몇개만 알고 있으면 됩니다.
HTTP 상태 코드 - 상태 코드의 에러 페이지에 따른 웹 서버 식별
상태 코드에 따라 출력되는 에러 페이지는 서버 별로 다르기 때문에 이를 통해 사용되는 웹 서버 혹은 웹 어플리 케이션 서버를 식별 할 수 있습니다.
HTTP 메시지 헤더
메시지 헤더는 메시지를 구성하는 요소로 클라이언트와 서버가 무엇을 할지 결정하고 처리하기 위한 정보들이 들어있으며 요청 메시지와 응답 메시지에는 반드시 메시지 헤더가 포함이 되어 있습니다.
헤더의 종류에는 크게 5가지로 분류되며 확장 헤더는 HTTP명세에는 추가되지 않은 비 표준 헤더입니다.
HTTP/1.1에 정의 되어 있는 헤더는 총 47가지 입니다.
참고한 수업 링크
https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88#curriculum