[Day58] Node.js - HTTP Request

Validator·2023년 9월 5일
0
post-thumbnail

HTTP Request

HTTP는 HyperText Transfer Protocol의 약자로, 웹에서 정보를 주고받는 방법이다. 웹 브라우저와 웹 서버 사이에서 데이터를 주고받을 때 사용한다. HTTP 요청(Request)은 여러 종류가 있으며, 각각 다른 목적으로 사용된다.

  1. GET
    GET 요청은 웹 서버에게 정보를 조회하도록 요청하는 방식이다. 웹 브라우저 주소창에 URL을 입력하고 Enter를 누를 때 발생하는 것이 대표적인 GET 요청이다. 예를 들면, 집에서 가장 가까운 학교를 찾고 싶다면 '가장 가까운 학교 어디야?'라고 물어보는 것과 같다.
GET /school/nearby
  1. POST
    POST 요청은 웹 서버에게 새로운 정보를 생성하도록 요청하는 방식이다. 웹 사이트에서 회원 가입을 할 때나 게시판에 글을 쓸 때 사용한다. 집에 새로운 가구를 사다 놓는 것과 비슷하다.
POST /users/signup
{
  "username": "john_doe",
  "password": "mypassword123"
}
  1. PUT
    PUT 요청은 웹 서버에게 기존의 정보를 수정하도록 요청하는 방식이다. 회원 정보 수정 같은 기능에서 사용된다. 기존에 있던 가구를 다른 새로운 가구로 바꾸는 것과 비슷하다.

PUT /users/john_doe/profile

{
  "email": "john_doe@email.com",
  "address": "1234 Elm Street"
}
  1. DELETE
    DELETE 요청은 웹 서버에게 특정 정보를 삭제하도록 요청하는 방식이다. 게시글 삭제나 회원 탈퇴 같은 기능에서 사용된다. 불필요한 가구를 집에서 버리는 것과 비슷하다.
DELETE /posts/123
  1. HEAD
    HEAD 요청은 GET 요청과 유사하지만, 본문(body)의 내용 없이 헤더(header)만을 요청하는 방식이다. 웹 페이지의 정보나 웹 서버의 상태를 확인할 때 사용된다. 집 안을 들여다보기만 하고 안에 들어가지 않는 것과 같다.
HEAD /school/nearby
  1. PATCH
    PATCH 요청은 PUT과 비슷하게 웹 서버에게 정보의 일부를 수정하도록 요청하는 방식이다. 다만, PUT이 리소스 전체를 대체하는 반면, PATCH는 리소스의 일부만을 수정한다. 가구의 한 부분이 망가졌을 때, 그 부분만 수리하는 것과 비슷하다.
PATCH /users/john_doe/profile
{
  "email": "new_john_doe@email.com"
}
  1. OPTIONS
    OPTIONS 요청은 웹 서버가 어떤 HTTP 메서드들을 지원하는지 조회할 때 사용하는 요청 방식이다. 이것은 마치 어떤 가게에 어떤 물건들이 있는지 먼저 물어보는 것과 비슷하다.
OPTIONS /posts

HTTP 요청의 구성 요소

HTTP 요청은 크게 메서드, 헤더, 본문으로 구성된다.

메서드: HTTP 요청의 종류를 나타낸다. (GET, POST, PUT, DELETE 등)
헤더: 요청과 관련된 메타데이터를 포함한다. 예를 들면, 인증 정보, 쿠키, 서버와 클라이언트의 정보 등이 포함될 수 있다.
본문: 실제로 서버에게 전송하려는 데이터를 포함한다. GET 요청을 제외한 대부분의 요청에서 본문이 포함된다.

RESTful API와 HTTP 요청

웹 서비스를 제공하는 방법 중 하나로 RESTful API라는 개념이 있다. 이는 웹 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 HTTP 요청을 통해 수행할 수 있게 설계된 API를 의미한다.

RESTful API를 디자인할 때는 각 리소스와 연관된 HTTP 메서드를 사용하여 해당 리소스에 대한 작업을 명확하게 표현한다. 예를 들면:

게시글 생성: POST /posts
게시글 조회: GET /posts/{postId}
게시글 수정: PUT /posts/{postId}
게시글 삭제: DELETE /posts/{postId}

이렇게 RESTful API를 디자인하면 API를 사용하는 개발자가 HTTP 요청의 메서드만 보더라도 해당 요청이 어떤 작업을 수행하는지 쉽게 이해할 수 있다.

