All Articles

Web - HTTP 기초

HTTP란?

HyperText Transfer Protocol 줄임말로, 하이퍼텍스트 문서(HTML)를 교환하기 위해 만들어진 통신 규약(protocol)이다. 즉, 웹 상에서 클라이언트와 서버 간 혹은 서버끼리 통신을 할 때 어떤 방식으로 할지 정해놓은 규칙이다. 주소 맨 앞에 있는 http:// 가 이 프로토콜로 정보를 교환하겠다는 뜻이다.


HTTP 특징

HTTP는 클라이언트가 요청을 보내면 서버가 응답하는 요청(request) - 응답(reponse) 구조다. 클라이언트가 특정 웹 페이지나 이미지를 요청하면 서버에서 요청에 해당하는 정보를 응답해 클라이언트가 웹 페이지를 볼 수 있게 하는 식이다. 클라이언트에게 응답 후에는 연결을 바로 끊기 때문에 각 요청 - 응답은 독립적으로 이루어진다. 보통 클라이언트와 서버는 n:1 관계이므로 계속해서 연결을 유지해놓을 수가 없기 때문이다. 하지만 클라이언트의 요청을 기억해놓을 필요가 있을 때(예: 장바구니에 담은 물건)에는 쿠키나 세션을 이용한다.


HTTP Request 구조

  • Start line
  • Headers
  • Body

Start line

HTTP request 첫 줄이다. HTTP 메서드, request target uri, HTTP 버전 세 가지로 구성된다. GET www.naver.com HTTP/1.1은 브라우저 주소창에 www.naver.com을 입력해서 네이버 웹 사이트를 불러와달라는 요청을 한 것과 같다.

HTTP 메서드란 해당 request가 의도한 것이 무엇인지 정의하는 부분이다. 여러 종류가 있는데, 주로 쓰이는 것은 GETPOST 방식이다.

아주 단순하게 생각하면 이렇다.
POST - 생성 (예: 새 글 생성)
GET - 조회 (예: 검색 결과 받아오기)
PUT - 수정 (예: 댓글 수정)
DELETE - 삭제 (예: 글 삭제)
등등

request target uri란 해당 request가 전송되는 목표 uri다. https://www.naver.com/NOTICE 에서 /NOTICE 부분이다.

Headers

해당 request에 대한 추가 정보를 담고 있는 부분이다. Host, User-Agent, Accept, Connection, Content-Type, Content-Length, Date, Connection, Cache-Control, Content-Language, Content-Encoding 등의 key가 있고, 해당하는 value가 key:value 형태로 표시된다.

Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com #접속한 주소
User-Agent: HTTPie/0.9.3

Body

request 실제 내용이 담기는 부분이다. 회원 가입 시 사용자가 이름, 아이디, 비밀번호 값을 입력한다고 할 때 body에 이 정보가 담겨 POST 메서드로 서버에 전송된다. 있는 것을 불러오기만 하는 GET request는 대부분 body가 없다.

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

# body 부분
{
    "imp_uid": "imp_1234567890",
    "merchant_uid": "order_id_8237352",
    "status": "paid"
}

HTTP Response 구조

  • Status line
  • Headers
  • Body

Status line

Response 상태가 어떤지 나타내주는 부분이다. HTTP 버전, Status 코드, Status 텍스트로 구성된다. HTTP/1.1 404 Not Found라는 status line은 HTTP 1.1 버전이며 404 에러, 즉 요청한 url을 찾을 수 없다는 상태를 나타냅니다.

  • 주요 Status code와 status text

    • 200 OK: 클라이언트의 요청을 정상적으로 수행함
    • 201 Created: 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨(POST를 통한 리소스 생성 작업 시)
    • 301 Moved Permanently: 클라이언트가 요청한 리소스에 대한 uri가 변경되었을 때 사용하는 응답 코드. 응답 시 location header에 변경한 uri를 적어줘야 함
    • 400 Bad Request: 클라이언트의 요청이 잘못됐을 때 사용하는 응답 코드 (예: 전화번호를 보내야 하는데 텍스트를 보냈을 때)
    • 401 Unauthorized: 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을 때 사용하는 응답 코드 (예: 비로그인 유저가, 로그인 유저만 요청 가능한 리소스를 요청했을 때)
    • 403 Forbidden: 유저 인증상태과 관계 없이 권한이 없는 리소스를 클라이언트가 요청했을 때 사용하는 응답 코드 (예: 과금 유저만 볼 수 있는 데이터를 요청했을 때)
    • 404 Not Found: 요청한 url이 존재하지 않을 때 사용하는 응답 코드
    • 405 Method Not Allowed: 클라이언트가 요청한 리소스에서는 사용 불가능한 메서드를 이용했을 경우 사용하는 응답 코드
    • 500 Internal Server Error: 서버에 문제가 있을 경우 사용하는 응답 코드

