๐ English Abstract
This article addresses the critical issue of ESP32 system reboots caused by MbedTLS dynamic memory allocation failures during MQTT over TLS handshakes. It provides a comprehensive troubleshooting guide to analyze heap memory fragmentation and optimize buffer configurations in ESP-IDF. Furthermore, it details how to implement TLS Session Resumption to drastically reduce handshake memory overhead and connection latency in embedded IoT devices.
์๋ฒ ๋๋ IoT(Internet of Things) ์์คํ ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ ๋ณด์์ ๋ ์ด์ ์ ํ์ด ์๋ ํ์ ์์์ ๋๋ค. ESP32 ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ํ๊ฒฝ์์ MQTT ํต์ ์ ๊ตฌํํ ๋, ์ํธํ๋์ง ์์ ํฌํธ(1883) ๋์ TLS(Transport Layer Security)๋ฅผ ์ ์ฉํ MQTT over TLS(ํฌํธ 8883) ๊ธฐ์ ์ ํ์ค์ผ๋ก ์ฑํํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ํ์ ๋ ์์คํ ๋ฉ๋ชจ๋ฆฌ ์์์ ๊ฐ์ง ESP32์์ TLS ํต์ ์ ์ํํ ๋, ์์ธ์ ์ ์ ์๋ ๋ฌด์์ ์ฌ๋ถํ (Reboot)์ด๋ ๋ฆฌ์ ํ์์ ๊ฒฝํํ๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ํ์์ ์ฃผ๋ ์์ธ์ TLS ํธ๋์ ฐ์ดํฌ(Handshake) ๊ณผ์ ์์ ๋ฐ์ํ๋ MbedTLS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ(Dynamic Memory Allocation Failure / Heap Exhaustion)์ ๋๋ค. ๋ณธ ํฌ์คํ ์์๋ ESP32์์ TLS ์ํธํ ํต์ ์ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ฌ๋ถํ ๋ฌธ์ ์ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ๊น์ด ์๊ฒ ๋ถ์ํ๊ณ , MbedTLS ๋ฒํผ ์ต์ ํ ๋ฐ TLS ์ธ์ ์ฌ๊ฐ(Session Resumption) ๊ธฐ๋ฒ์ ํตํด ์์คํ ์์ ์ฑ๊ณผ ์ฐ๊ฒฐ ์๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๋ ํธ๋ฌ๋ธ์ํ ๊ณผ์ ์ ์์ธํ ๋ค๋ฃน๋๋ค.
1. ๋ฌธ์ ํ์ ๋ฐ ์์ธ ๋ถ์: MbedTLS ํธ๋์ ฐ์ดํฌ์ ํ ๋ฉ๋ชจ๋ฆฌ
ESP32๋ Wi-Fi ์คํ๊ณผ FreeRTOS, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํฌํจํ์ฌ ์ฝ 320KB ์์ค์ ๋ด์ฅ SRAM(Internal SRAM)์ ๊ณต์ ํฉ๋๋ค. ์ด๊ธฐ Wi-Fi ์ฐ๊ฒฐ ๋ฐ MQTT ํด๋ผ์ด์ธํธ ์์ฑ ํ ์ด์ฉ ๊ฐ๋ฅํ ์ค์ง์ ์ธ ์ฐ์ ํ(Heap) ๋ฉ๋ชจ๋ฆฌ๋ ์ฝ 80KB~120KB ์์ค์ผ๋ก ์ค์ด๋ญ๋๋ค. ๋ฌธ์ ๋ ๋ฐ๋ก ์ฌ๊ธฐ์ ๋ฐ์ํฉ๋๋ค.
๊ฐ. TLS ํธ๋์ ฐ์ดํฌ์ ๋ฉ๋ชจ๋ฆฌ ๋ถํ ๊ตฌ์กฐ
TLS 1.2 ๋๋ 1.3 ํ๋กํ ์ฝ ์์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ด๊ธฐ ์ฐ๊ฒฐ์ ์๋ฆฝํ ๋ ์ํ๋๋ ์ ์ฒด ํธ๋์ ฐ์ดํฌ(Full Handshake) ๊ณผ์ ์ ๋ง๋ํ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํฉ๋๋ค.
- ์๋ฒ ์ธ์ฆ์ ์ฒด์ธ ์์ (Server Certificate Verification): ๋ธ๋ก์ปค๊ฐ ์ ์กํ๋ X.509 CA ์ธ์ฆ์ ์ฒด์ธ์ ํฌ๊ธฐ๊ฐ ํด ๊ฒฝ์ฐ(์: RSA 4096๋นํธ ๊ธฐ๋ฐ ํค) ์ KB์์ 10KB ์ด์์ ์ ์ถ๋ ฅ ๋ฒํผ๊ฐ ํ ๋ฒ์ ํ ๋น๋ฉ๋๋ค.
- ๋น๋์นญ ํค ๊ตํ ์ฐ์ฐ(Asymmetric Key Exchange): RSA ๋๋ ECC(Elliptic Curve Cryptography) ์ฐ์ฐ ์ ์ผ์์ ์ธ ๋น ์ธํฐ์ (MPI, Multi-Precision Integer) ๊ณ์ฐ์ฉ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํฉ๋๋ค.
- TLS ๋ ์ฝ๋ ๋ฒํผ(Record Buffer): TLS ๊ท๊ฒฉ์ ์ต๋ ๋ ์ฝ๋ ํฌ๊ธฐ๋ 16,384 ๋ฐ์ดํธ(16KB)์ ๋๋ค. ์ก์ (Tx) ๋ฐ ์์ (Rx) ๋ฒํผ๋ฅผ ์ ์ ์ผ๋ก ํ ๋นํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ 33KB ์ด์์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ์ ๊ณ ์ ์ ์ ๋ฉ๋๋ค.

