컴퓨터 네트워크/웹

HTTP의 구조 및 핵심 요소

:) :) 2023. 6. 20. 16:51

<깔끔한 파이썬 탄탄한 백엔드 책 참조>

 

1. HTTP 통신방식

HTTP의 통신 방식에는 2가지 특징이 있다.

  •  요청, 응답 방식
  • stateless

1-1. HTTP 요청과 응답

 클라이언트가 서버에 요청한 정보를, 서버는 클라이언트에게 응답 해주는 방식이다.

request - response 방식.

 

1-2. stateless

 HTTP 통신은 상태가 없음(stateless)의 특징을 가진다. 모든 통신(요청-응답 과정)은 독립적이다. 동일한 클라이언트와 동일한 서버간에서의 통신들이어도 독립적이라는 특징을 가진다. 이 덕에 서버 디자인이 훨씬 간단해지고 효과적이게 된다.

그러나 매 번 통신에 필요한 모든 정보를 담고 요청-응답을 해야 하는 단점이 있기는 하다(예를 들어, 로그인 한 후의 로직은 로그인 정보를 함께 담아 통신해야 한다).

 

이러한 문제점을 보완하기 위해 session, cookie라는 개념을 만들었다.

추가 정보들을 담는 파일을 의미하는데

  • cookie
    • 웹 브라우저, 클라이언트 측에서 데이터를 저장
  • session
    • 서버 측에서 데이터를 저장

 

2. HTTP 요청 구조

 HTTP의 요청, request는 다음과 같은 구조로 되어있다.

POST /payment-sync HTTP/1.1

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

{
	"imp_uid": "imp_1234567890",
    	"merchant_uid": "order_id_8237352",
   	"status": "paid"
}

위 request message는 크게 세 부분으로 구성되어있다.

  • 맨 첫줄의 Start Line
  • Start Line 이후, 중괄호의 Body시작 전까지의 Header
  • 중괄호로 구성된 Body

각각의 의미는 다음과 같다.

 

2-1. Start Line

 Start Line은 세 부분으로 구성되어있다.

HTTP method, Request target, HTTP version

   POST,                목표 주소,            version

POST /payment-sync HTTP/1.1

 

2-2. Headers

 HTTP 요청 그 자체에 대한 정보(메타데이터)를 담고 있다.

key:value 쌍으로 저장되어있다.

 

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
  • Host
    • request가 전송되는 target의 host url 주소를 알려주는 헤더
  • User-Agent
    • 요청을 보내는 클라이언트에 대한 정보 - ex) 웹 브라우저에 대한 정보
  • Accept
    • 해당 요청이 받을 수 있는 body의 data type에 대한 정보
  • Connection
    • 해당 요청이 끝난 후에 계속하여 클라이언트와 서버의 연결을 유지시킬건지 아닌지 확인
  • Content-type
    • HTTP 요청이 보내는 메시지 body의 type을 알려줌
  • Content Length
    • HTTP 요청의 메시지 body의 총 size를 알려줌

 

2-3. Body

 HTTP 요청이 전송하는 데이터를 담고 있는 부분. 전송하는 데이터가 없으면 body부분은 비어 있음.

 

 

3. HTTP 응답 구조

 얘도 request와 마찬가지로 크게 세 부분으로 나뉜다.

Status Line, Headers, Body 이다.

 

3-1. Status Line

404 not found라는 걸 본 적이 있는가? 이때의 404는 status code, not found는 status text를 의미한다.

HTTP/1.1 404 Not Found
  • http version
    • "HTTP/1.1"
  • http status code
    • "404"
  • http status text
    • "Not Found"

3-2. header와 body

request header와 request body와 동일한 역할을 한다.

 

 

4. 자주 사용되는 HTTP method

  •  GET
    • 어떠한 데이터를 서버로부터 요청할 때 주로 사용하는 메소드이다. 단순히 데이터를 받아올 때 사용한다.
    • 이때 HTTP요청의 body는 비어있는 경우가 많다.
  • POST
    • 데이터 생성, 수정, 삭제 요청을 할 때 주로 사용한다.
  • OPTIONS
    • 특정 엔드포인트에서 허용하는 메소드들이 뭐가 있는지 알아보기 위한 요청에서 사용된다.
  • PUT
    • 데이터를 처음 생성할 때 사용하는 메소드이나, POST로 대체가능해 잘 안쓴다.
  • DELETE
    • 데이터를 삭제할 때 사용하는 메소드이나, 이 역시 POST로 대체가능해 잘 안쓰인다.

 

 

5. 자주 사용되는 HTTP Status Code, Text

  •  200 OK
    • HTTP 요청이 문제없이 잘 처리가 됐을 때 볼 수 있는 자주 보고 싶은 친구다.
  • 301 Moved Permanently
    • HTTP 요청을 보낸 엔드포인트의 URL 주소가 변경되었다는 것을 나타내는 상태코드이다.
    • 보통 해당 엔드포인트의 새로운 주소를 담은 Location header가 HTTP 응답에 포함되는게 일반적이다.
    • 이렇게 새로운 주소에 해당 요청을 다시 보내는 것을 redirection 이라고 한다.
  • 400 Bad Request
    • HTTP 요청이 잘못된 요청일 때 보내는 응답 코드이다.
    • 주로 요청에 포함된 인풋 값들이 잘못되었을 때 주로 볼 수 있다.
  • 401 Unauthorized
    • HTTP 요청 처리를 위해 신분확인이 요구되나, 확인할 수 없었을 때 보내는 응답 코드이다.
    • 주로 로그인이 필요한 경우 401 response를 보낸다.
  • 403 Forbidden
    • HTTP 요청을 보내는 주체가 해당 요청에 대한 권한이 없음을 나타내는 응답 코드이다.
  • 404 Not Found
    • HTTP 요청을 보내고자 하는 URI가 존재하지 않을 때 보내는 응답 코드다.
  • 500 Internal Server Error
    • 내부 서버 오류가 발생했다는 것을 의미한다.