์ค‘๊ตญ ํ™˜๊ฒฝ์—์„œ ์•ฑ ํ‘ธ์‹œ ์•ˆ์ •์ ์œผ๋กœ ๋ฐœ์†กํ•˜๊ธฐ

2chan
  • #Mqtt
  • #Lambda
  • #Push

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ด์ฐฌํฌ์ž…๋‹ˆ๋‹ค. ์ค‘๊ตญ ์‚ฌ์šฉ์ž๋ถ„๋“ค๋กœ๋ถ€ํ„ฐ โ€œํ‘ธ์‹œ๊ฐ€ ์•ˆ ์™€์š”โ€, โ€œVPN์„ ์ผœ์•ผ๋งŒ ์ ‘์†๋ผ์š”โ€ ๊ฐ™์€ ํ”ผ๋“œ๋ฐฑ์ด ๊พธ์ค€ํžˆ ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. Android/iOS ๋ชจ๋‘ FCM ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜ํ•˜๋˜ ์ €ํฌ์—๊ฒŒ ์ค‘๊ตญ์˜ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์€ ํฐ ์žฅ๋ฒฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” VPN ์—†์ด๋„ ์•ฑ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์›ํ™œํžˆ ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฒซ ๋‹จ๊ณ„๋กœ ์ค‘๊ตญ ํ‘ธ์‹œ ์„œ๋น„์Šค๋ฅผ ๊ฐœํŽธํ–ˆ๊ณ , ์ด ๊ธ€์—์„œ๋Š” ์™œ AWS IoT Core์™€ Custom Lambda Authorizer ์กฐํ•ฉ์„ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ตญ ํ™˜๊ฒฝ์—์„œ MQTT ์„ ํƒ ์ด์œ 

์ค‘๊ตญ์—์„œ๋Š” VPN ์—†์ด Google ๊ณ„์—ด ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ธฐ์กด FCM ๊ธฐ๋ฐ˜ ํ‘ธ์‹œ ๊ตฌ์กฐ๋กœ๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์ด ์ง€์—ฐ๋˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€์—ญ์ด๋ผ๋ฉด ๋ณดํ†ต์€ FCM์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. OS ์ฐจ์›์—์„œ ์ตœ์ ํ™”๋˜์–ด ์žˆ๊ณ , ์„œ๋ฒ„ ์šด์˜ ๋ถ€๋‹ด์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์„ ํƒํ•  ์ด์œ ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฑด ์ค‘๊ตญ ์‚ฌ์šฉ์ž๋„ ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ‰๋ฒ”ํ•˜๊ฒŒ ์•ฑ์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ํ’ˆ์งˆ์ด ๋ถˆ์•ˆ์ •ํ•œ ํ™˜๊ฒฝ์—์„œ๋„ ์—ฐ๊ฒฐ์„ ์˜ค๋ž˜ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ
  • ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๊ณ , ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ํ†ต์‹  ๋ฐฉ์‹

์—ฌ๋Ÿฌ ์˜ต์…˜์„ ๊ฒ€ํ† ํ•œ ๊ฒฐ๊ณผ, MQTT๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. MQTT๋Š” ๊ฒฝ๋Ÿ‰ ํ”„๋กœํ† ์ฝœ๋กœ์„œ ์—ฐ๊ฒฐ ์œ ์ง€๋ฅผ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ž‘๊ณ , QoS(Quality of Service) ์˜ต์…˜์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ณด์žฅ ์ˆ˜์ค€์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐฐํ„ฐ๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์†Œ๋ชจ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ์‹ค์‹œ๊ฐ„์„ฑ ์žˆ๋Š” ํ†ต์‹ ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— AWS IoT Core๋ฅผ ๋”ํ•˜๋ฉด, ์ˆ˜์‹ญ๋งŒ~์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ์žฅ์น˜ ์—ฐ๊ฒฐ์„ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณด์•ˆยท์ธ์ฆยทํ™•์žฅ์„ฑ ๋ฌธ์ œ๋ฅผ AWS์— ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ์ €ํฌ๋Š” ์ธํ”„๋ผ ์šด์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ , ์„œ๋น„์Šค ๋กœ์ง๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆยท๊ถŒํ•œ ๊ตฌ์กฐ ์„ค๊ณ„

ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ๊ทธ์ธ ์ดํ›„ wss://<iot-endpoint>/mqtt ๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ AWS IoT Core๊ฐ€ Custom Lambda Authorizer ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ† ํฐ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ์ด ์œ ํšจํ•˜๋ฉด ๊ทธ ์‚ฌ์šฉ์ž/๋””๋ฐ”์ด์Šค์—๋งŒ ์œ ํšจํ•œ ์ •์ฑ…์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: AWS IoT Core ๊ฐœ๋ฐœ์ž ์•ˆ๋‚ด์„œ - ์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ฆ ์›Œํฌํ”Œ๋กœ ์ดํ•ด