๋. ํ ๋จํธํ(Heap Fragmentation)์ ์์คํ ์ฌ๋ถํ ์ ์ฐ๊ด์ฑ
ESP32์์ ์ ์ฒด ํ ์์ฌ๋์ด 50KB ์ด์ ๋จ์์๋ค๊ณ ์ถ๋ ฅ๋๋๋ผ๋ ํธ๋์
ฐ์ดํฌ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ฐ๋ก ํ ๋จํธํ(Heap Fragmentation) ๋๋ฌธ์
๋๋ค. MbedTLS ์ฐ์ฐ ๊ณผ์ ์์ ์์ ํฌ๊ธฐ์ ๋ธ๋ก ํ ๋น๊ณผ ํด์ ๊ฐ ๋ฐ๋ณต๋๋ฉด์ ์ฐ์๋ ํผ์งํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก(Largest Free Block)์ด ๊ณ ๊ฐ๋ฉ๋๋ค. ์ด ์ํฉ์์ MbedTLS๊ฐ 8KB ์ด์์ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ๋ฉด malloc()์ด NULL์ ๋ฐํํ๊ฒ ๋๋ฉฐ, ์ ์ ํ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ StoreProhibited ํจ๋ ํน์ ์์น๋
ํ์ด๋จธ(WDT)์ ์ํด ๋๋ฐ์ด์ค๊ฐ ๊ฐ์ ์ฌ๋ถํ
๋ฉ๋๋ค.
| ์ค๋ฅ ์ฝ๋ / ํจ๋ ๋ฉ์์ง | ๋ฐ์ ์์น | ์ถ์ ์์ธ |
|---|---|---|
MBEDTLS_ERR_SSL_ALLOC_FAILED |
mbedtls_ssl_setup() | SSL context ๋๋ ๋ฒํผ ์์ฑ์ฉ ํ ๋ถ์กฑ |
MBEDTLS_ERR_PK_ALLOC_FAILED |
mbedtls_pk_parse_key() | ๊ฐ์ธํค/๊ณต๊ฐํค ํ์ฑ ์ค ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ |
Guru Meditation Error: Core 1 panic |
mbedtls_handshake_step() | NULL ํฌ์ธํฐ ์ญ์ฐธ์กฐ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค ์๋ฌ |
2. ๋จ๊ณ๋ณ MbedTLS ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ๋ฐ ํธ๋ฌ๋ธ์ํ
์ฌ๋ถํ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ๋จผ์ ์ํํด์ผ ํ๋ ์์
์ ESP-IDF์ Build Configuration(๋๋ PlatformIO/Arduino sdkconfig) ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ์ฌ MbedTLS ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ footprint๋ฅผ ๊ทน์ํํ๋ ๊ฒ์
๋๋ค.
๊ฐ. Dynamic Buffer Allocation ์ต์ ํ์ฑํ
๊ธฐ๋ณธ ์ค์ ์ MbedTLS๋ ์ต๋ ๋ ์ฝ๋ ํฌ๊ธฐ(16KB)์ ๋ง์ถ Tx/Rx ๋ฒํผ๋ฅผ ์ฐ๊ฒฐ ์งํ ๊ณ ์ ํ ๋นํฉ๋๋ค. ESP-IDF ํ๊ฒฝ์์๋ ๋์ ๋ฒํผ ํ ๋น(Dynamic Buffer Allocation) ์ต์ ์ ์ผ์ ํธ๋์ ฐ์ดํฌ ๋์ค ๋ฐ ์๋ฃ ํ์ ์ค์ ๋ก ํ์ํ ํ์ด๋ก๋ ํฌ๊ธฐ๋งํผ๋ง ๋ฒํผ๋ฅผ ์ ์งํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
CONFIG_MBEDTLS_DYNAMIC_BUFFER=y: TX/RX ๋ฒํผ๋ฅผ ํ์ ์์ ์๋ง ๋์ ์ผ๋ก ํ ๋นํ๊ณ ์ฌ์ฉ ์๋ฃ ์ ์ฆ์ ํด์ ํฉ๋๋ค.CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y: ํธ๋์ ฐ์ดํฌ ์ข ๋ฃ ํ ๋ ์ด์ ํ์ํ์ง ์์ ์ธ์ฆ์ ํ์ฑ ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์ฑ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํฉ๋๋ค.
๋. Maximum Content Length ์ ๊ฐ ์ค์
IoT ๋ธ๋ก์ปค(AWS IoT Core, Mosquitto, HiveMQ ๋ฑ)์์ ์ค๊ฐ๋ MQTT ๋ฉ์์ง ํฌ๊ธฐ๊ฐ ์ KB ์ด๋ด๋ผ๋ฉด, TLS ๊ธฐ๋ณธ ์ ์ถ๋ ฅ ๋ฒํผ ์ต๋ ํฌ๊ธฐ๋ฅผ ํ์ค 16384 ๋ฐ์ดํธ์์ 4096 ๋ฐ์ดํธ ๋๋ 2048 ๋ฐ์ดํธ๋ก ์ถ์ํ ์ ์์ต๋๋ค.
// sdkconfig ์ค์ ์์
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=4096
# ๋๋ menuconfig: Component config -> mbedTLS -> Maximum certificate chain length / Content length
์ด ์ค์ ์ ํตํด ํธ๋์ ฐ์ดํฌ ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ๋์ด ๊ธฐ์กด ๋๋น ์ต๋ 60% ์ด์ ๊ฐ์ํ๋ฉฐ, ํ ๋จํธํ ๋ฌธ์ ๋ฐ์ ํ๋ฅ ์ด ๊ธ๊ฒฉํ ๋ฎ์์ง๋๋ค.
๋ค. ECC ๊ธฐ๋ฐ ์ํธํ ์๊ณ ๋ฆฌ์ฆ(ECDSA)์ผ๋ก ์ ํ
๊ธฐ์กด์ RSA 2048๋นํธ ๋๋ 4096๋นํธ ๊ธฐ๋ฐ ์ํธํ๋ ํค ํฌ๊ธฐ์ ์ธ์ฆ์ ๋ฐ์ดํฐ๊ฐ ๋น๋ํ์ฌ ํ์ฑ ๋ฐ ๊ฒ์ฆ ๋จ๊ณ์์ ๋ง๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํฉ๋๋ค. ๋ฐ๋ฉด ECDSA(Elliptic Curve Digital Signature Algorithm - secp256r1/P-256)๋ฅผ ์ ์ฉํ๋ฉด ๋์ผ ํน์ ๋ ๋์ ๋ณด์ ๋ ๋ฒจ์ ์ ์งํ๋ฉด์๋ ํค ๋ฐ ์ธ์ฆ์ ํฌ๊ธฐ๋ฅผ 1/4 ์ดํ๋ก ์ค์ผ ์ ์์ต๋๋ค.
3. ์ฌํ ํด๊ฒฐ์ฑ : TLS ์ธ์ ์ฌ๊ฐ(Session Resumption) ๊ตฌํ
๋ฒํผ ์กฐ์ ๋ง์ผ๋ก๋ ์๋น ๋ถ๋ถ ๊ฐ์ ๋์ง๋ง, Wi-Fi ์ฌ์ฐ๊ฒฐ์ด๋ MQTT ์ฌ์ ์์ด ๋น๋ฒํ ํ๊ฒฝ์์๋ ์ฌ์ ํ ์์ ํ ํธ๋์ ฐ์ดํฌ๊ฐ ๋ฐ๋ณต ์ํ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ํผํฌ(Memory Peak)๋ฅผ ์ ๋ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ถ๊ทน์ ์ธ ๊ธฐ๋ฒ์ด ๋ฐ๋ก TLS ์ธ์ ์ฌ๊ฐ(TLS Session Resumption / Session Tickets) ๊ธฐ๋ฒ์ ๋๋ค.
๊ฐ. ์ธ์ ์ฌ๊ฐ(Session Resumption)์ ์๋ ์๋ฆฌ
์ต์ด 1ํ ์ ์ฒด ํธ๋์ ฐ์ดํฌ(Full Handshake)๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ง์น๋ฉด, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ํธํ๋ **์ธ์ ํฐ์ผ(Session Ticket)**์ ๋ฐ๊ธํฉ๋๋ค. ์ดํ ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ฐ ์ฌ์ฐ๊ฒฐ๋ ๋ ํด๋ผ์ด์ธํธ๋ ์ด ํฐ์ผ์ ์๋ฒ์ ์ ์ํ์ฌ ์ถ์ฝ๋ ํธ๋์ ฐ์ดํฌ(Abbreviated Handshake)๋ฅผ ์งํํฉ๋๋ค.
- ๋ฌด๊ฑฐ์ด ๋ฌด์์ ์ ์์ฑ ๋ฐ ๋น๋์นญํค ์ฐ์ฐ ์๋ต: ์๋ฒ ์ธ์ฆ์ ์ฒด์ธ ์์ ๊ณผ CPU ์ง์ฝ์ ์ธ ํค ๊ตํ ๊ณผ์ ์ ๊ฑด๋๋๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํผํฌ ์ ๊ฐ: ํธ๋์ ฐ์ดํฌ ์๊ฐ ์๊ตฌ๋๋ ์๊ฐ ์ต๊ณ ํ ์ฌ์ฉ๋์ด ๋ํญ ์ค์ด๋ญ๋๋ค.
- ์ฐ๊ฒฐ ์์ ์๊ฐ(Latency) ๋จ์ถ: ํ๊ท 2.5์ด ์ด์ ์์๋๋ TLS Handshake ์๊ฐ์ด 300ms~500ms ๋ด์ธ๋ก ๋จ์ถ๋ฉ๋๋ค.
๋. ESP32 ESP-IDF/MbedTLS ์ธ์ ์ฌ๊ฐ ์ฝ๋ ๊ตฌํ
๋ค์์ ESP-IDF ํ๊ฒฝ์์ MbedTLS ์ธ์ ๋ฐ์ดํฐ๋ฅผ NVS(Non-Volatile Storage) ๋๋ RAM์ ์ ์ฅํ๊ณ , ์ฌ์ ์ ์ ์ธ์ ์ ๋ณต์ํ์ฌ ์ถ์ฝ ํธ๋์ ฐ์ดํฌ๋ฅผ ์ํํ๋ C/C++ ์์ค์ฝ๋ ํจํด์ ๋๋ค.
#include "mbedtls/ssl.h"
#include "esp_log.h"
#include "nvs_flash.h"
static const char *TAG = "TLS_OPTIMIZATION";
static mbedtls_ssl_session saved_session;
static bool has_saved_session = false;
// 1. TLS Context ์ค์ ์ ์ธ์
ํฐ์ผ ๊ธฐ๋ฅ ํ์ฑํ
void configure_tls_session_resumption(mbedtls_ssl_config *conf) {
mbedtls_ssl_conf_session_tickets(conf, MBEDTLS_SSL_SESSION_TICKETS_ENABLED);
}
// 2. ์ฐ๊ฒฐ ์ฑ๊ณต ํ ์ธ์
์ ์ฅ ํจ์
void save_tls_session(mbedtls_ssl_context *ssl) {
if (!has_saved_session) {
mbedtls_ssl_session_init(&saved_session);
} else {
mbedtls_ssl_session_free(&saved_session);
}
int ret = mbedtls_ssl_get_session(ssl, &saved_session);
if (ret == 0) {
has_saved_session = true;
ESP_LOGI(TAG, "TLS Session successfully saved for resumption.");
} else {
ESP_LOGE(TAG, "Failed to get TLS session, error: -0x%04X", -ret);
}
}
// 3. ํธ๋์
ฐ์ดํฌ ์ ์ ์ฅ๋ ์ธ์
์๋ ํจ์
void restore_tls_session(mbedtls_ssl_context *ssl) {
if (has_saved_session) {
int ret = mbedtls_ssl_set_session(ssl, &saved_session);
if (ret == 0) {
ESP_LOGI(TAG, "Restored previous TLS session ticket.");
} else {
ESP_LOGW(TAG, "Failed to set TLS session, performing full handshake.");
}
}
}
๋ค. ์ธ์ ์ฌ๊ฐ ์ ์ ์ํด์ผ ํ ์์ธ ์ฒ๋ฆฌ (Edge Cases)
์ค๋ฌด์ ์ธ์ ์ฌ๊ฐ ๊ธฐ๋ฒ์ ๋์ ํ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ธ ์ฌ์์ ๋ํ ๊ฐ๋ ์ฝ๋๋ฅผ ๋ฐ๋์ ์์ฑํด์ผ ํฉ๋๋ค.
- ์ธ์ ๋ง๋ฃ(Ticket Expiration): ๋ธ๋ก์ปค ์ค์ ์ ๋ฐ๋ผ ์ธ์ ํฐ์ผ ์๋ช ์ด ์ง์ ๋์ด ์์ต๋๋ค(๋ณดํต 1์๊ฐ~24์๊ฐ). ์๋ฒ๊ฐ ํฐ์ผ์ ๊ฑฐ๋ถํ ๊ฒฝ์ฐ MbedTLS๋ ์๋์ผ๋ก Full Handshake๋ก Fallback ํ๋ฏ๋ก ์ด๋ฅผ ์ํ ์๋น ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๋ณด๋์ด ์์ด์ผ ํฉ๋๋ค.
- ์๋ฒ ์ธก ์ฌ๋ถํ
๋ฐ ๋ค์ค ๋ธ๋ก์ปค ๋ก๋๋ฐธ๋ฐ์ฑ: ๋ก๋๋ฐธ๋ฐ์ ๋ค์ ๋ฐฐ์น๋ ํด๋ฌ์คํฐํ MQTT ๋ธ๋ก์ปค ์ธํ
์์๋ ๋ค๋ฅธ ๋
ธ๋๋ก ์ ์ ์ ์ ์ฅ๋ ์ธ์
ํฐ์ผ ํค๊ฐ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. ํฐ์ผ ๋ฌดํจํ ๋ฐ์ ์ ์ธ์
๊ตฌ์กฐ์ฒด๋ฅผ
mbedtls_ssl_session_free()๋ก ์์ ํ ์ด๊ธฐํํด์ผ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
4. ์ฑ๋ฅ ๊ฒ์ฆ ๋ฐ ์ต์ ํ ํจ๊ณผ ๋น๊ต
๊ธฐ์กด ๊ธฐ๋ณธ ์ค์ ๋ฐฉ์๊ณผ ๋ณธ ๊ฐ์ด๋์์ ์ ์ํ ์ต์ ํ ๊ธฐ๋ฒ(๋ฒํผ ์ค์ + ์ธ์ ์ฌ๊ฐ ์ ์ฉ)์ ์ ์ฉํ์ ๋์ ESP32 ์์คํ ํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ํธ๋์ ฐ์ดํฌ ์์ ์๊ฐ ๋ฐ์ดํฐ ๋น๊ต ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ํ๊ฐ ํญ๋ชฉ | ์ต์ ํ ์ (Default RSA 2048) | ์ต์ ํ ํ (Dynamic Buffer + Session Resumption) | ๊ฐ์ ์จ |
|---|---|---|---|
| ์ต์ ์์ฌ ํ (Min Free Heap) | ์ฝ 8.2 KB (์ํ ์์ค) | ์ฝ 42.5 KB (์์ ์ ) | +418% ์ฆ๊ฐ |
| ์ต๋ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ (Max Alloc Block) | ์ฝ 6.1 KB (๋จํธํ ์ฌํจ) | ์ฝ 31.0 KB | +408% ์ฆ๊ฐ |
| TLS ์ฐ๊ฒฐ ์๋ฆฝ ์๊ฐ (Handshake Latency) | ์ฝ 2,650 ms | ์ฝ 380 ms | ์ฝ 85.6% ๋จ์ถ |
| ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ ์ฌ๋ถํ | ๊ฐํ์ ๋ฐ์ (์ผ ์ํ) | ์ ํ ๋ฐ์ํ์ง ์์ (0ํ) | ์์ ํด๊ฒฐ |
์ ๊ฒฐ๊ณผ์์ ๋ณผ ์ ์๋ฏ์ด, ๋จ์ํ ํ๋ผ๋ฏธํฐ ํ๋๊ณผ TLS ์ธ์ ๊ธฐ๋ฒ์ ๊ฒฐํฉํ๋ ๊ฒ๋ง์ผ๋ก ์์คํ ์์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถฉ๋ถํ ํ๋ณดํ ์ ์์์ผ๋ฉฐ, ์ ์ ๋จ์ถ ํจ๊ณผ๊น์ง ๋์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
5. ๊ฒฐ๋ก ๋ฐ ์์ฝ
ESP32 ๊ธฐ๋ฐ์ IoT ์๋ฒ ๋๋ ๊ธฐ๊ธฐ์์ MQTT over TLS ํต์ ๋์ค ๋ฐ์ํ๋ ๋ฌด์์ ์ฌ๋ถํ ํ์์ ๋๋ถ๋ถ MbedTLS ํธ๋์ ฐ์ดํฌ ์ฐ์ฐ ์ค ํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฐ ๋จํธํ๋ก ์ธํด ์ผ์ด๋ฉ๋๋ค. ๋จ์ ํ๋์จ์ด ์ฌ๋ถํ ์กฐ์น์ ์์กดํ๋ ๋์ , ์์คํ ์ค๊ณ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ณ ๋ํํด์ผ ํฉ๋๋ค.
CONFIG_MBEDTLS_DYNAMIC_BUFFER๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ฌ์ฉํ์ง ์๋ SSL ๋ฒํผ๋ฅผ ์ฆ์ ํด์ ํฉ๋๋ค.- ์๋ฒ/ํด๋ผ์ด์ธํธ ์ํธํ ์ฒด๊ณ๋ฅผ ๊ฐ๋ฅํ๋ฉด RSA ๋์ ECDSA(Elliptic Curve)๋ก ๋ณ๊ฒฝํฉ๋๋ค.
- TLS Session Resumption์ ๊ตฌํํ์ฌ ์ ์ ์ ๋ฐ์ํ๋ ๋น๋์นญํค ์ฐ์ฐ ๋ถ๋ด์ ์ค์ด๊ณ , ์ต์ ํ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ์ (Minimum Ever Free Heap Size)์ ํฌ๊ฒ ๋์ด์ฌ๋ฆฝ๋๋ค.
์๊ธฐ ์์๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ์ฉํ๋ฉด ESP32์ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ํ์ฅ์ ๋ฐฐ์น๋ IoT ๋๋ฐ์ด์ค๊ฐ 24์๊ฐ 365์ผ ๋๊น ์์ด ์์ ํ๊ณ ๊ฒฌ๊ณ ํ๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.