Proven by Intelligence
보이지 않는 안전을 인텔리전스로 증명하다.
기술 인사이트를 만나보세요.

COAP과 MQTT는 현재 저 사양 기기를 위한 사물인터넷(IoT) 환경에서 가장 널리 사용되고 있는 통신 프로토콜입니다. 두 프로토콜은 유사한 서비스 영역을 가지는 프로토콜이어서 많은 비교 대상이 되곤 합니다.
COAP과 MQTT는 다음과 같은 공통점을 가지고 있습니다.
· 공개 표준
· HTTP 보다 제한된 환경에서 더 적합
· 비동기식 전송 메커니즘을 제공
· IP 위에서 동작
· 구현 범위를 가짐
· 개방형 표준 메시징 프로토콜을 지향

그럼 이제 각각 살펴보겠습니다.
│COAP │
(Constrained Application Protocol)
CoAP는 Constrained Application Protocol 의 약자로 IETF에서 표준화한 UDP 기반의 경량화된 REST 프로토콜입니다(RFC7252). 이름에도 포함되어 있지만 CoAP는 ‘제한된 노드와 제한된 네트워크’를 위한 프로토콜입니다.
CoAP는 클라이언트-서버(or Request-Response) 모델을 기반으로 동작하며 클라이언트-서버간에 상태 정보를 전송하기 위한 모델에 적합한 One-To-One 프로토콜입니다. UDP를 기반으로 설계되었기 때문에 클라이언트와 서버는 비 연결형 서비스로 데이터 그램을 방식을 제공합니다. UDP 위에서의 비동기적 전송이 이루어지며, TCP를 사용하지 않음으로써 발생하는 신뢰성 문제는 CoAP 내부의 재전송 및 타이머 관리 옵션으로 해결하고 있습니다. CoAP은 HTTP REST 사상에 맞추어 설계되었기에 간단한 프록시를 통해 HTTP와의 상호 운용이 쉽게 가능합니다.

[그림 1] CoAP & HTTP / 출처: IETF 79차 회의 Core WG

[그림 2] MQTT Network / 출처: MQTT and CoAP, IoT Protocols
위 그림에서 A, B, C 3개의 클라이언트는 모두 브로커와의 TCP로 연결되어 있으며, 클라이언트 B와 C는 ‘temperature’ 라는 토픽을 구독하고 있습니다. 클라이언트 A가 ‘temperature’ 토픽으로 값을 발행하면 브로커는 해당 토픽을 구독하는 B, C 에게 해당 값을 전달합니다. MQTT는 이러한 One to Many, Many to Many 형태의 모델에 적합한 프로토콜입니다.
MQTT - Topic Matching
MQTT에서의 토픽은 ‘/’을 사용하여 계층적으로 구성됩니다.(eg. kitchen/oven/temperature) 클라이언트는 토픽을 구독할 때 Wildcard인 ‘+’, ‘#’을 사용하여 다수의 토픽을 한번에 구독할 수 있습니다. ‘+’는 단일 디렉토리와 매칭되고, ‘#’은 여러 디렉토리와 매칭할 때 사용합니다.
kitchen/+/temperature = kitchen/foo/temperature
kitchen/+/temperature ≠ kitchen/foo/bar/temperature
kitchen/# = kitchen/fridge/compressor/valve1/temperature
MQTT - QoS(Quality of Service)
MQTT는 신뢰성 있는 메시징을 위하여 아래와 같은 3가지의 QoS 옵션을 제공합니다.
· Fire and forget(Level 0): 메시지는 최대 한번 전달됩니다. 전송 확인이 없기에 유실 가능성이 있습니다.
· Delivered at least once(Level 1): 메시지는 최소 한번 이상 전송되게 됩니다. 전송확인을 하지만 중복 전달될 가능이 있습니다.
· Delivered exactly once(Level 2): 정확히 1번의 전달을 보장합니다. 다만 종단간 전송 지연 가능성이 있습니다.
레벨이 높아지면 품질은 향상되지만 처리 속도 등의 성능 저하가 발생할 수 있습니다. 따라서 서비스의 특성에 맞는 선택이 필요합니다.
MQTT - LWT(Last Will and Testament)
MQTT의 모든 클라이언트는 브로커와의 연결이 끊겼을 때 특정 토픽으로 지정된 메시지를 보낼 수 있습니다. 이를 LWT(Last will and testament)라고 합니다. Message가 등록되면 브로커는 해당 클라이언트의 연결이 끊기면 지정된 토픽으로 지정된 메시지를 자동으로 전송합니다.
MQTT - Security
MQTT는 브로커와의 연결에 있어 Username/Password를 통한 사용자 인증을 제공합니다. 하지만 해당 값은 암호화되지 않은 Plaintext입니다. 좀더 안정적인 보안이 필요하다면 SSL/TLS를 이용한 암호화 채널을 적용할 수 있습니다.

[그림 3] MQTT & CoAP / 출처: COAP vs MQTT
CoAP와 MQTT는 모두 IoT 환경에 적합한 프로토콜이지만 통신 모델에서의 근본적인 차이점이 있습니다.
MQTT는 중앙 브로커를 통해 여러 클라이언트간에 메시지를 전달하기 위한 Publish-Subscribe, Many-To-Many 통신을 위한 프로토콜입니다. 클라이언트는 메시지를 발행하고 브로커는 메시지를 어디에 라우팅하고 복사할 것인지 결정하게 함으로써 생산자로 소비자를 분리시켰습니다. MQTT는 라이브 데이터를 위한 커뮤니케이션 버스에 가장 적합합니다.
CoAP는 주로 클라이언트와 서버간에 상태 정보를 전송하기 위한 모델에 적합한 Request-Response, One-To-One 통신 프로토콜입니다. 디바이스 별 리소스의 상태를 지속적으로 모니터링 하는 서비스에 가장 적합합니다. 또한 CoAP의 경우에는 REST 기반의 서비스 발견 기능을 제공하기에 신규 기능의 클라이언트 연결 시 추가적인 작업을 최소화 시킬 수 있는 장점도 있습니다.
이처럼 CoAP와 MQTT는 특성이 다르기에 도입하여 서비스를 운영할 때 얻을 수 있는 이점 또한 다릅니다. IoT 서비스 개발 시에는 이러한 특성을 고려하여 시장 환경에 맞는 프로토콜을 선택하여 도입할 필요가 있습니다.
Rapid-IoT는 IoT플랫폼으로 CoAP와 MQTT를 모두 지원하고 있습니다. 디바이스 및 서비스의 특징에 따라 프로토콜을 선택하되, 프로토콜을 포함한 각 센서 및 디바이스들과의 IoT 기술은 Rapid-IoT를 담당하고 사용자들은 IoT 기술을 통한 서비스를 운영하고 있습니다.
