본문 바로가기

AWS IoT/안드로이드 앱

[AWS LED Button] 어플리케이션 (1) : 시스템 흐름

시스템 / 인증 흐름

AWS 서비스들은 위와 같이 유기적으로 연결될 수 있습니다. 그리고 대부분의 AWS 프로젝트는 몇가지 서비스가 연동되어 구성됩니다.

Cognito

모바일 앱과 웹에 가입, 로그인 기능을 제공하고, 이에 대한 권한을 부여하는 AWS 서비스입니다. Cognito는 Cognito User Pool과 Cognito Federated Identities Pool(ID Pool)로 나뉩니다.

    1. Cognito User Pool
      AWS에서 제공하는 Identity Provider입니다. 링크를 걸어 놨지만 간단히 예를 들면, 요즘 많은 앱이나 웹에서 "구글 아이디로 로그인"이라는 기능을 볼 수 있는데 그것이 구글에서 제공하는 Identity Provider입니다. 주의할 것은 Amazon에서도 Identity Provider를 제공하는데 이것은 AWS에서 제공하는 Cognito User Pool과 구분된다는 것입니다.
    2. Cognito Federated Identities Pool
      Cognito User Pool 뿐만 아니라 외부 Identity Provider를 연결해서, 연결된 Identity Provider를 통해 로그인하여 접근한 경우와 연결되지 않은 경로로 접근한 경우를 구분하여 권한을 부여합니다.

      참고로 Cognito User Pool에도 외부 Identity Provider를 연결할 수 있습니다. 이 경우에는 사용자 정보를 Cognito User Pool에서 통합하여 관리할 수있는 장점이 있다고 합니다.

      그림으로 그리면 대충 이렇게 됩니다. 

      user A처럼 접근한 것이 이 프로젝트 이고 user B처럼 접근한 것이 AWS Android examples 중 AndroidPubSubWebSoket 예제입니다.

IAM

권한을 미리 정의해 놓는 곳입니다. 이 권한은 "정책(Policy)"에 정의되며 "역할(Role)"에 부착됩니다. 그리고 대부분의 AWS 서비스는 IAM에 미리 정의된 "역할"을 맡은(Assume) 후에 그 기능을 이용할 수 있습니다. Cognito에서 Federated Identities Pool을 생성할 때, 자동으로(직접 조작 가능) IAM에 "인증된 역할"과 "인증되지 않은 역할"이 생성됩니다. 그 후 IAM에 들어가서 각 역할의 권한을 설정하면, Cognito에 연결된 Identity Provider에서 로그인하여 접근한 경우와 그렇지 않은 경우의 권한을 달리 설정할 수 있습니다.


AWS의 어떤 서비스가 IAM에 정의된 "역할"을 맡으면 Security Token Service(STS)에 임시 자격 증명이 생성됩니다. 이 임시 자격 증명은 사용자 디바이스에 저장되지 않고 AWS의 STS에 저장됩니다. 위의 다이어그램에서 굳이 AWS 영역을 구분해 놓은 것도 이것을 강조하기 위해서 였습니다. 

 

사용자는 로그인할 때 자격 증명 대신 Cognto ID Pool로 부터 Identity ID를 부여받습니다. 그리고 이 Identity ID를 사용하여 STS의 임시 자격 증명에 접근할 수 있습니다.

 

자격 증명이 사용자 디바이스에 저장되지 않기 때문에, 디바이스가 해킹당해도 AWS에 대한 접근 권한 자체를 해킹당하지는 않습니다. 로그인 정보를 해킹당하면 소용없지만, 개발자는 로그인 정보에 대한 보안만 신경쓰면 되기 때문에, 개발자의 부담이 줄어든 것은 사실입니다.


IoT
AWS LED Button - ESP32 포스트에서 이미 설명했지만, MQTT 프로토콜의 브로커 역할을 담당여 사물과 앱 클라이언트간 통신을 중재합니다. 

 

여기선 전체적인 시스템 흐름을 간단히 설명하고 자세한 부분은 다음 포스트에서 설명하겠습니다. 

 

먼저 개발자는 Cognito ID Pool을 생성하고, 인증된 접근(해당 ID Pool에 연결된 Identity Provider로 접근)을 했을 때 맡게될 IAM 역할을 해당 Pool에 연결합니다. IAM 역할에는 IoT 서비스에 대한 권한(정책)이 부착되어야 합니다.

 

사용자는 안드로이드 앱 어플리케이션에서 Cognito User Pool에 회원가입하고 로그인합니다. 이때 사용자는 Cognito ID Pool로 부터 Identity ID를 받을 수 있고, AWS STS에는 해당 역할에 대한 "임시 자격 증명"이 생성됩니다. 사용자는 Identity ID를 이용하여 AWS STS에 있는 "임시 자격 증명"에 접근할 수 있습니다.

 

IoT 내에서 생성된 인증이 아닌 외부의 인증(AWS STS "임시 자격 증명")으로  IoT에 접근하려면, "임시 자격 증명"에 IoT에 대한 권한이 명시되어 있다고 하더라도, IoT 내에서 생성된 권한(정책)이 중복으로 부착되어야 합니다. 따라서 "임시 자격 증명"에 접근할 수 있게된 사용자는 또다시 IoT 서비스 내 앱 클라이언트를 위한 정책을 "임시 자격 증명"에 부착합니다. 이 정책은 IAM 역할에 부착된 정책과 동일하거나 더 넓은 범위를 가져야 합니다. 

 

이후 사용자는 IoT에 연결되어 MQTT 프로토콜을 통해 사물과 간접 통신할 수 있게 됩니다.