Arduino :: Lecture & TIPs

[Arduino] HTTP 프로토콜과 다양한 동작 방식

프로토콜이란?

프로토콜 (Protocol) 은 컴퓨터 내부 혹은 사이에서 데이터의 교환 방식을 정의하는 규약입니다. 기기 간 통신 시 교환되는 데이터의 형식에 대해, 상호적인 합의를 요구하는데요. 이러한 형식을 정의하는 규칙의 집합을 프로토콜이라고 합니다.

HTTP (Hypertext Transfer Protocol) 는 프론트엔드 서버와 클라이언트 (브라우저 혹은 앱) 간의 통신에 사용되며, 백엔드와 프론트엔드 서버 간의 통신에도 사용됩니다.

 

HTTP 프로토콜의 특징

HTTP 프로토콜은 상태가 없는 (stateless) 프로토콜 입니다. “상태가 없다” 의 의미는 데이터를 주고 받기 위한 각각의 데이터 요청이 상호간에 독립적으로 관리가 된다는 의미인데요, 이전에 데이터를 요청했던 것과 다음 데이터 요청은 서로 관련이 없다는 의미가 됩니다.

이러한 특징으로 서버는 세션과 같은 별도의 추가 정보를 관리하지 않더라도 다수의 요청을 처리하거나 부하를 줄일 수 있는 성능 상의 장점을 가지게 됩니다.

HTTP 프로토콜은 일반적으로 TCP / IP 통신을 기반으로 동작하며, 별도로 명시되어 있지 않는 한, 기본 포트는 80 번으로 사용합니다.

 

HTTP 요청 (Request) 과 응답 (Response)

웹 뿐만 아니라 Server – Client 관계에서는 Client 단에서 요청하면 서버가 요청을 처리한 후 Client 쪽으로 응답합니다. 웹에서는 이 요청과 응답을 HTTP 방식을 통해 요청하고 응답하기로 정한 것입니다.

HTTP 프로토콜을 통해 데이터를 주고받기 위해서는 아래와 같이 요청을 보내고 응답을 받아야 합니다.

클라이언트란, 요청을 보내는 쪽을 의미하며, 일반적인 웹 관점에서는 브라우저를 의미합니다.

서버란, 요청을 받는 쪽을 의미하며 데이터를 보내주는 원격지의 컴퓨터를 의미합니다.

HTTP 통신에서 Client 는 (Chrome, Edge, Safari) 등, 그리고 Server 는 WAS (Tomcat, ZEUS 등) 을 예로 들 수 있습니다.

 

 

Http Request Message 의 구조

크게 세 가지 영역으로 구성됩니다.

 

 

 

  • start line (request line) : Http request의 첫 라인으로, 3 가지 부분으로 구성되어 있습니다.
    • HTTP Method : GET, POST 등의 action 을 정의합니다.Request target : request 가 전송되는 URI (endpoint) HTTP VersionGET /doc/test/html HTTP/1.1
  • headers : request에 대한 meta정보를 담고 있으며, key:value 값으로 이루어져 있습니다.
    • Host : 요청이 전송되는 target의 host url 을 표시합니다. (예 : google.com)
    • User-Agent : 요청을 보내는 클라이언트 (사용하는 웹 브라우저와 버전, OS 등) 에 대한 정보를 표시합니다.
    • Accept : 해당 요청이 받을 수 있는 응답 (response) 의 데이터 형식을 표시합니다.
      (조건부 요청을 허용: (accept-, If-), 모든 요청 허용:(/))
    • Connection : 해당 요청이 끝난후에 클라이언트와 서버가 계속해서 네트워크 연결을 유지 할 것인지 아니면 끊을 것인지에 대해 지시하는 부분입니다. (Keep-alive or cancel)
    • Content-Type : 해당 요청이 보내는 메세지 본문의 형식입니다. 예를 들어, JSON 을 보내면 application/json 으로 표시됩니다.
    • Content-Length : 메세지 body 의 길이를 표시합니다.
  • empty line : 요청에 대한 meta 정보가 전송되었음을 알려줍니다.
  • body :
    • 해당 request의 실제 메세지 / 내용이 포함됩니다.
    • XML 이나 JSON 데이터가 포함될 수 있습니다.
    • GET 은 본문 (body) 부분이 대부분 없습니다.

 

실제 예시 :

GET https://api.thingspeak.com/update?api_key=20RI********579A&field1=4&field2=7&field3=31.62&field4=37.352089&field5=126.715584&status=Excellent%20(1)%20:%20The%20air%20quality%20is%20excellent.%20As%20air%20pollution%20poses%20no%20threat,%20conditions%20are%20ideal%20for%20outdoor%20activities. HTTP/1.1
Host: api.thingspeak.com
Cache-Control: no-cache
Connection: close

 

 

 

  • status line : response의 상태를 간략하게 나타내며, 세 가지 부분으로 구성되어 있습니다.
    • HTTP version : HTTP 버전을 표시합니다.
    • status code : 응답 상태를 숫자로 이루어진 코드로 나타냅니다.
    • status text : 응답 상태를 설명합니다 (예 : Not Found)
  • headers :
    • request 의 header와 동일합니다.
    • response 에서만 사용되는 header 값이 있습니다. (예 : User-Agent 가 없고, Server 가 있습니다).
  • empty line
  • body : 실제 응답하는 데이터를 나타냅니다. status 2XX 의 경우, 존재하지 않는 경우가 많습니다.

 

