HTTP 란 무엇인가

jomminii_before·2020년 2월 15일
1

HTTP(HyperText Transfer Protocol)란 무엇일까. 먼저 HTTP라는 이름을 뜯어보자. Protocol은 어떤 규약, 규칙을 의미하고, Transfer는 무언가를 전송한다는 의미를 가진다. 무언가를 전송하는 규약, 그 무언가는 HyperText라고 한다.

여기서 하이퍼텍스트는 위키백과에 따르면 참조를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트라고 한다. 즉 하이퍼텍스트는 우리가 인터넷에서 매일매일 사용하는 링크를 의미한다. 결과적으로 HTTP란 링크를 전송하는 규약이라고 볼 수 있다.

링크를 전송하는데 왜 규약이 필요할까? 우리는 네트워크라는 축복 아래 전세계가 바로 옆에 있는 것처럼 연결될 수 있게 되었다. 그런데 모든 사람이 다른만큼 각각의 사람들이 하이퍼텍스트를 전송하려는 방식도 달라질 수 밖에 없다.

이게 어떤 느낌이냐면, 해외에 있는 이름 모를 아랍인한테 이메일이 왔다고 해보자. 만약 그때 아랍인이 아랍어로 메일을 써왔다면, 아랍어를 모르는 나는 거기에 로또 당첨 번호가 써있다해도 알 수가 없다. 말 그대로 서로 통신은 했지만 서로의 요청과 응답을 알 수가 없는 상황이 되는거다. (물론 구글 번역을 쓰면 알 수 있지만 그건 제외)

그렇기 때문에 모든 사람들이(서버들이) 정상적으로 통신을 하기 위해서는 통신을 위한 규칙이 필요하다. 언어로 따지면 문법이 필요한 것이다. 그래서 팀 버너스리라는 분이 HTTP라는 규약을 만들어 전세계가 같은 규칙 아래 통신을 할 수 있게 되었다. 이제 그 규칙에 대해 알아보자.


HTTP의 특징

  1. 요청과 응답으로 이루어짐. 하나의 통신. 요청을 보내면 무조건 응답이 와야함
  2. stateless. 상태가 없음. 각 요청은 독립적이며 서로 다른 통신에 대한 정보를 저장하지 않음
    -> 3번째 요청은 2번째, 4번째 요청에 관해 알지 못함
    -> 때문에 해당 요청에 필요한 정보를 계속 첨부해서 보내야함. 예를 들어 로그인 상태를 유지하기 위해 리퀘스트 헤더에 토큰을 계속 보내 인가된 사용자임을 확인받아야함

HTTP Request 구조

startline

  • method : 요청이 요청하는 것이 무엇인지 나타내줌
    - GET, POST, DELETE, PUT 등

  • request target : 요청이 전송되는 목표 URI
    - 예를 들어 /login

  • http version : 사용하고 있는 HTTP 버전
    - 1.0, 1.1, 2.0 등이 있음

# startline 예시

POST /account/sign-up HTTP/1.1

# POST 방식의 요청이며, 
# /account/sign-up 을 목표로 하고 있으며, 
# HTTP 버전은 1.1을 사용함

headers

요청에 대한 메타 데이터이자 추가 정보를 담고 있으며, Key:Value 형태로 되어있다. Headers도 크게 general headers, request headers, entity headers 로 나뉜다. 3부분으로 구분되어 있다는 정도만 알고, 주요 항목에 대해서 살펴보자.

  • Host : 요청이 전송되는 target의 host url
    - 예를 들어 google.com

  • User-Agent : 클라이언트의 소프트웨어(브라우저, OS) 등에 대한 정보
    - 크롬 브라우저, max os 등

  • Accept : 해당 요청이 받을 수 있는 응답 타입 및 우선 순위를 알림
    - */* : 모든 타입
    -image/* : 모든 이미지 유형

  • Connection : 해당 요청이 끝난 후 클라이언트와 서버가 계속해서 네트워크 커넥션을 유지할 것인지 끊을 것인지 지시하는 부분

  • Content-Type : 해당 요청이 보내는 메시지 body의 타입
    - JSON을 보낸다면 application/json

  • Content-Length : 메시지 body의 길이

  • Authorization : 인증 토큰을 서버로 보낼 때 사용
    - 토큰의 종류 + 실제 토큰을 전송

# headers 예시
Accept: application/json, */*    # json 형태와 모든 미디어 타입 형태를 받을 수 있음
Accept-Encoding: gzip, deflate
Connection: keep-alive           # 요청이 끝나도 커넥션 유지
Content-Length: 46               # body에 담긴 컨텐츠 길이는 46
Content-Type: application/json   # body로 보내는 컨텐츠 타입은 json
Host: localhost:8000             # host 는 localhost:8000
User-Agent: HTTPie/2.0.0         # 클라이언트는 HTTPie/2.0.0을 사용하고 있음

참고로 특정 사이트에 들어가서 잘못된 주소로 들어가도 에러 페이지가 나는게 아니라 특정 사이트가 만든 특정 에러페이지가 나는 이유는 Host가 지정되어있기 때문이다. 예를 들어 https://www.naver.com/adfkfkjekqk 와 같이 Host 뒤에 이상한 타겟 주소를 붙여도 네이버가 설정한 '페이지를 찾을 수 없습니다' 페이지로 가는 이유는 www.naver.com이 host 로 지정되었기 때문.


body

  • 요청에 들어가는 실제 데이터가 작성되는 곳
# body 예시. json 형태로 작성된 데이터

{
    "email": "email03",
    "password": "password03"
}

HTTP Response 구조

특정 유형의 HTTP 요청이나 특정 HTTP 헤더를 수신했을 때 응답하는 구조. 주요 항목은 아래와 같다.

status line

응답 상태를 알려주는 메시지를 담고 있다.

  • Http version : 사용된 HTTP 버전
  • Status code : 응답의 상태를 알려주는 코드
    - 200, 500 등
  • Status text : 사람이 보기 좋게 응답의 상태를 텍스트로 알려줌
    - OK, Server error 등

headers : metadata

  • Server : 서버 소프트웨어 정보
  • Date : 응답 시간

body

  • 실제 데이터
# HTTP Response 예시

# status line
HTTP/1.1 200 OK

# headers
Content-Length: 120
Content-Type: application/json
Date: Sat, 15 Feb 2020 14:16:20 GMT
Server: WSGIServer/0.2 CPython/3.8.1
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

# body
{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImVtYWlsMDMifQ.KVrxNWlOMxQlJ8oUsnxsqv-_BSPv0HQZLrqrAYbrghM"
}

엔드포인트(endpoint)?

  • end 는 host라고 볼 수 있고, 그 뒤에 있는 특정 지점이 point. 합쳐서 엔드포인트
  • request target과 같다고 보면 됨
  • 백엔드 api 처럼 기능을 가져와야하는 원격 기능들이 위치한 상세 주소

백엔드 API ?
특정 로그인 기능을 사용하겠다 하면 백엔드에 http 요청으로 로그인 기능 함수를 요청한다. 이 함수에서 반환 값이 나오면 그 값을 response로 반환해줌. 프론트와 백엔드 간의 통신으로 동작


참고자료

profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글