CoAP (Constraint Application Protocol – Kısıtlı Uygulama Protokolü), IETF (İnternet Mühendisliği Görev Gücü) tarafından tasarlanmış bir uygulama katmanı protokolüdür. Adından da anlaşılabileceği gibi birincil amacı kısıtlı kaynaklara sahip cihazlar üzerinde ve kısıtlı bant genişliğine sahip ağlarda çalışmak olan CoAP, tasarımı basit tutmak için UDP üzerinde çalışır. CoAP, uygulama uç birimleri arasında etkileşimli bir istek/cevap modeli sunar; servisler ve kaynakların keşfi için yerleşik desteğe sahiptir; URI gibi anahtar web kavramlarını barındırır. CoAP protokolü düşük güç, kayıplı iletişim gibi sınırlı kaynaklara sahip düğümler ve ağlar için geliştirilmiş bir web transfer protokolüdür. Düğümler genellikle 8 bitlik mikro işlemcilere ve düşük miktarlarda RAM ve ROM kapasitesine sahiptirler. Haberleşme hızı tipik olarak 10Kbps değerini aşmaz ve yüksek paket hata oranına sahiptirler. Daha çok akıllı bina, akıllı şehir gibi M2M uygulamaları için tasarlanmıştır bir uygulama protokolüdür.
CoAP’ın etkileşim modeli HTTP’nin istemci/sunucu modeline benzer ancak CoAP makineden-makineye çalıştığı için CoAP hem istemci hem sunucu rollerini üstlenir. HTTP’den farklı olarak bu etkileşim UDP üzerinde asenkron olarak gerçekleştirilir. Bu süreç, opsiyonel olarak güvenilirliği desteklemek için mesaj katmanlarının mantıksal kullanımı ile gerçekleştirilebilir.

1. Mesajlaşma Modeli
CoAP’ta temel 4 mesaj tipi vardır: Confirmable, Non-Confirmable, Acknowledgement(ACK) ve Reset.
Confirmable mesajların karşılığında bir Acknowledment gönderilmesi gerekmektedir. Bu Acknowledment mesajları cevapla birlikte gönderilebileceği gibi ayrı olarak da gönderilebilir.
Non-Confirmanble mesajların karşılığında Acknowledment gönderilmesine gerek yoktur. Acknowledment mesajlar Confirmable mesajlara karşılık olarak gönderilirler.

Reset mesajları, bir nedenden dolayı yerine getirilemeyen istek (Confirmable veya Non- Confirmable) karşılığında gönderilir. Ayrıca boş bir reset mesajı bir cihazın ulaşılabilir olup olmadığını anlamak için de kullanılabilir. (bir bakıma ping gibi düşünebiliriz)
CoAP, 4 byte’lık sabit bir başlık kullanır. Her mesajda 16 bitlik bir Mesaj Kimliği (Message ID) bulunur. Bu da, saniyede 250 tane mesajı kimliklendirmek için yeterlidir.
Güvenilirlik, Confirmable mesajlar ile sağlanırlar. Bir Confirmable mesaj, bu mesaj için bir Acknowledgement mesajı alınana kadar bir zaman aşımı mekanizması kullanılarak yeniden gönderilir. Bir cihaz bir isteğin içeriğini yerine getiremeyeceği zaman Acknowledgement mesajı yerine Reset mesajı gönderir. Güvenilir olması gerekmeyen mesajlar Non-Confirmable olarak gönderilirler. Bu mesajların taşıdığı isteğin yerine getirilememesi halinde Reset mesajı gönderilebilir.
2. İstek / Cevap Modeli
Metod kodu veya cevap kodu içeren CoAP istek/cevap semantiği CoAP mesajları üzerinde taşınır. Bir istek Confirmable veya Non-Confirmable mesaj üzerinde taşınabilir; eğer bir Confirmable mesaja verilebilecek cevap hazırsa, oluşturulan Acknowledgement mesajı ile birlikte gönderilebilir. Bu cevap verme yöntemine “piggybacked” denmektedir. Bu cevap tipinde ayrı Acknowledgement ve ayrı cevap yoktur, ikisi birleştirilmiştir. Eğer sunucu, isteği anında cevaplayacak durumda değilse basitçe boş bir Acknowledgement üretir ve gönderir. Cevap hazırlandığı zaman yeni bir Confirmable mesaj oluşturulur ve cevap bu mesaj ile gönderilir. Bu cevap verme türüne “ayrılmış cevap” denir. Bu durumda istemci, kendisine Confirmable mesaj içerisinde gelen cevap karşılığında Acknowledgement göndermek zorundadır. Aksi taktirde sunucu sürekli olarak aynı cevabı gönderecektir. CoAP, cevapları isteklerle eşleştirmek için bir jeton (Token) kullanır. Jeton kavramı Mesaj Kimliğinden farklı bir kavramdır.
Eğer bir istek Non-Confirmable olarak gönderilmişse, cevap Non-Confirmable veya Confirmable olarak gönderilebilir.

CoAP, GET, PUT, POST, DELETE gibi temel http komutlarını http’dekine benzer şekilde kullanır. Ayrıca unicast iletişimin yanı sıra multicast iletişime de olanak tanır.
3. Mesaj Formatı Yapısı

