HTTP(HyperText Transfer Protocol)란 무엇일까. 먼저 HTTP라는 이름을 뜯어보자. Protocol은 어떤 규약, 규칙을 의미하고, Transfer는 무언가를 전송한다는 의미를 가진다. 무언가를 전송하는 규약, 그 무언가는 HyperText라고 한다.
여기서 하이퍼텍스트는 위키백과에 따르면 참조를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트라고 한다. 즉 하이퍼텍스트는 우리가 인터넷에서 매일매일 사용하는 링크를 의미한다. 결과적으로 HTTP란 링크를 전송하는 규약이라고 볼 수 있다.
링크를 전송하는데 왜 규약이 필요할까? 우리는 네트워크라는 축복 아래 전세계가 바로 옆에 있는 것처럼 연결될 수 있게 되었다. 그런데 모든 사람이 다른만큼 각각의 사람들이 하이퍼텍스트를 전송하려는 방식도 달라질 수 밖에 없다.
이게 어떤 느낌이냐면, 해외에 있는 이름 모를 아랍인한테 이메일이 왔다고 해보자. 만약 그때 아랍인이 아랍어로 메일을 써왔다면, 아랍어를 모르는 나는 거기에 로또 당첨 번호가 써있다해도 알 수가 없다. 말 그대로 서로 통신은 했지만 서로의 요청과 응답을 알 수가 없는 상황이 되는거다. (물론 구글 번역을 쓰면 알 수 있지만 그건 제외)
그렇기 때문에 모든 사람들이(서버들이) 정상적으로 통신을 하기 위해서는 통신을 위한 규칙이 필요하다. 언어로 따지면 문법이 필요한 것이다. 그래서 팀 버너스리라는 분이 HTTP라는 규약을 만들어 전세계가 같은 규칙 아래 통신을 할 수 있게 되었다. 이제 그 규칙에 대해 알아보자.
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을 사용함
요청에 대한 메타 데이터이자 추가 정보를 담고 있으며, 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 예시. json 형태로 작성된 데이터
{
"email": "email03",
"password": "password03"
}
특정 유형의 HTTP 요청이나 특정 HTTP 헤더를 수신했을 때 응답하는 구조. 주요 항목은 아래와 같다.
응답 상태를 알려주는 메시지를 담고 있다.
# 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로 반환해줌. 프론트와 백엔드 간의 통신으로 동작