HTTP 구조 및 핵심 요소

성정민·2020년 5월 13일
0

HTTP(HyperText Transfer Protocol)

Transfer : ~를 전송하기 위한
Protocol : ~하기로 상호간의 약속한것

하이퍼텍스트(HTML)문서를 교환하기 위해 만들어진 통신규약(protocol)

  • HTTP란 웹상에서 네트워크로 서버끼리 통신을 할 때 어떠한 형식으로 서로 통신을 하자고 규정해놓은 통신 형식 혹은 통신 구조를 뜻한다.
  • 프론트앤드와 백앤드 서버간의 통신 || 백앤드와 프론트앤드 서버간의 통신에도 사용된다.
  • HTTP는 TCP/IP 기반으로 되어있다.
    꼭 HTTP를 쓰지 않아도 된다. FTP(File Transfer Protocol)같은걸 쓸 수도 있다.

HTTP의 통신 방식

1) 요청과 응답

  • HTTP는 기본적으로 요청/응답(request/response)구조로 되어있다.
  • 요청을 하고 응답을 하는것이 하나의 통신이다.
  • 클라이언트와 서버의 모든 통신이 요청과 응답으로 이루어 진다.

2) Stateless

  • 말그대로 state(상태)를 저장하지 않는다

HTTP통신은 굉장히 이기적이다. 요청이 오면 그에 응답을 할 뿐 이전에 했던 통신을 하지 못한다.
이전의 통신을 저장하지 않는다. 네이버와 HTTP통신을 20번 했더라도 하나도 기억을 못한다.
HTTP는 여러 요청/응답끼리 연결되어 있지 않다.
로그인을 했지만, 다른 통신은 로그인을 했다는 사실 조차 기억하지 못한다.

그럼 이걸 어떻게 해결하지?

요청을 보낸 사람이, 요청을 보낸 사람이라는 정보를 해당 요청에 첨부,저장해서 보낸다!
이러면 이걸 브라우저의 쿠키(긴정보)나 세션(메모리상에 저장. 브라우저를 끄면 사라짐)에 저장한다.


HTTP Request 구조

HTTP Ruest 메세지는 크게 세부분으로 나뉘어져있다

  • Start Line : 말 그대로 HTTP의 첫 라인
    • HTTP Method : 해당 리퀘스트가 의도한 액션을 정의하는 부분 (GET, POST등)
    • Request target : 해당 request가 전송되는 목표 uri (/login)
    • HTTP Version : 사용되는 버전. (1.0, 1.1, 2.0 등이 있다)
      GET /serch HTTP/ 1.1
  • Header : 해당 request의 추가 정보를 담고 있는 부분
    key : value으로 이루어져있다. (HOST: google.com)
    • Host : 요청이 전송되는 서버의 도메인 ex)google.com
    • User-Agent : 요청을 보내는 클라이언트의 대한 정보 : 예를 들어 웹브라우저에 대한 정보
      우리가 어떤 컴퓨터를 쓰는지, 어떤 사이트에서 어떤 쇼핑을 했는지 retargeting 해서 관련 맞춤 광고를 띄우는데 사용된다. 크롬을 더이상 이 정보를 보내지 않겠다고 선언했다고...
    • Accept : 해당 요청이 받을 수 있는 응답 타입을 지정해주는것 ex) gzip, deflate
    • Accept-Encoding: 데이터가 크면 압축을 해서 보내는데, 사용 가능한 압축 확장자를 알려준다.
    • Connection : 해당 요청이 끝난 후 서버와의 네트워크 연결을 유지/종료의 정보
    • Content-Type : 해당 요청이 보내는 body의 타입. JSON을 보내면 application/json
    • Content-Length : body 메세지의 길이
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3
  • Body : 해당 리퀘스트의 실제 메세지와 보낼 내용
    • Body가 없는 Request도 있다 예를 들어, 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
{
    "imp_uid": "imp_1234567890",
    "merchant_uid": "order_id_8237352",
    "status": "paid"
}

HTTP Response 구조