웹 개발에서 HTTP 요청은 매우 중요한 개념이다. 사용자의 요청을 서버에 전달하고, 서버의 응답을 사용자에게 전달하는 중심적인 역할을 한다. 각 HTTP 요청 메서드는 명확한 목적을 가지고 있으며, 이를 알고 사용하면 웹 서비스의 기능을 효과적으로 구현할 수 있다.


HTTP 상태 코드

HTTP 요청이 서버에 전달되고 처리될 때, 서버는 응답을 돌려준다. 이 응답에는 상태 코드(Status Code)가 포함되어 있어 클라이언트에게 요청의 처리 결과를 알려준다. 상태 코드는 3자리 숫자로 이루어져 있으며, 그 의미에 따라 여러 가지로 나뉜다.

  1. 2xx: 성공
    200 OK: 요청이 성공적으로 처리되었다는 것을 나타낸다.
    201 Created: 요청이 성공적으로 처리되었으며, 새로운 리소스가 생성되었다는 것을 알린다.

  2. 3xx: 리다이렉션
    301 Moved Permanently: 요청한 리소스의 URL이 영구적으로 변경되었다는 것을 알려준다.
    302 Found: 요청한 리소스의 URL이 임시적으로 변경되었다는 것을 나타낸다.

  3. 4xx: 클라이언트 오류
    400 Bad Request: 서버가 클라이언트의 요청을 이해할 수 없다는 것을 나타낸다.
    401 Unauthorized: 클라이언트가 인증되지 않았다는 것을 알려준다.
    403 Forbidden: 클라이언트의 요청이 금지되었음을 나타낸다. 인증과는 상관없이 접근이 허용되지 않음을 의미한다.
    404 Not Found: 서버가 요청한 리소스를 찾을 수 없다는 것을 나타낸다.

  4. 5xx: 서버 오류
    500 Internal Server Error: 서버 내부 오류로 인해 요청을 처리할 수 없다는 것을 나타낸다.
    503 Service Unavailable: 서버가 일시적으로 요청을 처리할 수 없다는 것을 알려준다.

HTTP 헤더

HTTP 요청과 응답에는 여러 정보가 포함되어 있다. 이 정보 중에서 키와 값의 쌍으로 이루어진 부분을 헤더(Header)라고 한다. 헤더는 클라이언트와 서버 간의 통신에서 많은 정보를 전달한다.

예를 들어, 클라이언트가 어떤 언어의 응답을 원하는지, 서버에 어떤 기능을 지원하는지, 쿠키, 인증 정보 등 다양한 데이터가 헤더를 통해 전달된다.

대표적인 HTTP 헤더에는 다음과 같은 것들이 있다:

Accept: 클라이언트가 이해할 수 있는 컨텐츠 유형을 나타낸다.
Content-Type: 본문의 미디어 유형을 나타낸다. 예: text/html, application/json.
User-Agent: 클라이언트(대개 웹 브라우저)의 정보를 제공한다.
Authorization: 클라이언트의 인증 정보를 전달한다.
Cookie: 서버에 저장된 클라이언트의 정보를 포함한다.

웹의 동작 원리

HTTP는 웹의 기본적인 동작 원리를 이해하는 데 중요한 역할을 한다. 사용자가 웹 브라우저 주소창에 URL을 입력하면, 웹 브라우저는 해당 URL의 웹 서버에 HTTP 요청을 보낸다. 이 요청에는 사용자가 원하는 작업을 나타내는 HTTP 메서드와, 요청에 대한 부가 정보를 담은 헤더, 필요한 경우 본문 데이터가 포함된다.

웹 서버는 이 요청을 받아 처리하고, 처리 결과를 HTTP 응답으로 돌려준다. 이 응답에는 처리 결과를 나타내는 상태 코드, 응답에 대한 부가 정보를 담은 헤더, 실제 응답 데이터를 담은 본문이 포함된다.

웹 브라우저는 받은 HTTP 응답을 해석하여 사용자에게 적절한 형태로 화면에 표시한다. 이렇게 HTTP 요청과 응답을 통해 웹 브라우저와 웹 서버 간의 통신이 이루어지며, 사용자는 웹의 다양한 서비스를 이용할 수 있다.

웹 기술은 HTTP를 중심으로 발전해왔다. 사용자의 요청을 서버에 전달하고, 서버의 처리 결과를 사용자에게 돌려주는 이 간단한 메커니즘을 통해 다양한 웹 서비스가 제공되고 있다. 웹 개발을 하려면 HTTP의 기본 원리와 요청 메서드, 상태 코드, 헤더 등의 개념을 잘 이해해야 한다.

0개의 댓글