컴퓨터이론

[기초 이론] 3. HTTP 프로토콜

뇨롱 2020. 9. 7. 02:00

이 포스트는 인프런의 반드시 알고 넘어가야 할 웹 기술 기초편 을 보고 작성하였습니다!

 

 

 

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가지 이다.