Skip to main content

2021-08-14

국방오픈소스아카데미 개발 계획서

프로젝트 - 용사여 그대는 어디에

I. 아이템 개요


본 계획서는 markdown 형식으로 작성되었습니다. Github 에서 보기

1.1 아이템 구상 과정

지원자가 개발하려는 [용사여 그대는 어디에] 앱은 유동병력 관리를 휴대폰에서 할 수 있게 하는 앱이다. 인터넷망의 이점을 통해 유동병력 관리를 훨씬 효율적이게 한다. 앱에 대해 소개하기 전에 유동병력의 의미와 개선할 점을 짚어본다.

영내 거주의무가 있는 용사들은 비일과 시간에 자신의 위치를 지휘관(당직사관)이 알릴 의무가 있다. 이는 실상황에 빠르게 소집하고 예기치 못한 사고 등을 예방하기 위함이다. 개개인의 위치를 공유함으로써 필요한 인원을 빠르게 찾을 수 있게 하는 동시에, 평시에는 다른 공간으로 이동하여 여가시간을 즐길 수 있도록 이동의 자유를 보장해주는 역할을 한다.

지원자의 자대에서는 유동병력 보고가 필요할 시 자신의 위치를 행정반에 있는 화이트보드에 적고, 복귀할 시 이름을 지우는 식으로 보고를 대신한다. 이러한 방법이 많은 부대에 보편적으로 사용되고 있다. 이외에도 이름을 작성하는 대신 이름이 적힌 자석을 원하는 위치에 옮겨 붙이는 방법도 많은 부대에서 채택하고 있다.

1.2 기존 통제 방식의 취약점

기존의 유동병력 통제 방식은 많은 허점이 있다. 그 중 가장 큰 문제는, 최신화가 주체적이지 않다는 점이다. 기존의 유동병력 현황판은 최신화가 개개인의 자발적인 보고로 이루어진다. 개개인 모두가 잊지 않고 현황판에 표시를 해주어야만이 최신화가 완전해진다. 다시 말해, 인간의 실수로 최신화가 불완전해질 여지가 다분하다는 것이다. 일례로, 이동하는 데 보고를 잊을 수도 있고, 기존에 보고된 장소에서 벗어날 때 변경 보고를 하지 않는 경우도 있을 수 있다. 이는 중앙에서 '통제'하는 것이 아닌 '공동규약'을 지키는 것에 가깝다. 병력 관리의 책임이 있는 당직근무자 입장에서는 자신의 통제가 닿지 않는 운영방식인 것이다.

둘째로, 기존의 유동병력통제 방식은 현황을 표시할 뿐, 그 외의 기능은 전혀 없다는 점이다. 유동병력 관제의 핵심은 유사 시 인원들을 즉시 통제할 수 있게 하기 위함인데, 현재 방식은 개개인의 위치만 수동적으로 표현할 뿐, 그들을 소집하거나 이동통제할 방법을 제시하지 못한다.

셋째로, 병력이 보고한 대로 이동하였는지 확인할 방법이 없다는 점이다. 한 용사가 장소 A 에 가겠다고 보고하고 장소 B 로 가도 당직근무자는 알 길이 없다. 이런 허점은 허위보고를 유도하고 현황판이 무의미해지며, 결국 통제의 실패로 이어지게 된다.

2. 앱의 사용 소개

[용사여 그대는 어디에] 앱은 위의 문제들을 해결하기 위해 고안되었다. 사용자들과 당직근무자가 긴밀하게 소통할 수 있는 채널을 만듦으로써 병력 통제와 비일과시간 자유가 보장된다.

[용사여 그대는 어디에]앱은 사용자가 로그인을 함으로써 서비스가 개인화된다. 용사의 경우 보고를 하는 입장이고, 당직근무자의 경우 보고를 받는 입장이기 때문에, 그에 맞는 페이지가 각각 제공된다.

군의 특성상 GPS 기반의 위치 인식 서비스를 제공하기엔 제한사항과 위험 부담이 크다. 그렇기에, 각 장소를 표현하기 위해 OTP 및 OTP 발생기를 도입한다. 각 발생기에 내장된 고유 key 를 통해 공간을 특정하고, 필요시 용사에게 새로 부여하는 번호를 통해 인증 시각과 사용자를 특정한다. OTP 는 각 장소에 NFC 인식기를 연결함으로써 검증 과정을 편리화할 수 있다.

