{{위키데이터 속성 추적}}
{{IP스택}}
'''CoAP'''({{lang|en|Constrained Application Protocol}}, 코앱)은 제약이 있는(constrained) 장치들을 위한 특수한 인터넷 애플리케이션 프로토콜로서 RFC 7252에 정의되었다. "노드"(node)로 불리는 해당 제약 장치들이 비슷한 프로토콜을 사용하는 더 넓은 인터넷과 통신할 수 있게 한다. COAP은 제약이 있는 동일한 네트워크(예: 저전력, 손실 네트워크)의 장치들 간에, 장치와 인터넷 상의 일반 노드 간에, 또 인터넷을 통해 참여한, 제약이 있는 각기 다른 네트워크 상의 장치 간에 사용하기 위해 설계되었다. 또, CoAP은 모바일 통신망의 SMS와 같은 다른 구조를 통해 사용되기도 한다.

CoAP은 [[무선 센서 네트워크]] 노드처럼 자원에 제약이 있는 장치들에서 사용할 목적으로 고안된 [[서비스 계층]] 프로토콜이다. CoAP은 단순한 웹 연동을 위해 [[HTTP]]로 쉽게 변환되도록 설계되어 있으며 [[멀티캐스트]] 지원과 같은 특수한 요건을 충족하면서도 부하가 매우 낮으며 단순한 편이다.<ref>[https://tools.ietf.org/html/rfc7252 RFC 7252, Constrained Application Protocol (CoAP)]</ref><ref>"[http://hinrg.cs.jhu.edu/joomla/images/stories/IPSN_2011_koliti.pdf Integrating Wireless Sensor Networks with the Web] {{웨이백|url=http://hinrg.cs.jhu.edu/joomla/images/stories/IPSN_2011_koliti.pdf |date=20170830060917 }}" , Walter, Colitti 2011</ref> 멀티캐스트, 낮은 부하, 단순성은 심도있게 [[임베디드 시스템|임베디드]]되는 경향이 있고 전통적인 인터넷 장치보다 훨씬 더 적은 메모리와 전력 공급을 지니는 경향이 있는 [[사물인터넷]](IoT) 및 [[사물통신]](M2M) 장치에 매우 중요하다. 즉, 효율성이 매우 중요하다. CoAP은 [[사용자 데이터그램 프로토콜|UDP]] 또는 UDP 유사 프로토콜을 지원하는 대부분의 장치에서 구동할 수 있다.

== 메시지 포맷 ==
=== CoAP 요청/응답 코드 ===
요청 코드는 다음의 형태를 취한다:
{| class="wikitable"
! colspan="8" |바이트
|-
!0
!1
!2
!3
!4
!5
!6
!7
|-
| colspan="3" |CLASS
| colspan="5" |CODE
|}
문서 상에서는 보통 `<class>`.`<nowiki><code>`</nowiki>와 같은 형태로 표현된다.
==== CoAP 등록 코드 ====
[https://www.iana.org/assignments/core-parameters/core-parameters.xhtml#codes]에서 CoAP의 최신 등록 코드를 볼 수 있다.
{{multi-column numbered list|lst=disc|0|
<li>
Method: 0.XX
{{ordered list|start=0
| EMPTY
| GET
| POST
| PUT
| DELETE
| FETCH
| PATCH
| iPATCH
}}
</li>
<li>
Success : 2.XX
{{ordered list|
| Created
| Deleted
| Valid
| Changed
| Content
| item7_value = 31
| Continue
}}
</li>
|2|
<li>
Client Error : 4.XX
{{ordered list|start=0
| Bad Request
| Unauthorized
| Bad Option
| Forbidden
| Not Found
| Method Not Allowed
| Not Acceptable
| item8_value = 8
| Request Entity Incomplete
| Conflict
| item10_value = 12
| Precondition Failed
| Request Entity Too Large
| item12_value = 15
| Unsupported Content-Format
}}
</li>
|2|
<li>
Server Error : 5.XX
{{ordered list|start=0
| Internal Server Error
| Not Implemented
| Bad Gateway
| Service Unavailable
| Gateway Timeout
| Proxying Not Supported
}}
</li>
<li>
Signaling Codes : 7.XX
{{ordered list|start=0
| Unassigned
| CSM
| Ping
| Pong
| Release
| Abort
}}
</li>
}}

=== CoAP 메시지 구조 ===
{| class="wikitable"
|+CoAP 메시지 구조
! colspan="8" |바이트
! colspan="8" |바이트
! colspan="8" |바이트
! colspan="8" |바이트
|-
!0
!1
!2
!3
!4
!5
!6
!7
!0
!1
!2
!3
!4
!5
!6
!7
!0
!1
!2
!3
!4
!5
!6
!7
!0
!1
!2
!3
!4
!5
!6
!7
|-
| colspan="2" |VER
| colspan="2" |TYPE
| colspan="4" |TKL (토큰 길이: Token Length)
| colspan="8" |CoAP 요청/응답 코드
| colspan="16" |메시지 ID
|-
| colspan="32" |토큰 (TKL 바이트) (8바이트 최대)
|-
| colspan="32" |옵션 (사용 가능한 경우)<ref>[https://www.iana.org/assignments/core-parameters/core-parameters.xhtml#option-numbers Options Numbers]</ref>
|-
|1
|1
|1
|1
|1
|1
|1
|1
| colspan="24" |페이로드 (사용 가능한 경우)
|}
CoAP 고정 헤더는 처음 4바이트이다. 이로써 토큰, 옵션, 페이로드를 생략할 경우 가장 작은 CoAP 메시지의 길이를 4바이트로 유지할 수 있게 한다.

이 매크로를 통해 C에서 고정 헤더의 정보를 쉽게 추출할 수 있다:<syntaxhighlight lang="c">
#define COAP_HEADER_VERSION(data)  ( (0xC0 & data[0])>>6    )
#define COAP_HEADER_TYPE(data)     ( (0x30 & data[0])>>4    )
#define COAP_HEADER_TKL(data)      ( (0x0F & data[0])>>0    )
#define COAP_HEADER_CLASS(data)    ( ((data[1]>>5)&0x07)    )
#define COAP_HEADER_CODE(data)     ( ((data[1]>>0)&0x1F)    )
#define COAP_HEADER_MID(data)      ( (data[2]<<8)|(data[3]) )
</syntaxhighlight>

== 구현체 ==
{| class="wikitable sortable"
|-
! 이름 !! 프로그래밍 언어 !! 구현된 CoAP 버전 !! 클라이언트/서버 !! 구현된 CoAP 기능 !! 라이선스 !! 링크
|-
| aiocoap || Python 3 || RFC 7252 || Client + Server || Blockwise Transfers, Observe (부분적) || MIT || https://pypi.python.org/pypi/aiocoap
|-
| Californium || Java || RFC 7252 || Client + Server || Observe, Blockwise Transfers, DTLS || EPL+EDL || https://web.archive.org/web/20181207034534/http://www.eclipse.org/californium/
|-
| cantcoap ||  C++/C || RFC 7252 || Client + Server ||  || BSD || https://github.com/staropram/cantcoap
|-
| Canopus ||  [[Go (프로그래밍 언어)|Go]] || RFC 7252 || Client + Server || Core || Apache License 2.0 || https://github.com/zubairhamed/canopus
|-
| CoAP implementation for Go ||  [[Go (프로그래밍 언어)|Go]] || RFC 7252 || Client + Server || Core + Draft Subscribe || MIT || https://github.com/dustin/go-coap
|-
| CoAP.NET || C# || RFC 7252, coap-13, coap-08, coap-03 || Client + Server || Core, Observe, Blockwise Transfers || 3-clause BSD || https://github.com/smeshlink/CoAP.NET
|-
| CoAPSharp ||  C#, .NET || RFC 7252 || Client + Server || Core, Observe, Block, RD || LGPL || http://www.coapsharp.com{{깨진 링크|url=http://www.coapsharp.com/ }}
|-
| CoAPthon || Python || RFC 7252 || Client + Server + Forward Proxy + Reverse Proxy || Observe, Multicast server discovery, CoRE Link Format parsing, Block-wise || MIT || https://github.com/Tanganelli/CoAPthon
|-
| CoAP Shell || Java || RFC 7252 || Client || Observe, Blockwise Transfers, DTLS || Apache License 2.0 || https://github.com/tzolov/coap-shell
|-
| Copper || JavaScript (Browser Plugin) || RFC 7252 || Client || Observe, Blockwise Transfers || 3-clause BSD || https://github.com/mkovatsc/Copper https://addons.mozilla.org/firefox/addon/copper-270430/{{깨진 링크|url=https://addons.mozilla.org/firefox/addon/copper-270430/ }}
|-
| eCoAP || C || RFC 7252 || Client + Server || Core || MIT || https://gitlab.com/jobol/ecoap
|-
| Erbium for Contiki || C || RFC 7252 || Client + Server || Observe, Blockwise Transfers || 3-clause BSD || http://www.contiki-os.org/ (er-rest-example)
|-
| iCoAP || Objective-C || RFC 7252 || Client || Core, Observe, Blockwise Transfers || MIT || https://github.com/stuffrabbit/iCoAP
|-
| jCoAP || Java || RFC 7252 || Client + Server || Observe, Blockwise Transfers || Apache License 2.0 || https://code.google.com/p/jcoap/
|-
| libcoap || C || RFC 7252 || Client + Server ||Observe, Blockwise Transfers, DTLS || BSD/GPL || https://github.com/obgm/libcoap
|-
| LibNyoci ||  C || RFC 7252 || Client + Server ||   Core, Observe, Block, DTLS || MIT || https://github.com/darconeous/libnyoci
|-
| lobaro-coap || C || RFC 7252 || Client + Server ||Observe, Blockwise Transfers || MIT || http://www.lobaro.com/lobaro-coap
|-
| microcoap ||  C || RFC 7252 || Client + Server ||  || MIT || https://github.com/1248/microcoap
|-
| nCoap || Java || RFC 7252 || Client + Server || Observe, Blockwise Transfers, CoRE Link Format, [https://tools.ietf.org/html/draft-kleine-core-coap-endpoint-id-01 Endpoint-ID-Draft] || BSD || https://github.com/okleine/nCoAP
|-
| node-coap || Javascript || RFC 7252 || Client + Server || Core, Observe, Block || MIT || https://github.com/mcollina/node-coap
|-
| Ruby coap || Ruby || RFC 7252 || Client + Server (david) || Core, Observe, Block, RD || MIT, GPL || https://github.com/nning/coap<br/>https://web.archive.org/web/20180611002224/https://github.com/nning/david
|-
| Sensinode C Device Library ||  C || RFC 7252 || Client + Server || Core, Observe, Block, RD || Commercial || https://silver.arm.com/browse/SEN00
|-
| Sensinode Java Device Library ||  Java SE || RFC 7252 || Client + Server || Core, Observe, Block, RD || Commercial || https://silver.arm.com/browse/SEN00
|-
| Sensinode NanoService Platform ||  Java SE || RFC 7252 || Cloud Server || Core, Observe, Block, RD || Commercial || https://silver.arm.com/browse/SEN00
|-
| SwiftCoAP || Swift || RFC 7252 || Client + Server || Core, Observe, Blockwise Transfers || MIT || https://github.com/stuffrabbit/SwiftCoAP
|-
| TinyOS CoapBlip || nesC/C || coap-13 || Client + Server || Observe, Blockwise Transfers || BSD || https://web.archive.org/web/20130312140509/http://docs.tinyos.net/tinywiki/index.php/CoAP
|-
| txThings || Python (Twisted) || RFC 7252 || Client + Server || Blockwise Transfers, Observe (partial) || MIT || https://github.com/mwasilak/txThings/
|-
| FreeCoAP || C || RFC 7252 || Client + Server + HTTP/CoAP Proxy ||Core, DTLS, Blockwise Transfers || BSD || https://github.com/keith-cullen/FreeCoAP
|-
| coap-rs || Rust || RFC 7252 || Client + Server || || MIT || https://github.com/Covertness/coap-rs
|-
|YaCoAP
|C
|
|
|
|MIT
|https://github.com/RIOT-Makers/YaCoAP
|}

== 프록시 구현 ==
* [http://telecom.dei.unipd.it/pages/read/90/ Squid 3.1.9 with transparent HTTP-CoAP mapping module] {{웨이백|url=http://telecom.dei.unipd.it/pages/read/90/ |date=20181018153830 }}
* [https://code.google.com/p/jcoap/ jcoap Proxy]
* [https://github.com/mkovatsc/Californium Californium cf-proxy]
* [https://github.com/Tanganelli/CoAPthon CoAPthon]
* [https://github.com/keith-cullen/FreeCoAP FreeCoAP]

== 보안 문제 ==
프로토콜 표준이 [[DDoS]] 증폭 공격의 위협을 완화하기 위한 대비책이 있지만<ref>[https://blog.cloudflare.com/why-iot-is-insecure/ "TLS 1.3 is going to save us all, and other reasons why IoT is still insecure", Dani Grant, 2017-12-24]</ref>, 이 대비책들은 실제로 구현되어 있지 않으므로<ref>[https://i.blackhat.com/eu-18/Thu-Dec-6/eu-18-Maggi-When-Machines-Cant-Talk-wp.pdf "When Machines Can't Talk: Security and Privacy Issues of Machine-to-Machine Data Protocols", Federico Maggi and Rainer Vosseler, 2018-12-06]</ref>, 주로 중국에 위치한 580,000개 이상이 표적이 되어 최대 320Gbps의 공격을 받고 있다<ref>[https://www.zdnet.com/article/the-coap-protocol-is-the-next-big-thing-for-ddos-attacks/ "The CoAP protocol is the next big thing for DDoS attacks", Catalin Cimpanu, 2018-12-05]</ref>.

== 같이 보기 ==
* [[사물인터넷]]
* [[OMA LWM2M|OMA Lightweight M2M]]
* [[사물 웹]]

== 각주 ==
{{각주}}

[[분류:HTTP]]
[[분류:응용 계층 프로토콜]]
[[분류:사물인터넷]]