[네트워크] HTTP

zunzero·2022년 9월 21일
0

CS

목록 보기
7/8

HTTP

HTTP는 HyperText Transfer Protocol의 약자로 서버-클라이언트 모델을 따르면서 request/response 구조로 웹 상에서 정보를 주고받을 수 있는 프로토콜이다.
이는 TCP/IP 기반으로 작동하며, Connectionless와 Stateless 2가지 특성이 있다. (HTTP3은 UDP를 기반으로 작동한다고 알려짐.)

HTML, TEXT, IMAGE, 음성, 영상, 파일 JSON, XML등의 거의 모든 형태의 데이터를 전송할 수 있다.
HTTP는 서버에 연결 후 요청에 응답을 받으면 연결을 끊어버리는 Connectionless 특성을 갖는다.
이로 인해 클라이언트의 이전 상태(로그인 유무 등)를 알 수 없다는 Stateless라는 특성 또한 갖게 된다.
클라이언트의 상태를 유지하지 않기 때문에 요청마다 정보를 모두 새로 보내야 하지만, 그렇기 때문에 서버를 바꿔야하는 상황이나 서버를 증설해야하는 상황에 문제가 발생하지 않는 것이다.
Connectionless와 Stateless한 HTTP의 단점을 해결하기 위해 도입된 것들이 쿠키, 세션, JWT 같은 것들이다.

request message는 start line(method, path, HTTP ver), headers, body로 이루어져 있다.
response message는 status line(HTTP ver, status code, status message), headers, body로 이루어져 있다.

HTTP는 정보를 text 형식으로 주고받기 때문에 중간에 인터셉트할 경우 데이터 유출이 발생할 위험이 있다.
이를 해결하고자 HTTP에 암호화를 추가한 프로토콜이 바로 HTTPS이다.

Request Method

대표적인 method로 get, post, put, patch, delete 등이 있다.

  1. GET: 리소스 조회
    GET method는 클라이언트가 서버에게 정보(리소스)를 요청할 때 사용하는 method이다.
    url 주소 끝에 key-value 쌍의 Query String을 포함하곤 한다.
    GET의 중요한 특징 중 하나는 캐시가 가능하다는 것이다.
    한 번 서버에 GET 요청을 한 적이 있다면 브라우저가 그 결과를 저장해두고, 동일 요청에 대해 브라우저에 저장된 값을 사용할 수 있다.

  2. POST: 요청 데이터 처리(주로 생성)
    POST method는 클라이언트가 body를 통해 전달한 데이터를 서버가 처리하도록 요청하는 method이다.
    서버는 리소스 등록 뿐 아니라 다양한 처리를 시행한다. (데이터를 생성하거나 변경 혹은 특정 프로세스 처리)

  3. PUT: 리소스 대체, 해당 리소스 없으면 생성
    PUT method는 개인적으로 헷갈리게 사용할 당시 위험한 method라고 생각한다.
    서버의 리소스를 업데이트하는 메서드이다.
    이는 body에 담긴 값으로 리소스를 대체해버린다.

  4. PATCH: 리소스 일부분 수정
    PATCH method는 PUT method와 마찬가지로 서버의 리소스를 업데이트하는 메서드이다.
    하지만 이는 body에 담긴 항목의 값만 업데이트 한다.

아래 예제를 살펴보도록 하겠다.

user?id=10
// data
{
	name: test,
    age: 20
}
// put request
{
	name: zunzero
}
// data
{
	name: zunzero
}    

첫 번째 예시는 PUT method 관련 예시이다.
기존 리소스는 name: test, age: 20이라는 값으로 서버에 저장이 되어있었다.
PUT request를 통해 name을 zunzero로 바꾸라는 요청을 보낸 후 서버의 데이터는 name만 zunzero로 바꾸고 age 항목은 사라지도록 바뀌어버렸다.
이는 request body 값으로 서버의 데이터가 완전히 대체되어버렸음을 의미한다.

user?id=10
// data
{
	name: test,
    age: 20
}
// patch request
{
	name: zunzero
}
// data
{
	name: zunzero,
    age: 20
}    

PATCH method 예시의 경우는 위와 다르다.
요청 값으로 name의 변경값만 보냈고, 그 항목에 해당하는 값만 바뀌고 나머지 항목은 그대로 유지되었다.

Status Code

HTTP status code는 클라이언트가 보낸 HTTP 요청에 대한 서버의 응답 코드이다.
이를 통해 요청의 성공/실패 여부를 판단할 수 있다.
우리는 주요한 상태 코드만 알아보도록 하겠다.

  • 1xx (정보): 요청을 받았으며 작업을 계속한다.
  • 2xx (성공): 클라이언트가 요청한 동작을 성공적으로 수신하여 이해했고 성공적으로 처리하였다.
    - 200: OK (요청 성공)
    • 201: Created (리소스 생성 성공)
  • 3xx (리다이렉션): 요청을 완료하기 위해 추가 작업 조치가 필요하다.
  • 4xx (클라이언트 오류): 클라이언트의 요청에 문제가 있다.
    - 400: Bad Request (요청 데이터의 형식이 올바르지 않다.)
    • 401: Unauthorized (인증되지 않은 상태에서 인증이 필요한 리소스에 접근함.)
    • 403: Forbidden (인증된 상태에서 권한이 없는 리소스에 접근함.)
    • 404: Not Found (요청한 route 없음, 찾는 리소스 없음.)
  • 5xx (서버 오류): 서버가 유효한 요청의 수행을 실패했다.
    - 500: Internal Server Error
    • 502: Bad Gateway

웹 브라우저 동작 방식

HTTP는 TCP/IP 기반으로 동작한다.
HTTP 요청과 응답은 어떤 과정을 통해 오고갈까?

  1. 유저가 브라우저에 www.google.com(URL)을 입력하면 HTTP request message를 생성한다.
  2. IP 주소를 알아내기 위해 DNS lookup을 통해 해당 domain의 서버 IP 주소를 알아낸다.
  3. 반환된 IP 주소(구글의 서버 IP)로 HTTP request message 전송 요청을 한다.
    • 생성된 HTTP 요청 메시지를 TCP/IP층에 전달한다.
    • HTTP 요청 메시지에 헤더를 추가해서(캡슐화) TCP/IP 패킷을 생성한다.
  4. 해당 패킷은 전기신호로 랜선을 통해 네트워크로 전송되고 목적지 IP에 도달한다.
  5. 구글 서버에 도착한 패킷은 unpacking(역캡슐화)을 통해 message를 복원하고 서버의 프로세스에 보낸다.
  6. 서버의 프로세스는 HTTP 요청 메시지에 대한 response data를 가지고 HTTP response message를 생성한다.
  7. HTTP response message를 전달받은 방식 그대로 클라이언트의 IP로 전달한다.
  8. HTTP response message에 담긴 데이터를 토대로 웹 브라우저에서 HTML 렌더링을 하여 모니터에 검색창을 띄운다.
profile
나만 읽을 수 있는 블로그

0개의 댓글