2.1 용사 사용자의 앱 사용 소개

용사로 로그인 된 [용사여 그대는 어디에]앱은 네 개의 페이지로 구성된다.

1 비대면 유동병력 출발보고 - '이동보고' page

'이동보고' 페이지 에서는 두 가지를 입력해 서버로 요청을 전송할 수 있는 form 이 제공된다. 용사가 갈 수 있는 장소들이 버튼들로 보여지고, 아래에 간단한 사유를 적을 수 있는 textfield 가 보여진다. 적절히 고르고 입력한 수 '보고' 버튼을 누르면 당직사관에게 보고 알림이 간다.

2 비대면 유동병력 도착보고 - '도착보고' page

'이동 보고' 페이지에서 당직근무자의 승인이 났을 경우, 용사의 앱에서는 '도착 보고' 페이지로 자동 전환된다. 이 화면엔 하나의 숫자가 보여진다. 영내의 각 장소에는 장소 고유번호를 내부 key 로 가지는 OTP 발생기 및 NFC 태그가 비치되어 있다. 용사는 가기로 보고한 장소에 도착해서, 태그에 휴대폰을 인식시킨다. 그러면 OTP 발생기는 NFC 로 입력받은 숫자와 현재 시각과 장소 고유번호를 입력값으로 하여 OTP 를 하나 생성해낸다. 사용자는 이 OTP 를 NFC 로 받게 된다. 그렇게 되면 서버는 이 OTP 를 검사하고, 당직사관에게 도착보고가 자동으로 간다. 그와 동시에 서버 내 용사의 위치정보를 갱신한다. 막사로 복귀 시 행정반 안의 NFC 태그에 휴대폰을 인식시키면 된다.

3 현위치 최신화 보고 - '현위치 보고' page

당직근무자가 불시 인원 위치 점검을 요구했을 때, 용사에게 알림이 가게 된다. 각 용사는 자신과 가장 가까운 OTP 생성기를 및 NFC 태그를 통해 자신의 위치를 증명한다. 이를 통해 현재 수집된 이동현황의 신뢰도를 높일 수 있다.

4 소집 지시 하달 - '소집 지시' page

넷째는 '소집 지시' 페이지이다. 이 페이지에서는 초시계와 하나의 textfield 가 주어진다. 초시계는 당직근무자가 정한 소집까지의 기한이고, 아래 textfield 는 용사가 도저희 시간 안에 못 올 사유가 있는 경우, 그 사유를 적어 당직근무자에게 보내는 form 역할을 한다.

2.2. 당직근무자의 앱 사용 소개

당직근무자로 로그인 된 [용사여 그대는 어디에] 앱은 다음 기능들이 있다.

1 비대면 유동병력 보고 - '결재' page

용사가 '이동 보고'화면에서 '보고' 버튼을 누르면 당직근무자에게 알림이 온다. 당직근무자는 이를 확인하고 승인 혹은 기각을 할 수 있다.

2 용사 현위치 관제, 불시 위치 점검 - '현황' page

당직근무자는 '유동병력 현황' 화면에서 각 장소에 누가 가 있는지 한눈에 확인할 수 있다.

당직근무자가 '현황' 화면에서 원하는 범위의 용사들을 선택하고 '현위치 보고' 버튼을 누른다. 그렇게 되면 해당 용사들에게 알림이 가고, 즉시 일정 시간 이내에 현위치에 설치된, 혹은 가장 가까운 OTP 생성기를 통해 OTP 를 발급받아 입력한다. 당직사관은 이를 모두 관제할 수 있다.

'현위치 보고'에 미응답한 용사가 있을 경우, 용사가 마지막으로 보고한 위치에 있는 다른 용사들에게 위치를 물을 수 있다.

3 막사외 인원 소집 - '통제' page

당직근무자가 '통제' 화면에서 원하는 범위의 용사들을 선택하고, 소집하는데 부여할 시간을 적는다. '소집' 버튼을 누르면 해당 용사들에게 알림이 가고, 용사들에게 '소집 지시' 페이지가 보여지게 된다. 당직근무자에겐 누가 막사에 도착했는지를 실시간으로 확인할 수 있게 list 로 보여준다. 용사가 '소집 지시' 페이지를 통해 미복귀 사유를 송신할 시 이를 보고 병사에게 적절한 피드백을 알림으로 보내거나, 음성전화를 걸 수 있다.

