Computer Science/컴퓨터네트워크(ComNet)

[컴네/CN] HTTP

gxxgsta 2023. 10. 13. 00:37
반응형
SMALL

HTTP: Hyper-text transfer protocol

HTTP는 socket을 이용한 웹 페이지 전송 프로토콜이다.

클라이언트가 서버에 요청을 보내면, 서버는 클라이언트에게 응답을 전송하는 구조로,

서버와 클라이언트의 모든 통신은 request와 response로 구성된다.

 

HTTP는 TCP 위에 존재하며, TCP는 socket 위에 존재한다.

(HTTP/3는 TCP 대신 UDP를 사용한다.)

이때 웹 페이지는 객체들의 집합이며,

각 객체는 웹 페이지가 보유할 수 있는

HTML file, JPEG image, audio/video file 등을 일컫는다.

 

이때 웹 페이지는 url을 통해 식별되는데,

url은 universal resource locator의 약어로

네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약이다.

예를 들어 http://tistory.com/entry.html이라는 url에서 

tistory.com 서버 아래에 있는 entry.html파일을 열고 있다는 뜻이다.

 

패킷 확인해보기

아래는 wireshark를 통하여 어떤 사이트를 접속할 때 패킷을 캡처한 모습이다.

위의 사진에서 2개의 HTTP 패킷을 확인할 수 있는데,

첫 번째 패킷이 요청, 두 번째 패킷이 응답이다.

 

첫 번째 패킷의 info를 살펴보면 아래와 같다.

위 이미지에서 클라이언트는 서버에게 GET 메서드를 통해 요청을 전송하였고,

HTTP 1.1 버전을 사용했음을 알 수 있다.

아래에서 호스트 주소를 볼 수 있다.

 

두 번째 패킷의 info를 들여다 보자.

클라이언트가 전송한 GET 요청에 대해 서버가 응답한 모습이다.

마찬가지로 HTTP 1.1을 사용하였고, 302의 응답코드로 응답한 모습이다.

HTTP 요청(request) 메세지

 

요청 메세지는 start line, headers, empty line, body로 이뤄져 있다.

 

start line

start line은 [HTTP method] [Request target] [HTTP version]의 형식으로 구성되어 있다.

 

1. HTTP method

메소드는 아래에서 자세히 설명할 예정이므로 서버에 요청을 전달할 때

요청의 목적을 명시하는 역할으로만 이야기하겠다.

 

2. Request target

요청을 전송하는 목적지 서버의 주소이다.

 

3. HTTP version

HTTP 버전을 명시한다.

 

headers

request에 대한 추가적인 정보를 담고 있다.

host, accept-language 등 서버의 정보나 사용 언어 등을 나타낸다

 

empty line

CF(carriage return): '\r'으로 표시되며 일반적으로 맨 앞으로 이동하라는 뜻이다.

LF(line feed): '\n'으로 표시되며 일반적으로 new line, 즉 새로운 라인이라는 뜻이다.

empty line은 <CF><LF>로 이뤄져 있으며,

empty line으로 구성 요소를 구분하므로 요청 내용과 헤더 뒤는 <CF><LF>로 끝나야 한다.

 

body

HTTP request로 전달되는 데이터를 가지고 있다.

 

HTTP 메소드

HTTP는 여러 개의 메소드를 가지고 있다.

아래 표는 해당 메소드를 정리한 결과이다.

주로 사용하는 메소드는 GET, POST, PUT, DELETE로

GET은 자원에 대한 요청, POST는 새로운 자원 생성,

PUT은 자원에 대한 변경, DELETE는 자원의 삭제를 의미한다.

 

이때, Idempotent(멱등법칙 또는 멱등성)는 중요한 개념인데

수학이나 전산학에서 연산의 한 성질을 나타내는 것으로

연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.

 

GET은 자원에 대한 요청만 하므로 자원에 대한 요청을 아무리 많이 해도

서버의 상태는 변화하지 않는다.

하지만, POST의 경우 자원을 새롭게 생성(write)하므로

해당 명령어를 1만 번 수행했을 경우 새로운 자원이 1만 개가 생성된다.

즉, 서버의 상태가 변화하여 멱등성이 성립하지 않는다.

 

HTTP 서버 응답 메세지

 

클라이언트가 서버에 요청을 보내면 서버는 클라이언트에게 응답 메세지를 보낸다.

이 응답 메세지는 status line, headers, empty line, body로 이뤄져있다.

 

status line

HTTP 응답을 간략하게 나타내주는 부분으로

HTTP version과 상태 코드, reason message를 포함한다.

 

headers

request와 비슷하며, Content-Type를 통해 현재 데이터의 타입을 보여준다.

 

HTTP Response Status Code

  • 200 OK: 응답이 성공적으로 오는 경우이다.
  • 301 Moved Permanently: file의 symbolic을 맞춰 준다.
  • 400 Bad Request
  • 404 Not Found
  • 505 HTTP Version Not Supported

HTTP 요청과 응답의 과정

1. 클라이언트와 서버가 TCP 소켓을 생성한다.

2. 클라이언트가 HTTP GET 메세지는 서버로 전송한다.

3. 서버는 HTTP 응답 메세지를 클라이언트로 전송한다.

4. 서버는 요청 객체를 클라이언트로 전송한다.

  -> HTTP는 상태가 없으므로 상태 유지를 하지 못한다.

       따라서 세션 정보(cookie)를 통해 상태를 유지할 수 있다.

 

HTTP 서버, 클라이언트 만들기

전통적 방법: socket API, TCP socket을 이용한 HTTP 요청 파싱과 응답 모듈 개발

web frame: Python Django/Flask, Java Netty/Spring, js Node.js ect...


출처 및 참고

https://ko.wikipedia.org/wiki/URL

https://hahahoho5915.tistory.com/62

https://jw910911.tistory.com/90

반응형
LIST

'Computer Science > 컴퓨터네트워크(ComNet)' 카테고리의 다른 글

[컴네/CN] 인터넷 성능  (1) 2023.11.28
[컴네/CN] IP Address  (0) 2023.10.14
[컴네/CN] 프로토콜 및 소켓  (1) 2023.10.14
[컴네/CN] HTTP와 Cookie  (0) 2023.10.14
[컴네/CN] HTTP 버전  (2) 2023.10.13