# 작동 시나리오

## 초기 등록

1. APP을 처음 설치하면 병사 정보를 입력하는 페이지가 나온다.
2. 정보를 입력하고 등록 버튼을 누르면 병사 정보를 서버에 전송한다.
3. 서버는 병사 정보를 저장하면서 **40자리 숫자로 이루어진 UUID 값을 생성**해 서버에 저장한다. 그리고 응답으로 **UUID 값**을 APP에게 전송한다.
4. 앱은 응답받은 **UUID 값**을 저장해둔다. 추후에 이 **UUID** 값은 **Time-based OTP 생성에 필요한** **seed 값**으로 사용한다.&#x20;

![](https://2653380560-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKdTwUS64F4uZsg5UX2%2F-MKwO0xlSFjWaVO86OLS%2F-MKwS7LOeHUpup6R5iVr%2F%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%2C%202020-10-31%2011-19-46.png?alt=media\&token=06f8f05c-e64a-40cd-8ea1-79613c85cd56)

## 기기 반납

### APP

1. App에서 반납 버튼을 누르면. **"기기 정보, TOTP 값 등"**&#xC744; 표현하는 **QR Code**를 생성한다.
2. **TOTP**는 **현재 시간을 기준**으로 기기에 저장되어 있는 **seed 값**을 이용하여 생성한다.
3. 짧은 딜레이(10초)가 지날 때마다 화면의 **QR코드도 흐른 시간에 맞추어 변경**된다.

![](https://2653380560-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKdTwUS64F4uZsg5UX2%2F-MKwTvytVtwKYaMyDK-5%2F-MKwWo8ZZKZNgXvl_Neg%2F%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%2C%202020-10-31%2011-40-18.png?alt=media\&token=25710e69-8f3e-4e2a-8261-32b4a1fa9f4f)



### 반납기

1. 라즈베리파이에서 문 닫힘이 감지되면, **일정 시간(10초)**&#xC774; 지난 뒤에 카메라를 활성화하여 **QR코드를 감지**하기 시작한다.

{% hint style="info" %}
반납하는 사람에게 **노출된 QR코드가 아닌** 시간이 지나고 난 후 **다른 QR코드가 표시된 것**을 인식하도록 하기 위함!
{% endhint %}

![](https://2653380560-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MKdTwUS64F4uZsg5UX2%2F-MKwacF6s0ZeVd75uEoV%2F-MKwamIf7eFVIgoKxjtO%2F%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%2C%202020-10-31%2012-02-09.png?alt=media\&token=e1a0bc1d-c4a9-470e-8682-0bc2a1e4e8fc)

1. 라즈베리파이는 감지한 **QR코드를 해독**하여 **기기 번호, 관리자 번호, TOTP 값을 추출한다**.
2. **기기 번호, TOTP 값과 인식한 당시 시간을** 서버에 전송한다.
3. 서버는 **TOTP 값**과 **인식한 당시 시간**을 이용해 **올바른 TOTP 값인지를 검증**한다.
4. 서버는 응답으로 검증 **성공 여부를 반납기에 전송**한다.
5. 검증에 성공한 경우, 반납기는 서버에게 기기 종류, 반납한 시간, 무게 정보, 기기 사진을 전송한다.
6. 서버는 해당 반납 기록을 저장한다.

{% hint style="info" %}
핸드폰 사진과 무게 정보를 이용하여 병사가 등록되어있지 않는 기기를 몰래 반입해 제출하는 일명 투폰을 방지하는데 사용한다.
{% endhint %}

