4 min read

CBOR, Concise Binary Object Representation

CBOR, Concise Binary Object Representation
Photo by Mika Baumeister / Unsplash

JSON의 데이터 모델을 기반으로 하여 바이너리 데이터도 포함할 수 있도록 정의된 바이너리 형식의 serialization 데이터 포맷이다.

JSON 데이터 모델을 확장하여 바이너리 데이터도 데이터 구조에 넣을 수 있도록 하였다. JSON에 바이너리 데이터를 넣으려면 base64 인코딩을 거쳐 넣어야 한다.

또한 형식을 간결하게 정의하여, 표현된 데이터의 길이를 가급적 줄였다. 다음은 RFC 7049에 예시로 든, 데이터 포맷 별 인코딩 비교이다. 각각 [1, [2, 3]](중첩 배열)과 [_ 1, [2, 3]](외부 배열이 길이가 정해져 있지 않은 경우)에 대하여 정의한 예이다.

데이터 포맷 별 인코딩 결과 비교 (from RFC 7049)

CBOR를 표준화하고 있는 사람은 독일 브레멘 대학의 Carsten Bormann으로, RESTful IoT 통신 프로토콜인 CoAP을 표준화하고 있는 IETF Core WG의 의장이기도 하다. IoT 용으로 사용할 수 있도록 길이도 짧고 간결한 데이터 포맷이 필요해서 같이 표준화를 제안한 듯 하다.

CBOR 데이터는 기본적으로 다음 형식을 가진다. 즉 아래 형식의 배열로 구성되어 있다.

CBOR 기본 형식 (from wikipedia)

하지만 모든 데이터를 이와 같은 형식으로 포맷팅하는 것이 아니고, 데이터에 따라 다음과 같이 유연하게 선택할 수 있도록 하여 전체 길이를 줄일 수 있도록 한다. (tiny, short, long 등의 용어는 위키피디아에서만 사용되므로 유의 바란다)

CBOR 형식의 세 가지 변형 (from wikipedia)

major type에 따라 어떤 형식을 사용해야 하는 지에 대해서 아래에 표의 일부 내용이 있다.

CBOR type 일부 (from wikipedia)

위의 첫 그림에서 알 수 있다시피 CBOR와 비슷한 수준으로 그 크기를 줄일 수 있는 형식은 MessagePack 정도이다. ASN.1의 경우 BER을 사용한 예가 나와있는데, 아마 PER 형식이면 거의 CBOR와 비슷한 수준이 되지 않을까 싶다. 그러나 ASN.1은 schema에 대한 이해가 필요하고, 형식이 복잡해지면 그 난이도가 기하급수적으로 올라간다는 점을 고려하면 CBOR도 충분히 강점을 가질 수 있어 보인다. 개인적으로는 JSON 형식을 좋아하기도 하고, 일하면서 ASN.1 형식에 많이 치이기도 해서 (게다가 PER이었다!) CBOR 포맷이 대세가 되었으면 하는 기대가 크다.

Reference

  • RFC 7049
    • CBOR 주 표준 문서. 2013년 표준화
  • cbor.io
    • CBOR 기술 홈페이지. 관련 표준 문서 및 implementation 정보 정리
  • wikipedia
    • CBOR 위키피디아
— END OF POST.