4 당직 교대 -'교대' page

당직근무가 끝났을 시, 그다음 교대인원에게 자신의 권한을 넘겨줄 수 있어야 한다. '교대' 페이지에서 교대 인원의 아이디를 입력하고, 전송 버튼을 누르면 교대인원에게 알림이 간다. 교대인원이 근무 교대를 수락하면 새로운 토큰이 부여되고, 이를 통해 당직근무자의 권한을 넘겨받을 수 있다.

2.3 운영자 페이지

운영자 페이지에서는 각 장소를 대표하는 OTP 생성기의 내부 대칭키를 등록하고, 새 유저(전입 신병) 을 추가할 수 있다. 또, 당직근무 계획을 업데이트 할 수 있다.

3. OTP 발생기 / NFC 태그

OTP 발생기는 사용자가 자신이 있는 장소를 증명하기 위한 중요한 도구로 사용된다. 자세한 검증 알고리즘은 아래에 탑재한다.

OTP 는 두가지 OTP 를 생성할 수 있다. 첫째는, 도착 보고시 자신의 도착을 증명하기 위해서 발급받는 OTP 이다. 이를 생성할 때는 서버에서 사용자에게 고유로 보내준 번호를 패드를 통해 입력받고, 새로운 OTP를 생성하면 된다.

둘째는 현위치 보고시 발급받는 OTP 이다. 현위치 점검시에는 최대한 빠른 보고가 관건이므로, 오직 시간과 발생기 고유번호를 통해 숫자를 발급한다. 이 번호를 사용자들끼리 전파하여 그 위치에 있지 않더라도 허위 보고를 할 가능성이 있으니, 주기적으로(30초) 갱신이 되어야 한다.

이 모든 과정을 NFC 기술을 이용해 휴대폰을 대기만 하면 OTP 가 입력이 되는 식으로 만들면, 두가지 OTP 를 쓸 필요 없이 첫번째 종류의 OTP 를 서버와 주고 받아 편리하게 장소를 증명할 수 있다.

II. 계획 및 목표


1. 위치 검증 알고리즘

자신의 위치를 증명해야 하는 상황은 두가지가 있다. 첫째는 자신이 이동하여 특정 장소에 도착했을 때이고, 둘째는 급히 현위치를 보고해야 할 경우이다. 두 경우 상황이 많이 다르기 때문에 과정 간소화 등을 위해 다른 알고리즘을 사용한다.

첫째 상황 즉, 이동할 장소에 도착했을 때의 위치 보고일 때는 검증 과정이 다음과 같다: 먼저, 서버가 발행한 시간 기반 인증값을 각 사용자의 고유번호로 hash 하여 사용자에게 보낸다. 이때의 hash 는 역상 저항을 주기 위함이므로, SHA-256 으로 hash 하여 앞의 6 숫자(16진수) 를 사용한다.사용자는 이 숫자를 OTP 에 NFC를 통해 입력한다. OTP 는 자신의 고유번호로 입력값을 대칭키 암호화함으로써 위치를 전자서명한다. 사용자는 암호화된 정보를 NFC 를 통해 다시 받고, 이를 서버로 전송한다. 서버에서는 사용자가 가기로한 장소의 고유번호로 복호화하고, 사용자에게 일전에 보낸 내용과 같은지 비교한다.

이 검증 방법은 다음과 같은 장점이 있다. 첫째, 각 OTP 가 인터넷에 연결되어있지 않아도 된다는 것이다. 기기는 숫자를 입력받고 이를 전자서명하기만 하면 된다. 이 과정이 사용자가 임의로 가로챌 수 없으며, 따라서 대리 도착보고 등의 허위 보고를 사전차단할 수 있다.

두번째 상황은 이런 해싱과정을 간소화하여 빠른 보고를 가능하게 한다. 물론, NFC 통신체계가 구현되면 그 전 방법이 매우 간편하게 진행될 수 있기 때문에 필요가 없어진다. 알고리즘은 다음과 같다. 먼저, OTP 는 30초 단위로 시간값을 자신의 고유번호로 대칭 암호화한다. 사용자는 이 번호를 '현위치 보고' page 에서 입력하여 서버로 전송한다. 서버에서는 이를 받아 어느 장소에서 보냈는지 모든 고유번호들을 사용해 복호화해보면서 알아낸다.