MQTT ํ† ํ”ฝ ์„ค๊ณ„๋Š” ์„œ๋น„์Šค ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ‘ธ์‹œ ์„œ๋น„์Šค์—์„œ๋Š” ๋””๋ฐ”์ด์Šค ๋‹จ์œ„๋กœ ๊ถŒํ•œ์„ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๊ธฐ๊ธฐ์˜ ํ† ํ”ฝ์ด ํƒˆ์ทจ๋˜์–ด๋„ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ฆ ๊ณผ์ •์€ Lambda Custom Authorizer๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ์ž„์‹œ ๊ถŒํ•œ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ถŒํ•œ ์œ ์ง€ ์‹œ๊ฐ„๊ณผ ์ •์ฑ… ์žฌ๊ฒ€์ฆ ๊ฐ„๊ฒฉ์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๋ฉด, ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ž์ฃผ ์ž๊ฒฉ ์ฆ๋ช…์„ ์žฌ๋ฐœ๊ธ‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ , Authorizer ํ˜ธ์ถœ ๋นˆ๋„ ์—ญ์‹œ ์ค„์–ด๋“ค์–ด ์šด์˜ ๋น„์šฉ๊ณผ ์ง€์—ฐ์„ ํ•จ๊ป˜ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฐ”์ด์Šค๋Š” ์ž๊ธฐ ํ† ํ”ฝ๋งŒ ๊ตฌ๋…ยท์ˆ˜์‹ ํ•˜๋„๋ก ์ตœ์†Œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฐœ๊ธ‰๋˜๋Š” Policy์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

{
  "Version": "2012-10-17",
  "Statement": [
    { "Effect": "Allow", "Action": ["iot:Connect"], "Resource": ["*"] },
    {
      "Effect": "Allow",
      "Action": ["iot:Subscribe"],
      "Resource": ["arn:aws:iot:<region>:<account>:topicfilter/${topic}"]
    },
    {
      "Effect": "Allow",
      "Action": ["iot:Receive"],
      "Resource": ["arn:aws:iot:<region>:<account>:topic/${topic}"]
    }
  ]
}

Custom Authorizer ์„ ํƒ ๋ฐฐ๊ฒฝ

