MoonjuLee 2024. 2. 18. 23:44

이번 글은 개발을 하며 단편적으로만 알던 HTTP를 조금 더 확장시켜 이해한 내용들입니다.

 

HTTP란?

 

약자로 풀어보면 HyperText Transport Protocol, HyperText는 일반 텍스트가 아닌 텍스트들이 링크로 서로 연결되어 있는 것을 뜻하며 이후 Transport Protocol은 전송 규약이다.

 

 원래는 HTML 같은 것들을 전송했지만 현재는 바이너리로 변환 가능한 음성, 파일, JSON 등의 거의 모든 데이터 형태를 전송 가능하다.

 

HTTP의 특징

 

  • 클라이언트 - 서버 구조 : 클라이언트가 서버에게 요청을 보내고 서버가 그 요청에 대한 응답을 보내기 전까지 대기한다. 이런 구조는 각자가 독립적으로 발전할 수 있다.
  • 무상태 : 서버가 클라이언트의 이전 상태를 모른다. 반대로 상태 유지는 서버가 클라이언트의 이전 상태를 안다는 것이고, 이런 경우 중간의 상태를 모르는 서버로 바뀐다면 오류가 발생한다. 무상태의 한계는 상태 유지보다 많은 데이터를 전송하고, 어쩔 수 없이 이전 상태를 기억해야 하는 로그인 등의 상황이 있을 경우이다.
  • 비연결성 : 클라이언트는 요청을 한 후 응답을 받으면 연결을 끊는다. 만약 연결을 끊지 않고 유지한다면 자원을 계속 낭비하게 된다. 효율적인 통신을 위해 HTTP persistent connection 같은 것을 사용한다.
  • HTTP 메시지 : 클라이언트가 요청을 하고 서버가 응답을 할 때 규약에 맞는 구조로 메시지를 보낸다. (밑에서 알아보자!)
  • 단순함, 확장 가능

 

HTTP 메시지

 

 먼저 HTTP 메시지의 구조는 아래의 이미지와 같습니다.

 

http message

 

 해당 메시지 구조에서 요청 메시지와 응답 메시지를 살펴보겠습니다.(요청 메시지와 응답메시지는 위의 이미지와 같은 구조를 가지고 있습니다!)

 

HTTP 요청 메시지

 

 start-line은 HTTP 메소드(이후 설명 예정! GET, POST 등등.) (공백) path(요청 대상) (공백) http version(HTTP/1.1, HTTP/2.0 등등.)으로 구성된다.

 

 hearder 부분에는 host, 이후 공백 라인과 message body가 들어갈 수는 있지만 잘 사용되지 않는다.

이와 같은 형태를 이미지로 본다면 아래와 같다.

 

http 요청 메시지

 

HTTP 응답 메시지

 

 start-line은 HTTP version (공백) 상태코드와 reason message로 구성된다.

 

 hearder 부분에는 HTTP 전송에 필요한 모든 부가 정보 content-type, content-length 등을 표시한다.

 

 공백 이후에는 message body로 실제 전송할 데이터를 보낸다. 이와 같은 형태를 이미지로 본다면 아래와 같다.

 

http 응답 메시지

 

HTTP 메소드

 

 위의 HTTP 요청 메시지 설명에서 start-line 첫 번째에 나타내는 HTTP 메소드(GET)는 HTTP 요청 메소드라고도 정의하며, HTTP 동사라고 부르기도 합니다. 그 이유는 리소스가 수행하길 원하는 행동을 나타내는 것이 때문입니다.

 

종류

  • GET : 리소스 조회, 서버에 전달할 데이터는 쿼리 스트링(파라미터)을 통해 전달, 캐싱
  • POST : 요청 데이터 처리, message body를 통해 서버로 요청 데이터 전달, 주로 신규 리소스 등록 등에 사용
  • PUT : 리소스 완전 대체, 있으면 대체, 없으면 생성, 클라이언트가 리소스 위치를 알고 URI 지정(리소스를 특정해서 대체할 수 있어야 해서)
  • PEACH : 리소스 부분 수정
  • DELETE : 리소스 삭제
  • HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메소드)을 설명(주로 CORS에서 사용)
  • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 실행