이 두번째 검증방법은 다음과 같은 장점이 있다. NFC 기술이 인프라 구축 비용이 많이 들어 상용화에 걸림돌이 될때, 이 알고리즘을 사용하면 NFC 기술이 없이도 사용자의 UX 를 높일 수 있다. 숫자 몇자만 사용자가 입력하기면 되기 때문이다.

2. Frontend (End User)

네이티브 앱으로 개발할 것이다.

기술스택 : Flutter(APP)

만들어야 할 페이지들은 다음과 같다. 각각의 UI 스케치는 Kakao Oven 을 통해서 구상할 것이다.

로그인 page 회원가입 page - 회원가입 요청하면 운영자 페이지에서 승인해야 함.

'이동보고' page '도착보고' page '현위치 보고' page '소집 지시' page

'결재' page '현황' page '통제' page '교대' page

고려사항

당직근무자가 모든 사용자의 위치를 한눈에 파악할 수 있도록 하는 방법을 고안해야 한다. 각 부대의 정확한 내부 지도를 인터넷에 업로드하는 것은 군보안상 위험하다. 그러므로, 그 공간을 아는 사람은 이해할 수 있되, 그렇지 못한 사람은 이해하기 힘든, 다시말해 내집단에서만 이해할수 있는 장소 표현법이 필요하다.

3. Backend (Server)

기술스택 : Firebase(DB, Server, Authorization) API : HTTP API 에 json 으로 내용 통신.

1 API 구상 - 용사

로그인 page
- POST /login 요청 json {id, password} => 응답 json {status, message, token}

회원가입 page - 운영자 페이지에서 승인해야 함.
- POST /register 요청 json {name, id, password, email} => 응답 json {status, id, message}

'이동보고' page
- POST /report (+token 헤더) 요청 json {id, where} => 응답 json {status, message permission, hash}

'도착보고' page
- PUT /report (+token 헤더) 요청 json {id, otp} => 응답 json {status, message}

'현위치 보고' page
- POST /emergency (+token 헤더) 요청 json {id, otp} => 응답 json {status, message}

'소집 지시' page
- PUT /returnbase (+token 헤더) 요청 json {id, otp, message} => 응답 json {status, message}

2 API 구상 - 당직근무자

'결재' page
- PUT /report (+token 헤더) 요청 json {id, target_id, permission} => 응답 json {status, target_id, message}

'현황' page
- GET /moving (+token 헤더) 요청 json => 응답 json {status, message}

'통제' page
- (위치 보고 지시) GET /emergency (+token 헤더) 요청 json {id, message} => 응답 json {status, message}

- (소집 지시) POST /returnbase (+token 헤더) 요청 json {id, otp, message} => 응답 json {status, message}

'교대' page
- (이전 근무자용) POST /rotation (+token 헤더) 요청 json {id, target_id} => 응답 json {status, target_id, message}
- (교대 근무자용) PUT /rotation (+token 헤더) 요청 json {id, accept} => 응답 json {status, target_id, message}

고려사항

사용자 위치 정보 열람 권한을 사용자마다 다르게 줘야 한다. 당직근무자 권한을 가진 사용자만이 일반 사용자들의 위치를 파악할 수 있게 권한을 조정해야 한다. 그러므로, 현 당직근무자를 식별할 수 있는 인증 토큰이 필요하다.

당직근무자는 딱 1명(혹은 2명) 만 임무수행하고 있으므로, 인증토큰은 한 시각에 단 하나(혹은 둘)만 유효해야 한다. 교대 근무자에게 인계하는 과정에서, 새로은 토큰을 비공개로 생성함과 동시에 기존 토큰을 무효화시켜야 한다.

운영자 페이지에서는 DB 테이블을 직접 수정할 수 있도록 query 문을 작성할 수 있는 곳을 만들어주면 된다. 운영자페이지는 해킹의 대상이 될 확률이 매우 크므로 보안에 유의해야 한다. 아무 query 문을 적어선 안되므로, Form 으로 만들어 자유도를 낮출 수 있다.

sql injection등의 공격을 방어할 방법을 고안해야 한다.

4. OTP 발생기 (Infrastructure)