request와 마찬가지로 크게 3부분으로 구성되어 있다.

  • Status line : Response의 상태를 간략하게 나타내주는 부분

    • Status code: 응답 상태를 나타내는 코드. 숫자로 되어 있는 코드.
      예를 들어, 200
    • Status text: 응답 상태를 간략하게 설명해주는 부분. 사람이 응답상태를 숫자로만 이해하기 힘들기 때문에 글로 표기
      예를 들어, Not Found
      HTTP/1.1 404 Not Found
  • Headers : Response의 headers와 동일하다.
    - 다만 response에서만 사용되는 header 값들이 있다.
    예를 들어, User-Agent 대신에 Server 헤더가 사용된다.

  • Body : Response의 body와 일반적으로 동일하다.
    - Request와 마찬가지로 모든 response가 body가 있지는 않다.
    데이터를 전송할 필요가 없을경우 body가 비어있게 된다.

구조확인#############################################

HTTP/1.1 404 Not Found
Connection: close
Content-Length: 1573
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 07:59:05 GMT
<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>

HTTP Method

  • GET
    - 말그대로 데이터를 요청 보내는 것
    • 가장 많이 사용되는 메소드 중에 하나
    • 데이터 수정, 삭제 하지 않고 데이터를 받아올 때만 사용
    • 보내줄 데이터가 없기 때문에 Body가 비어있을 수 있믕
  • POST
    - 데이터 수정, 삭제, 추가를 할때 사용되는 메소드
    • 수정, 삭제, 추가를 하기 때문에 리퀘스트 body가 포함된다
  • DELETE
    - 특정 정보를 삭제 요청하는 메소드
  • PUT
    - POST에 밀려 잘 안쓰임

HTTP Status Code

  • 200 OK
    - 가장 자주 보게되는 status code.
    - 문제없이 다 잘 실행 되었을때 보내는 코드.
  • 301 Moved Permanently
    - 해당 URI가 다른 주소로 바뀌었을때 보내는 코드.
    - HTTP/1.1 301 Moved Permanently
    - Location: http://www.example.org/index.asp
  • 400 Bad Request
    - 해당 요청이 잘못된 요청일대 보내는 코드.
    - 주로 요청에 포함된 input 값들이 잘못된 값들이 보내졌을때 사용되는 코드.
    - 예를 들어, 전화번호를 보내야 되는데 text가 보내졌을때 등등.
  • 401 Unauthorized
    - 유저가 해당 요청을 진행 할려면 먼저 로그인을 하거나 회원 가입을 하거나 등등이 필요하다는것을 나타내려 할때 쓰이는 코드.
  • 403 Forbidden
    - 유저가 해당 요청에 대한 권한이 없다는 뜻.
    - 예를 들어, 오직 과금을 한 유저만 볼 수 있는 데이터를 요청 했을때 등.
  • 404 Not Found
    - 요청된 uri가 존재 하지 않는다는 뜻.
    • host가 아니라 request target이 잘못된것
    • host는 존재하는데 요청이 이상하다는것
  • 500 Internal Server Error
    - 서버에서 에러가 났을때 사용되는 코드.
    - API 개발을 하는 백앤드 개발자들이 싫어하는 코드.

HTTP 확실히 알고 넘어가기

  1. HTTP는 stateless이다.
  2. 백앤드 <-> 프론트앤드 간의 통신에 필요하다.
  3. HTTP가 기본적으로 요청/응답(request/response) 구조로 되어있다.
  4. 백앤드와 백앤드끼리의 요쳥에도 사용할 수 있다.
  5. 클라이언트에서 서버로 데이터를 전달하려면 HTTP request의 body에 넣어 전달한다.
  6. 클라이언트에서 서버로 받은 데이터는 HTTP response를 확인한다
  7. 클라이언트가 요청을 보내고 응답을 받은 후, 이전 응답을 확인할 수 없다.
  8. HTTP Request 메세지 중에서 해당 Request의 실제 메세지/내용이 포함된 것은 body이다.

참고링크

profile
인생을 사는 프론트앤드 개발자

0개의 댓글