CBOR, Concise Binary Object Representation
JSON의 데이터 모델을 기반으로 하여 바이너리 데이터도 포함할 수 있도록 정의된 바이너리 형식의 serialization 데이터 포맷이다.
JSON 데이터 모델을 확장하여 바이너리 데이터도 데이터 구조에 넣을 수 있도록 하였다. JSON에 바이너리 데이터를 넣으려면 base64 인코딩을 거쳐 넣어야 한다.
또한 형식을 간결하게 정의하여, 표현된 데이터의 길이를 가급적 줄였다. 다음은 RFC 7049에 예시로 든, 데이터 포맷 별 인코딩 비교이다. 각각 [1, [2, 3]]
(중첩 배열)과 [_ 1, [2, 3]]
(외부 배열이 길이가 정해져 있지 않은 경우)에 대하여 정의한 예이다.
CBOR를 표준화하고 있는 사람은 독일 브레멘 대학의 Carsten Bormann으로, RESTful IoT 통신 프로토콜인 CoAP을 표준화하고 있는 IETF Core WG의 의장이기도 하다. IoT 용으로 사용할 수 있도록 길이도 짧고 간결한 데이터 포맷이 필요해서 같이 표준화를 제안한 듯 하다.
CBOR 데이터는 기본적으로 다음 형식을 가진다. 즉 아래 형식의 배열로 구성되어 있다.
하지만 모든 데이터를 이와 같은 형식으로 포맷팅하는 것이 아니고, 데이터에 따라 다음과 같이 유연하게 선택할 수 있도록 하여 전체 길이를 줄일 수 있도록 한다. (tiny, short, long 등의 용어는 위키피디아에서만 사용되므로 유의 바란다)
major type에 따라 어떤 형식을 사용해야 하는 지에 대해서 아래에 표의 일부 내용이 있다.
위의 첫 그림에서 알 수 있다시피 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 위키피디아