๐Ÿ”’ MemCloud์˜ ๋ณด์•ˆ ํ”ผ์–ด ์ธ์ฆ ๋‚ด๋ถ€: ์žฅ์น˜๊ฐ€ LAN์—์„œ RAM์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐœํ–‰: (2025๋…„ 12์›” 12์ผ ์˜ค์ „ 01:38 GMT+9)
7 min read
์›๋ฌธ: Dev.to

Source: Dev.to

MemCloud( macOSโ€ฏ&โ€ฏLinux์šฉ ๋ถ„์‚ฐ RAM ์—”์ง„)๋ฅผ ๊ณต๊ฐœํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›์€ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

โ€œ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋‚ด RAM์„ ์ €์žฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒŒ ์œ„ํ—˜ํ•˜์ง€ ์•Š์„๊นŒ? ์–ด๋–ป๊ฒŒ ๋ณด์•ˆ์ด ๋˜๋‚˜์š”?โ€

์•„๋ž˜์—์„œ๋Š” MemCloud์˜ ์ธ์ฆ, ์•”ํ˜ธํ™”, ์‹ ๋ขฐ ๋ชจ๋ธ์„ ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ด…๋‹ˆ๋‹คโ€”ํ”„๋กœํ† ์ฝœ, ์œ„ํ˜‘ ๋ชจ๋ธ, ์•”ํ˜ธ ์„ค๊ณ„์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์—”์ง€๋‹ˆ์–ด๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ณด์•ˆโ€ฏ&โ€ฏ์ธ์ฆ ๋ ˆ์ด์–ด์—๋งŒ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.

(MemCloud๊ฐ€ ์ฒ˜์Œ์ด๋ผ๋ฉด ์†Œ๊ฐœ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š” โ€“ ์ด ๊ธ€์€ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.)

์œ„ํ˜‘ ๋ชจ๋ธ

์œ„ํ˜‘์˜ˆ์‹œ
๊ฐ€์žฅ์•…์„ฑ ๋””๋ฐ”์ด์Šค๊ฐ€ ์‹ ๋ขฐ๋œ ํ”ผ์–ด์ธ ์ฒ™ ๊ฐ€์žฅ
MITM ๊ณต๊ฒฉ๊ณต๊ฒฉ์ž๊ฐ€ ํ•ธ๋“œ์…ฐ์ดํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ ๋ณ€์กฐ
์žฌ์ƒ ๊ณต๊ฒฉ์ด์ „ ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฉ”์‹œ์ง€๋ฅผ ์žฌ์‚ฌ์šฉ
๋ฌด๋‹จ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๋””๋ฐ”์ด์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ชฐ๋ž˜ ํ•ฉ๋ฅ˜
์„ธ์…˜ ํ•˜์ด์žฌํ‚นํŠธ๋ž˜ํ”ฝ ํ‚ค๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธก

MemCloud ํ”„๋กœํ† ์ฝœ์€ ์œ„ ๋ชจ๋“  ์œ„ํ˜‘์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์•„์ด๋ดํ‹ฐํ‹ฐ ํ‚ค

๊ฐ ๋””๋ฐ”์ด์Šค๋Š” ๋‹ค์Œ ๊ฒฝ๋กœ์— ์žฅ๊ธฐ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ‚ค์Œ์„ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค:

~/.memcloud/identity_key
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜: Ed25519 (๋น ๋ฅด๊ณ  ์•ˆ์ „)
  • ๋ชฉ์ : ํ•ธ๋“œ์…ฐ์ดํฌ ์ „์‚ฌ(transcript)์— ์„œ๋ช…ํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ โ€“ ์•”ํ˜ธํ™”์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ.

์ด๋Š” PKI์˜ ๋ณต์žก์„ฑ ์—†์ด ๋””๋ฐ”์ด์Šค ์ธ์ฆ์„œ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ ํ๋ฆ„ (Noiseโ€ฏXX)

MemCloud๋Š” Noise Protocol Framework์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ์ธ์ฆ ํ๋ฆ„, ํŠนํžˆ Noise_XX ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์–‘์ชฝ ๋ชจ๋‘ ์ดˆ๊ธฐ์—๋Š” ์ธ์ฆ๋˜์ง€ ์•Š์Œ
  • Trustโ€‘Onโ€‘Firstโ€‘Use (TOFU) ์ง€์›
  • ์ƒํ˜ธ ์ธ์ฆ ์ œ๊ณต
  • ์ „๋ฐฉ ๋น„๋ฐ€์„ฑ ๋ณด์žฅ