실제 예시:

HTTP/1.1 200 OK
Date: Tue, 27 Jun 2023 15:10:15 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 3
Connection: close
Status: 200 OK
Cache-Control: max-age=0, private, must-revalidate
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 1800
X-Request-Id: 83aa3776-3fb0-4d7e-b8f8-9ac6c8ebfdc2
Access-Control-Allow-Headers: origin, content-type, X-Requested-With
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DELETE, PATCH
ETag: W/"42f25adecf47629878e89e31b2073d1a"
X-Frame-Options: SAMEORIGIN

 

URLs

URL (Uniform Resource Locators) 는 서버에 자원을 요청하기 위해 입력하는 영문주소로, 숫자로 이루어진 IP 주소에 비해 기억하기 쉽다는 장점이 있습니다.

 

URL 구조

 

HTTP 요청 메서드 (Method)

URL 을 통해 서버에 특정 데이터를 요청할 수 있습니다. 요청하는 데이터에 특정 동작을 수행하고자 한다면, HTTP 요청 메서드를 이용할 수 있는데요.

일반적으로 HTTP 요청 메서드는 HTTP Verbs 라고도 불리우며, 아래와 같이 주요 메서드를 가지고 있습니다.

 

GET : 존재하는 자원에 대한 요청

POST : 새로운 자원을 생성

PUT : 존재하는 자원에 대한 변경

DELETE : 존재하는 자원에 대한 삭제

 

이와 같이 데이터에 대한 조회, 생성, 변경, 삭제 동작을 HTTP 요청 메서드로 정의할 수 있습니다. PUT, DELETE 도 Post 방식으로 가능하며, 대부분 Get 이나 Post 방식만을 사용합니다.

 

HTTP 상태 코드

앞에서 살펴본 URL과 요청 메서드가 클라이언트에서 설정해야 할 정보라면 HTTP 상태 코드(HTTP Status Code)는 서버에서 설정해주는 응답(Response) 정보입니다.

프론트엔드 (Front-end) 개발자 입장에서는 더욱이 중요한 이유가 상태 코드로 에러 처리가 가능하기 때문입니다. 간단한 예시를 들어 아래와 같이 사용자 목록을 받아오는 GET 메서드 요청을 날려보겠습니다.

http://domain.com/users

위 요청을 보내고 나면 서버에서 응답으로 오는 상태 코드가 크게 2개로 나뉩니다. 200 (성공) 과 404 (실패) 입니다. 따라서, 이 HTTP 상태 코드로 추가적인 로직을 구현할 수 있죠.

주요 상태 코드는 200 번 대 부터 500 번 대까지 다양하게 존재하지만 주요한 상태 코드만 몇 가지 살펴보도록 하겠습니다.

 

2xx – 성공

200번대의 상태 코드는 대부분 성공을 의미합니다.

  • 200 : GET 요청에 대한 성공
  • 204 : No Content. 성공했으나 응답 본문에 데이터가 없음
  • 205 : Reset Content. 성공했으나 클라이언트의 화면을 새로 고침하도록 권고
  • 206 : Partial Conent. 성공했으나 일부 범위의 데이터만 반환

 

3xx – 리다이렉션

300번대의 상태 코드는 대부분 클라이언트가 이전 주소로 데이터를 요청하여 서버에서 새 URL로 리다이렉트를 유도하는 경우입니다.

  • 301 : Moved Permanently, 요청한 자원이 새 URL에 존재
  • 303 : See Other, 요청한 자원이 임시 주소에 존재
  • 304 : Not Modified, 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고. ETag와 같은 정보를 활용하여 변경 여부를 확인

 

4xx – 클라이언트 에러

400번대 상태 코드는 대부분 클라이언트의 코드가 잘못된 경우입니다. 유효하지 않은 자원을 요청했거나 요청이나 권한이 잘못된 경우 발생합니다. 가장 익숙한 상태 코드는 404 코드입니다. 요청한 자원이 서버에 없다는 의미죠.

  • 400 : Bad Request, 잘못된 요청
  • 401 : Unauthorized, 권한 없이 요청. Authorization 헤더가 잘못된 경우
  • 403 : Forbidden, 서버에서 해당 자원에 대해 접근 금지
  • 405 : Method Not Allowed, 허용되지 않은 요청 메서드
  • 409 : Conflict, 최신 자원이 아닌데 업데이트하는 경우. ex) 파일 업로드 시 버전 충돌

 

5xx – 서버 에러

500번대 상태 코드는 서버 쪽에서 오류가 난 경우입니다.

  • 501 : Not Implemented, 요청한 동작에 대해 서버가 수행할 수 없는 경우
  • 503 : Service Unavailable, 서버가 과부하 또는 유지 보수로 내려간 경우

Leave a Reply

Discover more from Dream big, Achieve more.

Subscribe now to keep reading and get access to the full archive.

Continue reading