사전에 공유된 pre-shared key를 아래에서는 Seed값이라고 명칭한다.

작동 방식

초기 등록

앱 → 서버 : 앱에서 사용자의 정보를 입력하고 서버로 전송한다

서버 → 앱 : 전송받은 정보를 데이터베이스에 저장하고 랜덤값을 하나 생성하여 병사 고유 값(Seed 값)으로 저장하고 응답으로 Seed값을 넘겨준다

앱 : 받은 Seed값을 디바이스에 저장한다.

이때 Seed값은 앱, 서버 두곳에서 보유한다.

반납과정 (이때부터는 스마트폰은 네트워크에 연결되어 있지 않아도 됨)

앱 : 반납 버튼을 누르면 위에 Seed값과 현재 시간값을 기반으로 TOTP값을 생성한다.

앱 : TOTP값과 사용자 정보를 이용하여 QR코드를 생성한다.

앱 → 라즈 → 서버 : QR코드를 인식해 앱에서 생성한 TOTP값과 사용자 정보를 서버로 전송한다

서버 : 서버에서 앱에서 받은 TOTP 값과, 서버에 저장되어 있는 병사정보중 Seed값을 불러와 현재시간으로 TOTP 생성을 한다. 만약 앱에서 생성한 TOTP값과 서버에서 생성한 TOTP값이 동일하면 인증완료

위에서 앱에서 TOTP 생성한 시간과 웹에서 TOTP 생성한 시간이 다를수 있지만 TOTP 생성 과정에서 키가 유지되는 시간을 지정할수 있기때문에 문제를 해결할수 있다.