Versiyon (Ver): iki bit işaretsi tamsayıdır. CoAP’ın versiyon numarasını gösterir.
Type (T): iki bit işaretsi tamsayıdır. Mesaj tipini gösterir. Confirmable (0), Non-confirmable (1), Acknowledgement (2) ve Reset (3).
Jeton Uzunluğu (Token Length – TKL): 4 bitlik işaretsiz tamsayıdır. Değişken uzunluklu TOKEN alanının uzunluğunu gösterir.
Kod (Code): 8 bitlik işaretsiz tamsayı. Bu alan bir isteği, başarılı bir cevabı, bir istemci hata cevabını, bir sunucu hata cevabını gösterebilir. http benzeri işlemleri tanımlamak için kullanılır (GET, POST, PUT, DELETE).
Mesaj Kimliği (Message ID): 16 bitlik işaretsiz tamsayı. Mesaj tekrarlarını tespit etmek için kullanılır. Ayrıca, mesaj tiplerini eşleştirmek için kullanılır.
Token: Başlıktan sonra TOKEN değeri gelmektedir. TOKEN değeri istekleri ve cevapları ilişkilendirmek için kullanılır.
Options: Başlık ve TOKEN alanlarından sonra OPTIONS alanı gelmektedir. Bir CoAP mesajı hiçbir opsiyon barındırmayacağı gibi birden fazla opsiyon da barındırabilir. OPTIONS alanını PAYLOAD alanından payload işaretçisi adı verilen 1 byte’lık alan ayırır.
Payload: Son olarak opsiyonel PAYLOAD alanı gelmektedir. Eğer bir payload varsa, bu payloaddan önce 8 tane bitten oluşan payload işaretçisi gelir. PAYLOAD alanı, payload işaretçisinden sonra UDP datagramının sonuna kadar uzatılabilir.
4. Siber Güvenlik Tehditleri
CoAP protokolü umut vaat etmesine rağmen, aşağıda belirttiğim birçok fiziksel güvenlik (fiziksel) ve fiziksel olmayan (Remote) tehdit bulunmaktadır:
1. Fiziksel Tehditler;
Klonlama: Bir bilgisayar korsanı ekosistemde olması gereken bir cihazın özelliklerini hem fiziksel ürün, hem de donanım ve yazılımları fiziksel olarak klonlayabilir. Bir bilgisayar korsanı, ekosistemi, meşru bir cihazın kimliğine bürünerek, bilgiyi çalarak veya ekosistemi tehlikeye atmak suretiyle, sonradan ekosisteme girebilir ve dahil olabilir.
Firmware Replacement Attack: Bir ekosistemde yeni güncellemeler yapıldığında, bunlar genellikle kablosuz haberleşme üzerinden gerçekleşir. Bu adımda bilgisayar korsanları girebilir ve bu aşırı yükleme işlemi güvensizse kötü amaçlı yazılım yükleyebilir. Başarılı olursa, bilgisayar korsanlığı ekosistemdeki diğer cihazları kolayca etkileyebilir ve erişebilir.
Güvenlik Parametrelerinin Çıkarılması: IoT ekosistemlerindeki birçok cihaz, fiziksel olarak korunmasız olabilir. Bir bilgisayar korsanı, cihazdaki anahtarlar gibi güvenlik bilgilerini alabilir.
Hizmet Saldırılarının Reddi: Hizmet reddi saldırısı (DoS), iletişim kanalını sıkıştırarak tüm ekosistemi kapatabilir. Bu ayrıca, aygıtların çalışmayı durdurabilmesi için uygun iletişimleri de engeller.
2. Fiziksel Olmayan Tehditler (Remote);
Gizlice Dinleme (Eavesdropping) Saldırısı: Dinleme, bir bilgisayar korsanı, kısıtlı ağ içinde iletişim kurmak için kullanılan gizli anahtarları yakalayabilen yeni bir cihazın ilk adımı sırasında gerçekleşebilir.
Ortadaki-Adam (MiTM) Saldırısı: Ortadaki-adam saldırılarında zayıf anahtar değişim uygulamalarından yararlanır ve bir ekosistemin ortasında kötü niyetli bir aygıtın oturmasına izin verir. Bu hacker’ın ekosistemden geçen tüm bilgileri engellemesine izin verir.
Yönlendirme (Routing) Saldırısı: Bir saldırgan, yüksek kaliteli bir rotaya sahip olmak için kötü amaçlı bir aygıt oluşturduğunda ve böylece tüm veri paketlerini yakalayabildiğinde yönlendirme saldırıları meydana gelir. Bu, hacker’ların tüm paketleri (sinkhole saldırısı) düşürmesine veya belirli paketleri (seçmeli iletme) düşürmeyi seçmesine izin verir.
SQL Enjeksiyonu: Bir SQL enjeksiyonu, SQL sorgusunu girdi üzerinden (istemciden uygulamaya) ekler. Bu, hacker’ın veritabanına girmesini ve değiştirebilmesini veya yönetimsel işlemleri yürütmesini sağlar.