
์ค๊ตญ ํ๊ฒฝ์์ ์ฑ ํธ์ ์์ ์ ์ผ๋ก ๋ฐ์กํ๊ธฐ

- #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ํธ ) ์ด ๋งํฌ์์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค. ํธ์ ์๋น์ค๋ ๊ทธ ์์์ผ ๋ฟ์ด๋ฉฐ, ์์ผ๋ก๋ ๋จ์ ๊ณผ์ ๋ฅผ ํ๋์ฉ ํด๊ฒฐํด ๋๊ฐ ๊ณํ์ ๋๋ค.