OTP 발생기는 여러 장소에 설치되어야 하기 때문에, 단가가 낮을수록 좋다. 위치 검증을 위한 해시 알고리즘이 탑재되어야 하고, 사용자가 자신의 해시를 입력할 수 있는 키패드와 입력한 값과 출력한 값을 볼 수 있는 LCD 2개 가 필요하다.

이번 온라인 해커톤에서 IoT 분야로 지원한 장병들을 팀원으로 꾸려 OTP 발생기를 의뢰하고 싶다. 본 지원자는 알고리즘 구현을 하고 실행 파일로 만들 예정이다. 후에 아두이노로 장비를 만들 수 있게되면 이 실행파일을 탑재하기만 하면 된다. 테스트를 위해 실행파일은 CLI 기반으로 만든다.

NFC

이 앱의 목표인 '유동병력 보고 간편화' 와 '허위 보고 방지'를 구현하는데 결정적인 역할을 하는 것은 바로 NFC 기술이다. 휴대폰을 갖다 대기만 하면 보고가 되고, 자신의 위치를 증명할 수 있으며, 다른 사람이 가로챌 수 없기 때문에 신뢰도가 매우 높다. 무엇보다 중요한 것은, 엄청나게 편리해진다는 것이다. 다시말해 UX 를 드라마틱하게 높일 수 있는 핵심 기술이다.

5. 알림 체계

이 앱에서 알림체계는 원거리 사용자들을 소집할 수 있다는 점에서 중요한 역할을 한다. 알림 전송이 필요한 순간은 다음과 같다.

  • 용사가 이동 보고할 시 당직근무자에게 알림.
  • 용사가 도착 보고할 시 당직근무자에게 알림.
  • 당직근무자가 불시 현위치 보고를 요청했을 때 용사에게 알림.
  • 특정 용사가 현위치 보고가 늦어질 때 당직근무자에게 알림.
  • 당직근무자가 긴급 소집을 지시했을 때 용사에게 알림.
  • 용사가 긴급 소집을 하지 못할 사유를 보내올 시 당직근무자에게 알림.
  • 당직근무 교대 시 교대 근무자에게 교대 알림.
  • 회원 가입 요청시 운영자에게 알림.

이 것에 추가로 응급상황 발생을 알리는 알림을 추가하면 더할 나위 없이 좋을 것이다. 이 알림은 당직근무자 뿐만 아니라 모든 사용자에게 보내 근처 사람이 도우러 올 수 있게 한다.

III. 효과 및 전망


1. 효과

[용사여 그대는 어디에] 앱은 기존의 유동병력 관리 방법에 비해 다음의 장점이 있다.

첫째, 유동병력 보고를 어디서든 용이하게 할 수 있다. 어디를 가던 인터넷만 연결되면 유동병력 보고를 할 수 있어, 굳이 행정반에 와서 보고를 하지 않아도 된다. 특히 격리자등 대면보고가 어려울 경우 더욱 용이하게 사용될 수 있다.

둘째, 병력 소집을 편리하게 할 수 있다. 기존 방법과 달리, 원거리에 있는 용사에게 직접 가지 않고도 동시에 소집 지시를 내릴 수 있다.

셋째, 불시 점검을 통한 현황 신뢰도를 높일 수 있다. 보고 없이 이동하는 병력을 알아차릴 수 없는 기존의 방법과 달리, 원하는 때에 현황 최신화를 요청함으로써 언제든 정확한 유동병력현황을 파악할 수 있다.

2. 전망

이 앱은 그 핵심에 '사용자의 위치 공유'가 있다. 사용자의 위치를 공유하는 과정을 구축해 놓으면 이에 관련된 여러가지 파생 프로젝트에 사용될 수 있는 유용한 기술기반이 될 것이다. 예를 들어, 현장학습 시 아이들을 다시 모아야 하는 선생님들에게 유용할 수 있다.

"용사여 그대는 어디에" 앱이 부대에 적용되게 되면 용사들은 더욱 편리하게 유동병력 보고를 할 수 있고, 당직사관은 이를 실시간으로 확인할 수 있다. 따라서, 용사들은 자신의 개인정비시간 내 행동의 자유를 더욱 보장받을 수 있고, 당직사관은 병력 통제를 더욱 안정성 있게 할 수 있다. 이는 유사시 빠르게 대응해야 하는 군의 중요한 병력통제도구로 사용될 것이다.