"아 그건 기존 API에 없으니 새로 요청해 주세요"
기획자도, 프론트엔드 개발자도 백엔드에 API를 요청해야 하는데 API가 무엇인지, 어떻게 해야하는지 어려운 경우가 있죠. 웹 서비스를 기획,운영,개발하는 사람이라면 알아야 하는 API ! 그 API를 잘 요청하기 위해 HTTP 프로토콜을 알고 있으면 도움이 되요!
HTTP 프로토콜이란?
Hypertext Transfer Protocol 의 약자로, 하나의 통신 프로토콜이에요. 프로토콜은 데이터를 주고 받기 위해 서로 정해놓은 규칙이 정의되어 있는 것이라고 볼 수 있을 것 같아요. 즉, "난 이렇게 줄게 > 넌 이렇게 받아 > 난 이렇게 받을게" 라고 브라우저와 서버 간에 약속한 것이라고 보면 됩니다. : )
HTTP 프로콜은 각각의 데이터 요청이 서로 독립적이라 첫번째 요청한 것이 두번째 요청한 것과 연관이 없는 구조에요. 요청을 보내고 서버에서 응답을 받으면 연결을 끊는거죠! 이런 프로토콜을 Stateless Protocol(상태가 없는 프로토콜) 이라고 합니다. 따라서 서버는 여러 요청을 처리하기 쉽고 서버의 부하를 줄일 수도 있어 성능상 좋을 수 있어요. 다만 연결을 끊기 때문에 클라이언트의 이전 상태를 알 수 없어 정보가 유지되지 않습니다. (그래서 쿠키 등 사용해서 다시 로그인 했을 때 값을 유지하고 있거나... 하는 방법 사용)
HTTP 1.1 부터는 Keep-alive 기능을 지원하여, 하나의 연결에 하나의 요청이 아닌 일정 시간동안 연결을 끊지 않고 요청을 보낼 수 있게 되었습니다.
(e.g. 하나의 요청에 하나의 응답 기준으로 설계한다면, 10개 파일을 다운로드 할 때, 연결을 했다 끊는 10번의 요청과 응답이 필요해 TCP 통신 비용 소모가 높음)
참고로, HTTP 프로토콜은 어플리케이션 레벨의 프로토콜로 TCP/IP 위에서 동작하며, 기본포트로 80번을 사용하고 있어요!
HTTP 는 클라이언트가 요청하고 서버가 응답을 주는 구조
클라이언트(Client)는 요청을 보내는 쪽을 의미하며, 웹서비스에서는 브라우저 라고 보면 됩니다. 서버(Server)는 요청 받는 쪽을 의미하며, 요청에 대한 데이터를 보내주는 역할이라고 보면 됩니다. 이를 HTTP Request, HTTP Response 로 주고 받습니다. 위 그림에서 보시면 HTTP Request와 HTTP Response 가 요청을 주고 응답을 줄 때 포함하고 있는 내용이 있어요. 그 구성을 살펴보실까요!? (●'◡'●)
HTTP Request 와 HTTP Response는 어떻게 구성되어 있을까?
HTTP Request 메시지 구조
- Request Line : 요청메소드 , 요청URL , HTTP 버전
- Request Header : 키-값 방식으로 Accept, Cookie, Content-Type, Content-Length, If-Modified-Since
- Request Body : 그 외 추가 엔티티
HTTP Response 메시지 구조
- Response Line : HTTP 버전, 상태코드, 상태메시지
- Response Header : Content-Type, Content-Length, Set-Cookie, ETag
- Response Body : HTML, JSON, Octet Stream 등
몇 가지 항목을 간단히 살펴보면
- HTTP Request Method (요청메소드)
HTTP Verbs 라고도 불리며, GET, POST, PUT, DELETE 등 메소드를 이용해 데이터를 CRUD(생성,조회,변경,삭제) 할 수 있습니다.
- 요청 URL (Uniform Resourse Locators)
서버에 요청하기 위해 입력하는 주소로 protocol, host, port, resource path, query 로 구성되어 있습니다.
- Content-Type & Body
메시지 바디에 들어있는 데이터가 어떤 형태인지 알려주어 데이터에 맞는 형식으로 읽을 수 있도록 하는 값입니다.
- FORM : URLEncoded 방식. application/x-www-form-urlencoded , body: 쿼리문자열
- JSON : application/json
- Multi-Part : 이진파일을 넘길 때 사용. 하나의 메시지 바디에 파트를 나눠서 작성. boundary는 파트 구분자, multipart/form-data: boundary=frontier
- 주요 컨텐츠 타입 ( text/plain, text/html , application/xml, application/json , image/png, image/jpg , audio/mp3, video/mp4 )
- HTTP Status Code
HTTP Response에 포함되어야 하는 정보로, 서버가 설정해줍니다. 프론트에서는 서버에서 오는 상태코드를 확인하고 에러처리를 할 수 있어요. 예를 들어, 요청을 보낸 후 돌아온 상태코드가 200 OK 인 경우, 요청한 작업이 정상적으로 완료되었다는 의미입니다. 상태코드 404 ERROR 로 온 경우 요청한 작업이 실패했다는 의미이므로 사용자가 어떻게 하면 좋을지 안내해 주면 좋겠죠!
- 1xx : 정보
- 2xx : 성공 (200 OK , 201 Created , 202 Accepted , 204 No Content 등..)
- 3xx : 리다이렉션 (300 Multiple choices , 301, 302, 303 Redirect , 304 Not Modified 등)
- 4xx : 클라이언트오류 (400 Bad Request , 401 Unauthorized , 403 Forbidden , 404 Not Found 등)
- 5xx : 서버오류 (500 Internal Server Error , 501 Not Implemented , 503 Service Unavailable 등)