별 건 없고 그냥 귀여우니까 보세요.

headers, body

Request headers, body와 기본적으로 동일하다. 단 body는 request와 마찬가지로 데이터를 전송할 필요가 없을 때에는 비어있다.


RESTful API

RESTful API는 REST를 통해 서비스 API를 구현한 것이다. REST란 REpresentational State Transfer의 약자로, HTTP기반으로 필요한 자원에 접근하는 방식의 일종이다.

URI란?

앞서 URI는 어떤 사이트 내에서 특정 자원의 위치를 나타내는 유일한 주소라고 설명했다. 여기서 자원이란, DB에 저장된 데이터, 이미지, 문서, 웹 상에서 일어나는 서비스 등을 말한다. 모든 자원은 클라이언트가 바로 접근할 수 있는 고유 URI를 가진다. 이 자원에는 HTTP 메소드로 접근한다.

URI 설계 규칙

  • /는 계층 관계를 나타낼 때 사용한다. https://www.naver.com/NOTICE/1는 네이버 사이트 안에 있는 공지사항 페이지 중 1번 게시글을 의미한다.
  • _보다는 -을 사용한다.
  • 영어 대문자보다는 소문자를 사용한다.
  • 가독성을 위해 너무 긴 단어는 쓰지 않는다.
  • 메서드(GET, POST 등)가 동사이므로 혼동을 막기 위해 URI는 명사를 사용한다.

기타 알아두면 좋을 것

  • 클라이언트에서 서버로 데이터를 전달하려면 HTTP request의 body에 넣으면 된다.
  • 쿠키나 세션에 응답을 저장한 경우에 한해, 이전 응답을 확인하기 위해서는 쿠키나 세션을 확인하면 된다.
  • 클라이언트에서 서버로부터 받은 데이터는 HTTP response를 확인하면 된다.
  • HTTP는 Stateless이다.
  • HTTP는 백엔드 - 프론트엔드 간의 통신에 필요하다.
  • HTTP는 기본적으로 요청/응답 (request/response) 구조로 되어있다.
  • 백엔드와 백엔드끼리 요청에도 사용할 수 있다. (서버 간 통신)
  • HTTP request 메세지 중에서 해당 request의 실제 메세지/내용이 포함된 것은 body다.
  • HTTP Response의 Status Line에서 문제없이 다 잘 실행 되었을때 보내는 status code는 200이다.
  • 카테고리 목록을 조회하는 API 엔드포인트의 올바른 HTTP 메소드와 주소는 GET, http://wecode.co.kr/category이다.
  • 회원가입하는 엔드포인트로서 적절한 것은 POST, http://wecode.co.kr/user/sign-up이다.
  • 사용자 로그인을 진행하는 엔드포인트로 올바른 메소드와 주소는 POST, http://wecode.co.kr/user/sign-in이다.
  • 1번 상품의 상세 정보를 볼 수 있는 엔드포인트의 주소와 메소드로 적절한 것은 GET, http://wecode.co.kr/product/1이다.
  • 1번 회원 정보를 수정하는 엔드포인트의 메소드로 적절한 것은 POST, PUT, PATCH다. (요즘에는 주로 POST를 사용한다.)
  • 1번 회원 정보를 수정하는 엔드포인트의 주소로 적절한 것은 http://wecode.co.kr/user/1이다.
  • 쿼리스트링 이름이 query인 검색 엔드포인트에 “위코드”를 검색하는 올바른 주소와 메소드는 GET, http://wecode.co.kr/search?query="위코드"다.

참고 링크

https://www.zerocho.com/category/HTTP/post/5b344f3af94472001b17f2da https://medium.com/@dydrlaks/rest-api-3e424716bab