[기초 이론] 3. HTTP 프로토콜
이 포스트는 인프런의 반드시 알고 넘어가야 할 웹 기술 기초편 을 보고 작성하였습니다!
3. HTTP 프로토콜
- 하이퍼텍스트 문서를 전송하기 위한 프로토콜이다.
*프로토콜은 통신규약이다.
*하이퍼텍스트는 HTML을 의미한다.
(1) HTTP 버전
HTTP 버전 |
0.9 |
1.0 |
1.0 + |
1.1 |
2.0 |
① 0.9: 최초의 웹이다.
- HTML만 받아온다.
- 정식사양이 아니며 기능이 없고, GET메소드만 지원한다.
② 1.0: 최초의 정식사용을 시작한 웹이다.
-
스펙: RFC 1945
-
POST, HEAD 메소드, 헤더를 지원한다.
-
요청 결과를 알 수 있는 상태 코드를 추가한다.
-
HTML파일들 외에 다른 파일들도 전송이 가능하다.
-
비 효율적인 비 연결지향 방식: 각 요청마다 새로운 연결을 맺고 끊고 다시 새로운 연결을 맺는다.
→ 성능이 떨어진다.
③ 1.0 +
-
비효율적인 연결 문제를 개선하기 위해 "Keep - Alive 커넥션" 을 지원한다.
*Keep - Alive 커넥션: 지속적 연결 상태 ⇐ 여러번 커넥션을 맺는 설계 상의 문제를 해결한다.
④ 1.1: 성능최적화 된 새로운 버전이다.
-
Keep - Alive 커넥션을 이용한다.
-
모든 요청이 끝나면 connection: close 헤더를 통해 연결 종료를 알린다.
-
기존에는 메소드가 GET, POST, HEAD 세가지 뿐이었지만, OPTION, PUT, DELETE 등 많은 메소드가 추가되었다.
⑤ 2.0: 성능 향상에 초점을 둔 프로토콜
- 멀티플렉싱스트림, 헤더 압축, 서버 푸시 등 기능이 추가 되었다.
(2) OSI 7 LAYER : 교육모델
*TCP/IP 계층이 모델이 원래 표준이다.
(3) TCP/IP 통신
① 3- Way Hand Shake방식으로 데이터를 주고받는다.
② IP, PORT
-
IP: 주소( 물리적인 호스트 대상 )
-
PORT: 구체적 위치( 논리적인 대상 ) ⇒ 예시- IP: 동, PORT:호
★ 데이터는 출발지의 IP와 PORT 가 명확하게 있어야 통신이 원활하게 된다.
(4) 연결관리방식
①종류
- 비 지속 연결 (non-persistent connection)
- 지속연결 (persistent connetcion)
∨ HTTP마다 다르다.
1) 비지속: 0.9 1.0
2) 지속: 1.0+ 1.1 2.0
⇒ Keep - Alive 커넥션 기반 지속: 1.0+
1.1 부터는 명세에서 빠지고 지속 연결을 기본으로 해 Keep - Alive 커넥션 사용 없이 모든 연결을 지속 연결로 한다.
② 비 지속 연결: 초기 HTTP의 사용방식.
-
초기 웹은 단순히 문서를 주고 받아 지속 연결이 필요가 없었다.
-
따라서 한번의 요청과 응답 과정을 거치면 바로 연결을 끊으면 된다.
③ 지속 연결
- 사용이유
∨ 오늘 날의 웹 문서의 경우, 인터페이스를 구성하기 위해 많은 리소스가 필요하다.
∨ 리소스 요청시 3-Way Hand Shake 를 해야하기 때문이다.
- 헤더에 "Connection: Keep-Alive"가 명시되어 있으면 지속 연결을 이용한다.
- 1.1 버전 부터는 헤더에 명시 할 필요없다.
- 여러 번의 요청과 응답 과정이 단 한번의 3-way 과정으로 실행 되어 시간이 단축된다.
(5) HTTP 메세지
웹 브라우저는 요청 메세지, 서버는 응답 메세지를 보낸다.
①메세지 구조: 시작줄, 메세지 헤더, 메세지 바디로 나뉜다.
-
각 행은 개행문자(\r\n) 을 기준으로 분류한다.
* 개행문자: 텍스트 한 줄이 끝남을 표시하는 문자 또는 문자열
새 줄 문자 혹은 줄 바꿈 문자라고 부른다.
OS 혹은 프로토콜 마다 개행 문자의 아스키 값이 다르다.
HTTP이 경우 아스키 값의 CR+LF 를 개행문자로 사용하도록 규정한다.
* CR: 캐리지 리턴 문자(\r)
HEX 값은 0x0D이다.
* LF: \n
HEX 값: 0x0A이다.
②요청 메세지
-
시작줄: 요청 라인
∨ 메소드 + 공백 + 요청 URL + 공백 + 버전
* GET 방식: 공백이 아니라 +를 사용한다.
-
바디(Entity 바디): 데이터가 들어가는 부분, 데이터 수송 목적
∨ 바디는 메소드에 따라 존재 유무가 결정된다.
* GET 방식은 없다.
POST 방식은 있다.
③ 응답 메세지
-
시작줄: 상태 라인
∨ 버전 + 공백 + 상태코드 + 공백 + 응답문구
-
헤더: 응답의 속성과 추가정보
-
바디(Entity 바디): 데이터 수송 목적
④ GET / POST 메소드
∨ 둘의 차이점
-
데이터가 실리는 위치: GET-URL, POST- BODY
-
POST는 content-type 이라는 헤더가 나와야한다.
-
GET- 자원을 받기위해 사용한다.
POST- 서버와 액션 하기 위해서 사용한다.
⑤상태 코드: 클라이언트가 요청할 시 서버는 요청에 대한 상세 결과를 알려준다.
-
상태 코드는 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 | 서버 측 에러 |
* 500: 에러페이지에 따라서 웹 서버 식별가능
웹 서버에 따라서 방법이 다르기 때문이다.
⑥ 헤더: 메세지를 구성하는 요소
-
클라이언트와 서버가 무엇을 할 지 결정하고 처리하기 위한 정보를 담고 있다.
-
요청 메세지와 응답 메세지에는 반드시 메세지 헤더가 포함된다.
-
헤더의 종류는 크게 5가지이다.
종류 |
일반 헤더 (General Header) |
요청 헤더 (Request Header) |
응답 헤더 (Response Header) |
엔티티 헤더 (Entity Header) |
확장 헤더 (Extension Header) |
* 확장 헤더는 HTTP 명세에 추가되지 않은 비표준헤더이다.
* HTTP 1.1 은 47가지 이다.