오늘의 삽질!

이라기보다 지난 한달간의 기록에 가까운 것 같다.

정말 삽질에 삽질에 삽질을 거듭해서 겨우 MQTT Packet에 Command Type을 하나 추가했다.

휴.. 라이브러리를 어찌나 뜯어고쳤던지




#MQTT란?


MQTT 란 텔레메트리 장치, 모바일 기기에 최적화된 라이트 메시징 프로토콜로서
더 다양한 앱과 서비스의 등장으로 HTTP등의 기존 프로토콜만으로는 커뮤니케이션의 다양한 요구사항을 수용할 수 없게되었고,
제한된 통신 환경을 고려하여 디자인된 MQTT 프로토콜은 모바일 영역의 진화에 따라 최적의 프로토콜로 주목받고 있습니다.


뭐.. 그렇다고 한다.

사실 나한테는 내가 써야하는 프로토콜! 외의 큰 의미는 없었다.

내가 그 프로토콜 타입까지 샅샅이 뒤져봐야 할 줄 몰랐을 때까진.. 그랬다.


"제한된 통신 환경을 고려하여 디자인된" 이라서 그런가. 

iOT Device 와 양방향 통신을 하기에 꽤나 적합한 것 같다.

그래서 많이들 추천했겠지.


사실 나는 쓰기 간단하길래 택했다.

이렇게 될줄 몰랐지 나는..




#MQTT에서의 Authentication, Authorization (with Mosca)


MQTT는 꽤나 간단한 구조로 고려된 프로토콜이라, 따로 Authentication이나 Authorization을 위한 기능이 없다.

connect시 username / password 는 포함할 수 있던데.. 뭔지 모르겠다.


여튼 그래서 Mosca를 썼다. authenticate랑 authorization을 제공한다지 뭐야!


근데 Mosca 에서 제공하는 authentication은 username/password 방식으로 구현되어 있다.

이게 우리가 보통 생각하는 서비스 계정 로그인 같은 경우에야 적합하겠지만,

iOT device를 managing 하기에는 적합하지 않다.


사람이야 자기 password를 숨길 수도 있고, 어쩌다 유출당하면 바꿔버리면 그만이지만,

device는 공장에서 찍혀나간 후에는 password 역할을 할 코드를 유출당해버리면 아주,, 어마어마한 보안상의 문제가 되어버리기 때문에!

저 password 자체를 connect 시에 그냥 보내버리면 문제가 될 수 있다.

추가적인 인증 로직이 필요하단 거..


내가 지금 있는 곳에서는 보안을 중요시한 iOT Device Management System 을 만들어라! 하는 플젝을 하고 있기 때문에

Security... 특히 Device Authentication / Authorization 은 매우 중요하다.

그게 내가 Mosca 에서 제공하는 username / password 기반의 Authentication 기능을 그대로 가져다 쓸 수 없었던 이유고,

이 삽질을 시작한 이유.




#How to authenticate a iOS device


그럼 어떻게 인증하지?


기본적으로 두가지 가정을 한다.


1. 각 Device는 본인의 식별번호와, 비밀번호 역할을 할 Secret Number 를 가지고 있다.

2. 모든 Device 정보는 출고시에 Management System DB에 식별번호, Secret Number 를 포함하여 registration 된다.


위의 두가지가 전제될 때,

각 Device 는 Server 에 mqtt connection 을 요청하면서 

자신의 식별번호와 Secret Number 를 username / password 처럼 담아 보낼거다.


근데 그냥 보내면 안 되니까!

내가 의도했던 인증 로직은 아래와 같다.


1. Device 에서 server 에 connect 요청을 한다. 요청시에는 Secret Number를 제외한 식별번호만 username 에 담아 보낸다.


2. Server 에서 connect 요청을 받으면, 일단 username 에 담겨 온 식별번호가 유효한 식별번호인지 DB를 통해 확인한다.


3. 유효한 식별번호라 판단되면 Secret key 역할을 할 임의의 String을 Device 로 보낸다.


4. Device 는 Server 로부터 받은 String을 통해 자신의 Secret Number를 암호화하고, 

    username (식별번호) 와 함께 단방향 암호화된 Secret Number를 password 에 담아 다시 Server 로 보낸다.


5. Server 는 해당 식별번호의 Device 로 보냈던 Secret Key 를 통해 전달받은 password 를 복호화하여, 

    DB에 있는 해당 Device 의 Secret Number 와 일치하는지 확인한다.

    -> 큰일날 소리였다. 비번을 복호화해서 확인하는 인간이 어딨대. 다 생각해놓고 흥분해서 막판에 멍청한 짓을 했다.

         Server 에서도 Secret Key 와 password 를 단방향 암호화하여 Device 가 보낸 암호화 스트링과 일치하는지 확인!


6. 일치하면 Authentication 완료! 불일치하면 Connection Failed!


후,, 완벽해..


일단 이걸 하려면 Server 에서 Connection 요청을 받지 않은 상태에서 Server - Device 간 통신 (패킷 교환) 이 이루어져야 한다.

근데 세상에,, Mosca 에서 제공하는 authentication 방식으로 그걸 어찌 하지???


Big-삽질의 시작이었다.

+ Recent posts