MQTT ๋ธŒ๋กœ์ปค ์—ฐ๊ฒฐ ์‹œ ์ธ์ฆ ๋ฐฉ์‹์€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ๋„ Custom Authorizer, Cognito, ์ธ์ฆ์„œ(X.509) ๋ฐฉ์‹์„ ๋ชจ๋‘ ๊ฒ€ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ Custom Authorizer๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ์ €ํฌ๊ฐ€ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๊ฐ€์žฅ ๋„“์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์ธ์ฆ ๋กœ์ง๋ฟ ์•„๋‹ˆ๋ผ ๊ถŒํ•œ์˜ ์œ ํšจ ์‹œ๊ฐ„, ์ •์ฑ… ์žฌ๊ฒ€์ฆ ์ฃผ๊ธฐ๊นŒ์ง€ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์—ˆ์ฃ . ์ด ์˜ต์…˜๋“ค์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๋ฉด ์ŠคํŒŒ์ดํฌ ํŠธ๋ž˜ํ”ฝ ์ƒํ™ฉ์—์„œ๋„ ๋ถ€ํ•˜๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ , ํ•„์š” ์‹œ Lambda์˜ Provisioned Concurrency๊นŒ์ง€ ํ™œ์šฉํ•ด ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cognito๋Š” AWS๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‹ ์› ํ† ํฐ๊ณผ STS ์ž๊ฒฉ ์ฆ๋ช…์„ ํ†ตํ•ด ํ‘œ์ค€ํ™”๋œ SigV4 ์ธ์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ ์ˆ˜๋ช…๊ณผ ํšŒ์ „๋„ AWS๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๊ธฐ ์šด์˜ ๊ด€์ ์—์„œ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Cognito API์˜ ๊ธฐ๋ณธ rate limit์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๊ฒƒ์ด ๋ถ€๋‹ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. AWS์— ์š”์ฒญํ•˜๋ฉด ์ƒํ–ฅ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ณ„์† ํ•œ๋„๋ฅผ ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค๋Š” ์šด์˜ ๋ฆฌ์Šคํฌ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ๋ฐฉ์‹์€ ๋””๋ฐ”์ด์Šค ์ •์ฒด์„ฑ ๋ณด์žฅ ์ธก๋ฉด์—์„œ ๊ฐ•๋ ฅํ•˜๊ณ , ์ „ํ†ต์ ์ธ IoT ๊ธฐ๊ธฐ์—๋Š” ์ตœ์ ํ™”๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋ฐ”์ผ ์•ฑ ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋ผ์ด๋น— ํ‚ค ๋ณด๊ด€ยทํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ณ ๋ฏผ์ž…๋‹ˆ๋‹ค. ํ‚ค์ฒด์ธยทํ‚ค์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฃจํŒ…ยทํƒˆ์˜ฅยท์—๋ฎฌ๋ ˆ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ์œ ์ถœ ์œ„ํ—˜์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ธฐ ์–ด๋ ต๊ณ , ํ•œ ๋ฒˆ ์œ ์ถœ๋˜๋ฉด ๋Œ€๊ทœ๋ชจ ํ๊ธฐยท์žฌ๋ฐœ๊ธ‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์†Œ๋น„์ž์šฉ ์•ฑ ํŠน์„ฑ์ƒ ํ•œ ๋””๋ฐ”์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š”๋ฐ, ๊ทธ๋•Œ๋งˆ๋‹ค ์ธ์ฆ์„œ์™€ ์‚ฌ์šฉ์ž ๋งคํ•‘์„ ๋ฐ˜๋ณต ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ๋Š” ๋งค๋„๋Ÿฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, ๋‹น์‹œ ์ €ํฌ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๋„“์€ ๊ถŒํ•œ ์ œ์–ด, ์—ฐ๊ฒฐ ์ˆœ๊ฐ„์˜ ์ •์ฑ… ๋™์  ์ƒ์„ฑ, ๋น ๋ฅธ ํšŒ์ˆ˜/์ฐจ๋‹จ์ด์—ˆ๊ณ , ์ด ์„ธ ๊ฐ€์ง€๋ฅผ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ์กฑ์‹œํ‚จ ๊ฒŒ Custom Authorizer์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ Cognito๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ํ‘œ์ค€ํ™”ยท์šด์˜ ์ž๋™ํ™” ์ธก๋ฉด์—์„œ ๋งค๋ ฅ์ ์ด๋ผ, ๋‚ด๋ถ€ ๋กœ๋“œ๋งต์— โ€œCognito Identity Pool ๊ธฐ๋ฐ˜ ์ ‘์† ์‹คํ—˜โ€์„ ๊ณ„์† ์˜ฌ๋ ค๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ์ž‘์—…์„ ํ†ตํ•ด โ€œ์ค‘๊ตญ์—์„œ๋„ ์˜จ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ํ”„๋กฌ ์„œ๋น„์Šคโ€์— ํ•œ ๊ฑธ์Œ ๋” ๋‹ค๊ฐ€์„ฐ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. AWS IoT Core + Custom Authorizer ์กฐํ•ฉ์€ ๋„คํŠธ์›Œํฌ ์ œ์•ฝ์ด ์‹ฌํ•œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์ธ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คฌ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ค‘๊ตญ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, (์ค‘๊ตญ์—์„œ๋„ ํ”„๋กฌ ์“ฐ๊ฒŒ ํ•ด์ฃผ์„ธ์š”. -2ํŽธ ) ์ด ๋งํฌ์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ‘ธ์‹œ ์„œ๋น„์Šค๋Š” ๊ทธ ์‹œ์ž‘์ผ ๋ฟ์ด๋ฉฐ, ์•ž์œผ๋กœ๋„ ๋‚จ์€ ๊ณผ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