๋‹จ์ˆœํ™”๋œ ํ•ธ๋“œ์…ฐ์ดํฌ

A โ†’ B : eA, nonceA
B โ†’ A : eB, nonceB
A โ†’ B : identity proof (encrypted)
B โ†’ A : identity proof (encrypted)

eA์™€ eB๋Š” ์ผ์‹œ์ ์ธ X25519 ๊ณต๊ฐœํ‚ค์ž…๋‹ˆ๋‹ค.

๊ฐ ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฉ”์‹œ์ง€๋Š” ์ „์‚ฌ์— ํ•ด์‹œ๋ฉ๋‹ˆ๋‹ค:

H = Hash(H || message)

์ด๋Š” ์žฌ์ƒ, ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ, ๊ต์ฐจ ์„ธ์…˜ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ „์‚ฌ๋Š” ์ดํ›„ ํ‚ค ํŒŒ์ƒ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ‚ค ํŒŒ์ƒ & ์•„์ด๋ดํ‹ฐํ‹ฐ ์ฆ๋ช…

  1. ๊ณต์œ  ๋น„๋ฐ€ ๊ณ„์‚ฐ:

    shared_secret = DH(eA, eB)
  2. ์„ธ์…˜ ํ‚ค ํŒŒ์ƒ:

    session_key = HKDF(shared_secret + transcript_hash)
  3. ๊ฐ ๋””๋ฐ”์ด์Šค๋Š” ์žฅ๊ธฐ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ‚ค๋กœ ์ „์‚ฌ ํ•ด์‹œ๋ฅผ ์„œ๋ช…:

    signature = Sign(TranscriptHash, IdentityKey)
    • ์„œ๋ช…์€ ์•”ํ˜ธํ™”๋˜๊ณ  ์ „์‚ฌ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žฌ์ƒ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๋ฉด ์—ฐ๊ฒฐ์€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ์•”ํ˜ธํ™”

์ตœ์ข… ํŠธ๋ž˜ํ”ฝ ํ‚ค๋Š” ์œ„์™€ ๊ฐ™์ด ํŒŒ์ƒ๋˜๋ฉฐ ChaCha20โ€‘Poly1305 AEAD์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ ์† LAN ํ†ต์‹ ์— ์ตœ์ ํ™”๋œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

์‹ ๋ขฐ๋œ ํ”ผ์–ด

์‹ ๋ขฐ๋œ ํ”ผ์–ด ๋ชฉ๋ก์€ ๋‹ค์Œ ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

~/.memcloud/trusted_devices.json

์ด๋ฏธ ์•Œ๋ ค์ง„ ํ”ผ์–ด์™€์˜ ํ–ฅํ›„ ์—ฐ๊ฒฐ์€:

  • ์•”ํ˜ธํ•™์ ์œผ๋กœ ์ธ์ฆ๋œ ์ƒํƒœ ์œ ์ง€
  • ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ํ•จ
  • ์กฐ์šฉํžˆ ์Šคํ‘ธํ•‘๋˜๊ฑฐ๋‚˜ ๊ต์ฒด๋  ์ˆ˜ ์—†์Œ

์ธ์ฆ ์‹คํŒจ ์‹œ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ฐœ์ƒํ•˜๋ฉด MemCloud๋Š” ์„ธ์…˜์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค:

  • ์•„์ด๋ดํ‹ฐํ‹ฐ ์„œ๋ช… ์‹คํŒจ
  • ์ „์‚ฌ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ
  • ํ•ธ๋“œ์…ฐ์ดํฌ ํ˜•์‹ ์˜ค๋ฅ˜
  • ๋””๋ฐ”์ด์Šค๊ฐ€ ์‹ ๋ขฐ๋˜์ง€ ์•Š์Œ
  • ๋™์˜ ๋ ˆ์ด์–ด๊ฐ€ ๊ถŒํ•œ ๋ถ€์—ฌ ์ฐจ๋‹จ

๊ฑฐ๋ถ€๋œ ํ”ผ์–ด๋Š” ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

  • ๋‹น์‹ ์˜ RAM์„ ์ฝ์Œ
  • ๋ธ”๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Œ
  • ํด๋Ÿฌ์Šคํ„ฐ์— ํ•ฉ๋ฅ˜
  • ์ด์ „ ํ”ผ์–ด๋ฅผ ๊ฐ€์žฅ

TLS๋ฅผ ์“ฐ์ง€ ์•Š์€ ์ด์œ 

