(인프런) 반드시 알고 넘어가야 할 웹 기술 기초편 을 보고 정리한 내용입니다.
GITHUB로 보고싶다면?
HTTP (HyperText Transfer Protocol)
- 팀 버너스 리 박사에 의해 개발됨.
- 하이퍼 텍스트 문서(HTML)를 전송하기 위해 사용되는 프로토콜.
- 통신 규약으로 웹의 핵심 기술.
버전
- HTTP/0.9
- 최초로 웹이 만들어졌을 때 오직 HTML을 받아오기 위해 만들어짐.
- 버전 번호, 명세서가 없고 정식 사양이 아니였음.
- 이후 HTTP/1.0부터 정식 사양으로 되면서 이전이란 의미로 HTTP/0.9라는 버전이 붙여짐.
- GET 메소드만 지원하며, 특별한 기능은 없음.
- HTTP/1.0
- HTTP의 정식 사양으로 처음으로 널리 사용하기 시작한 버전. RFC1945가 발생됨.
- POST, HEAD 메소드, 헤더 지원.
- 요청의 결과를 알 수 있는 상태코드 추가.
- HTML 파일들 외 다른 파일들도 전송 가능.
- 각 요청마다 새로운 연결을 맺고 끊고 다시 새로운 연결을 맺는 비효율적인 비 연결지향(Connectionless) 방식으로 성능이 떨어짐.
- HTTP/1.0+
- 비효율적인 연결에 대한 문제가 있었음.
- "Keep-Alive 커넥션"을 지원함으로써 여러 번 커넥션을 맺는 설계상의 문제를 해결함.
- HTTP/1.1
- HTTP의 설계상 문제들을 해결하고 성능을 최적화함.
- Keep-Alive는 명세에서 빠지고 기본으로 지속 연결이 활성화 됨.
- 모든 요청이 끝나면 "Connection: closes" 헤더를 통해 연결 종료를 알림.
- 기존의 GET, POST, HEAD 3가지 뿐이었던 메소드가 OPTIONS, PUT, DELETE 등 많은 메소드가 추가됨.
- HTTP/2.0
- HTTP의 성능 문제는 여전히 문젯거리로 존재.
- 요즘 웹의 경우 하나의 웹 페이지를 보기 위해서 수십개의 요청을 보내야 정상적으로 페이지를 볼 수 있음. 때문에 이런 문제를 해결할 수 있는 HTTP/2.0이 등장함.
- 성능 향상에 초점을 둔 프로토콜로 멀티플렉싱 스트림, 헤더 압축, 서버 푸시 등의 기능이 추가됨.
OSI 7 Layer에서 바라 본 HTTP 프로토콜
- OSI 계층 모델은 각 기능별 모듈화 된 기능을 계층별로 총 7계층으로 구성되어 있음.
- 실제로는 TCP/IP 계층 모델을 표준으로 하고 있음.
- 웹에서 사용되는 HTTP, HTTPS 프로토콜은 응용 계층에 해당됨.
OSI 계층 모델 TCP/IP 계층 모델 계층별 프로토콜
----------- ---------------
응용 계층
Application Layer
-----------
표현 계층 응용 계층 HTTP, HTTPS, SMTP,
Presentation Layer Application Layer FTP, TELNET, SSH, DNS, ...
-----------
세션 계층
Session Layer
----------- ---------------
전송 계층 전송 계층 TCP, UDP, ...
Transport Layer Transport Layer
----------- ---------------
네트워크 계층 인터넷 계층 IP, ICMP, ARP, ...
Network Layer Internet Layer
----------- ---------------
데이터링크 계층
Data-Link Layer
----------- 네트워크 액세스 계층 MAC, ...
물리 계층 Network Access Layer
Physical Layer
----------- ---------------
TCP/IP 통신에 대한 이해
- 인터넷을 이용하기 위해 TCP/IP 기반의 통신을 함.
- 대부분의 네트워크 통신은 TCP/IP 기반 통신을 근간으로 함.
- 통신을 하기 위한 중요한 정보.
- IP(Internet Protocol) : 물리적 호스트 대상을 찾음.
- port : 논리적 대상을 찾음.
연결 관리 방식
- 비 지속 연결(Non-Persistent Connection)
- HTTP/0.9, HTTP/1.0
- 초기 HTTP에서 사용하던 방식.
- 초기의 웹은 단순히 문서를 전달하는 방식으로 지속 연결이 필요하지 않음.
- 한번의 요청과 응답 과정을 거치면 바로 연결을 끊어 버림.
- 오늘날의 웹 문서의 경우 인터페이스를 구성하기 위해 많은 리소스가 필요한데 리소스 요청 시 3-Way HandShake를 수행해야 하기 때문에 오늘날의 웹과는 부적합한 연결 방식.
- 지속 연결(Persistent Connection)
- HTTP/1.0+, HTTP/1.1, HTTP/2.0
- HTTP/1.0+에서 Keep-Alive 연결을 지원. 헤더에 "Connection: Keep-Alive" 란 것이 명시가 되어 있으면 지속 연결을 사용한다는 것.
- HTTP/1.1부터는 "Connection: Keep-Alive" 헤더 필요 없이 기본으로 지속 연결을 하게 됨.
- 단 한번의 3-Way HandShake 과정으로 여러 번의 요청과 응답 과정을 거치며, 비 지속 연결에 비해 시간이 확연히 단축됨.
- HTTP/1.0+에서 Keep-Alive 커넥션을 통해 지속 연결을 지원하며, HTTP/1.1부터는 명세에서 빠지고 지속 연결을 기본으로 함. 즉, Keep-Alive 사용없이 모든 연결을 지속 연결로 함.
HTTP 메시지
- 메시지 구조.
- 시작줄, 메시지 헤더, 메시지 바디. 각 행은 개행 문자(\r\n)를 기준으로 분류함.
- 개행 문자.
- 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열.
- 새 줄 문자 혹은 줄 바꿈 문자라고도 함.
- OS 또는 프로토콜마다 개행 문자의 ASCII 값이 다름.
- HTTP와 같은 인터넷 프로토콜의 경우 ASCII의 CR + LF를 개행 문자로 사용하도록 규정함.
- CR(Carriage Return).
- LF(Line Feed).
- HTTP 통신 상에서 개행 문자로 라인을 구분하여 데이터 식별 함.
시작줄 메시지 헤더(1) 메시지 헤더(2) 메시지 바디
______________________ ___________________ ______________________________________________ _________________
POST/login.php HTTP/1.1\r\nHOST:www.test.co.kr\r\nContent-Type:application/x-www-form-urlencoded\r\n\r\nid=test&pw=test123
---- ---- --------
개행 문자를 기준으로 각 행을 구분.
- 요청 메시지(Request Message).
- 웹 브라우저가 요청할 때 보내는 메시지.
- 시작줄 : 요청라인으로 메소드, 요청 URL, 버전이 들어감.
- 메시지 헤더 : 요청의 속성과 추가 정보들이 포함되어 있음.
- 메시지 바디 : 엔티티 바디가 들어가며, 메시지의 데이터가 들어가는 부분. 데이터 수송을 목적으로 설계. 엔티티 바디는 메소드에 따라 존재 유/무가 결정되는 선택적인 부분.
- 응답 메시지(Response Message).
- 서버가 HTTP 요청 메시지를 받고 응답할 때 보내는 메시지.
- 시작줄 : 상태 라인으로, 버전, 상태 코드, 응답 문구가 들어감.
- 메시지 헤더 : 응답의 속성과 추가 정보들이 포함되어 있음.
- 메시지 바디 : 엔티티 바디가 들어가며, 메시지의 데이터가 들어가는 부분. 데이터 수송을 목적으로 설계. 엔티티 바디는 메소드에 따라 존재 유/무가 결정되는 선택적인 부분.
HTTP 메소드
- GET, POST, PUT, DELETE, PATCH
HTTP 상태 코드 (Status Code)
- 클라이언트가 요청을 할 경우 서버는 요청에 대한 상세 결과를 알려줌.
- 3자리 숫자로 구성되어 있으며, 뒤에 응답 문구가 붙음. (응답 문구는 상태 코드에 대한 설명)