TLS๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ P2P LAN ๋ฉ”๋ชจ๋ฆฌ ์—”์ง„์—๋Š” ์ตœ์ ์ด ์•„๋‹™๋‹ˆ๋‹ค:

  • MemCloud๋Š” **๋ฌด์„ค์ •(zeroโ€‘config)**์„ ๋ชฉํ‘œ๋กœ ํ•˜๋ฉฐ Noise๊ฐ€ ์ด๋ฅผ ๋ฐ”๋กœ ์ œ๊ณตํ•จ.
  • ๋ชฉํ‘œ ๋ ˆ์ดํ„ด์‹œ๋Š” 10โ€ฏms ์ดํ•˜์ด๋ฉฐ, Noise์˜ ๊ฐ€๋ฒผ์šด ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์ด ๋” ๋น ๋ฆ„.
  • ์ƒํ˜ธ ์ธ์ฆ, ์•„์ด๋ดํ‹ฐํ‹ฐ ์€ํ, ์ „๋ฐฉ ๋น„๋ฐ€์„ฑ, TOFU์™€ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์ด Noise ํŒจํ„ด์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จ๋จ.

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

๊ณต๊ฒฉ ์‹œ๋„๊ฒฐ๊ณผ
์žฌ์ƒ์ „์‚ฌ ๋ถˆ์ผ์น˜๋กœ ์ฐจ๋‹จ
MITM(์•„์ด๋ดํ‹ฐํ‹ฐ ์ฆ๋ช… ๋ถˆ์ผ์น˜) ์ฐจ๋‹จ
๊ฐ€์žฅ(์„œ๋ช… ๋ฌดํšจ) ์ฐจ๋‹จ
๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œ๋„๋ถˆ๊ฐ€๋Šฅ
ํŽ˜์ด๋กœ๋“œ ๋ณ€์กฐ(MAC ์‹คํŒจ) ์ฐจ๋‹จ

์‹ค์ œ LAN ํ™˜๊ฒฝ์—์„œ๋„ ํ”„๋กœํ† ์ฝœ์€ ๋งค์šฐ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๊ฐœ์„  ๊ณ„ํš

  • ๐Ÿ”„ ์‹ ๋ขฐ ์ฒ ํšŒ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
  • ๐Ÿ–ฅ GUI ์‹ ๋ขฐ ๊ด€๋ฆฌ์ž
  • ๐Ÿ›ก ์„ ํƒ์  ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ‚ค
  • ๐Ÿ” ์„ธ์…˜ ์žฌ๊ฐœ
  • ๐Ÿ“ฆ ํ”ผ์–ด ๊ฐ„ ์•”ํ˜ธํ™” ๋ณต์ œ

๊ธฐ์—ฌ์ž๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

  • ์ธ์ฆ ์ฝ”๋“œ: memnode/src/net/auth
  • ์ฃผ ์ €์žฅ์†Œ:
  • ๋ฌธ์„œ:
  • CLI ์‹ ๋ขฐ ๊ด€๋ฆฌ์ž: memcli trust

MemCloud๋Š” ๊ฒ‰๋ณด๊ธฐ์—” โ€œLAN์„ ํ†ตํ•ด ๋””๋ฐ”์ด์Šค๊ฐ€ RAM์„ ๊ณต์œ ํ•œ๋‹คโ€๋Š” ๋‹จ์ˆœํ•œ ์„œ๋น„์Šค์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๊ทธ ์ด๋ฉด์—๋Š” ์‹ค์ œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ •๊ตํ•˜๊ฒŒ ์„ค๊ณ„๋œ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์ด ๊น”๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

P2P ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ, ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ ๋ชจ๋ธ, ํ• ๋‹น๋Ÿ‰ enforcement, ํ˜น์€ ์ œ๋กœโ€‘์นดํ”ผ ์ŠคํŠธ๋ฆฌ๋ฐ ์„ค๊ณ„ ๋“ฑ์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋กœ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์–ธ์ œ๋“  ์•Œ๋ ค ์ฃผ์„ธ์š”!

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

ํ”„๋กฌํ”„ํŠธ์—์„œ ํ”„๋กœ๋•์…˜๊นŒ์ง€: AKS CodeNavAI๋ฅผ ํ™œ์šฉํ•œ .NET ์›น API ์ž๋™ ์ƒ์„ฑ

์ œ๊ฐ€ ๋งŒ๋“  AKS CodeNavAI๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช‡ ๋ถ„ ์•ˆ์— ์™„์ „ํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ .NET Web API ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Visual Studio ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค โ€” ๊ฐ„๋‹จํ•œ n...