스마트폰 없이도 결제한다: 고등학생이 매점에 지문인식 결제 시스템을 직접 만들어 배포한 이야기

한눈에 보는 요약
한국디지털미디어고등학교에는 디미페이라는 인하우스 QR 간편결제 솔루션이 있었습니다. 그런데 2026학년도부터 초·중등교육법 제20조의5에 따라 교내 스마트폰 소지가 제한되면서, QR 결제라는 전제 자체가 무너져 버렸죠.
그래서 만든 것이 지문인식 결제 단말입니다. 하드웨어 보드 설계부터 펌웨어, 서버, 인프라까지 전부 직접 만들어 실제 교내 매점에 배포했고, 첫 버전의 5.8초짜리 인증 지연을 1.38초까지 줄여냈습니다.
숫자로 먼저 보면 이렇습니다.
- 평균 인증 지연: 5.8초 → 1.38초 (약 79.7% 단축)
- 최대 병목이던 센서→MCU 구간: 3.8초 → 360ms (약 90.5% 감소)
- 2026년 5월 한 달 성공 결제 7,454건 중 3,199건(약 43%)이 지문인식 결제
- 지문인식 결제만으로 월 582만 원의 결제액 기록
학생 프로젝트라기엔, 이미 매점에서 실제로 돌아가는 프로덕션 시스템입니다.
시작부터 만만치 않았던 제약 조건
재미있는 건 이 프로젝트의 난이도가 대부분 "현실의 제약"에서 왔다는 점입니다.
- 유선 연결 불가: 키오스크가 iPad라서 MFi 인증 없이는 유선으로 붙일 수 없습니다. 통신 수단은 사실상 BLE 하나뿐이었습니다.
- 센서가 인증을 하지 않음: 센서는 이미지만 뽑아주고, 실제 매칭은 서버가 담당하는 구조입니다. 즉 지문 이미지가 네트워크를 타야 합니다.
- 생체정보 가이드라인 준수: 원본 지문은 저장할 수 없고 미뉴티아(특징점)만 저장해야 하며, 전송 구간 암호화는 필수입니다.
- 성능 요구조건: 손가락을 올린 시점부터 결제 토큰 발급까지 2초 이내.
마지막 조건이 특히 잔인합니다. 무선으로, 이미지를 서버까지 보내서, 매칭까지 끝내고 2초 안에 들어와야 하니까요.
매칭 엔진: SourceAFIS를 고른 이유
지문 매칭 알고리즘으로는 SourceAFIS를 선택했습니다.
- 후보였던 NIST NFIS는 지원하는 최소 이미지 크기가 센서 출력보다 커서 탈락했습니다. 레거시라 빌드조차 도커로 겨우 성공했다고 하네요.
- SourceAFIS는 공식 구현체가 Java/.NET뿐이라, JS로 포팅하는 대신 내부망에 Java 웹서버를 따로 띄우는 실용적인 선택을 했습니다.
캐싱 설계도 눈여겨볼 만합니다. 기동 시 전량을 조회해 user id와 미뉴티아를 분리 캐싱하고, 런타임 갱신은 DB 트랜잭션 커밋 이후에만 락을 걸고 반영합니다. 캐시가 DB보다 앞서가는 상황을 원천 차단한 것이죠.
V1은 왜 실패했나 — 범인은 UART
5.8초라는 숫자를 뜯어보니, 그중 3.8초가 센서→MCU UART 업로드였습니다. baud rate 한계 때문에 이미지를 압축해도 그 아래로는 내려가지 않았습니다. 소프트웨어로 풀 수 있는 문제가 아니었던 겁니다.
해결책은 요구조건 자체를 바꾸는 것이었습니다.
- "12MHz 이상 SPI를 지원하는 지문센서" 를 요구조건에 추가
- 제조사에 직접 컨택해 ADH-TECH HF302GD (SPI 16MHz, 256×360 / 508dpi)로 교체
- nRF54L15 보드를 직접 설계. 2.4GHz IFA 안테나는 TI AN043 앱노트를 옮긴 뒤 Nordic Q&A를 통해 설계를 검증받음
- 매점 상주 인원이 SWD로 BLE 인증번호를 확인할 수 없으니, OLED를 달아 페어링·상태확인·오류보고를 보드 자체에서 처리
마지막 항목이 특히 인상적입니다. 성능 최적화만이 아니라 "매점 직원이 이걸 어떻게 쓸까"까지 하드웨어 설계에 반영한 셈이니까요.
디버깅 하이라이트: 8MHz로 발진하던 DECA 라인
보드 브링업 과정에서 만난 Failed to power up DAP 에러의 원인은 DECA 라인이 8MHz로 발진하는 것이었습니다. 누락된 2.2uF 디커플링 커패시터를 추가하니 해결됐습니다.
여기서 글쓴이가 솔직하게 밝히는 부분이 좋습니다. 당시 세웠던 가설(벅컨버터 LC 감지 실패)은 틀렸고, 한참 뒤에 "LDO에 디커플링 커패시터가 왜 있어야 하는가"를 파고들다 진짜 답을 찾았다는 겁니다.
그 답은 이렇습니다.
LDO는 수동 소자가 아니라 피드백 루프로 내부 P-MOS 게이트를 조절하는 능동 구조입니다. 출력 커패시터는 루프가 적용되기 전 구간의 오버/언더슈트를 억제하는 역할을 하죠. 10nF에서는 전압 변화와 피드백이 만드는 저항 변화가 반전되면서 발진이 일어난 것이었습니다.
증상을 고친 뒤에도 원인을 끝까지 파고든 기록이라, 배울 점이 많은 대목입니다.
지문 이진화 파이프라인을 세 번 갈아엎다
8bpp 이미지를 1bpp로 변환하는 이진화 과정도 세 세대에 걸쳐 진화했습니다.
- 1세대 — 고정 Threshold: 지문이 평평한 사용자는 패킹 과정에서 융선이 통째로 소실됐습니다.
- 2세대 — 전역 동적 Threshold: 융선이 40%를 차지하도록 조절했지만, 손가락을 프레임에 꽉 채우지 않거나 가운데만 강하게 닿는 경우에 한계가 있었습니다.
- 3세대 — Local window 표준편차: 픽셀별 local window 표준편차가 3배 이상 차이나면 ridge로 판별하고, 전역 평균+bias보다 밝은 픽셀은 제거해 흰 영역 노이즈를 잘라냈습니다.
"평균적인 사용자"가 아니라 지문이 평평한 사람, 손가락을 대충 올리는 사람까지 커버해야 실제 매점에서 쓸 수 있다는 걸 보여주는 과정입니다.
펌웨어와 운영: 보안과 회수 가능성
펌웨어 쪽에서도 만만찮은 일들이 있었습니다.
- 문서가 없는 센서: 데이터시트 레지스터 테이블에 이름만 있고 설명이 없어서, 제조사가 준 AS608 테스트보드 소스를 읽고 프로토콜을 역으로 복구했습니다.
- BLE 프로토콜: NUS 위에 소규모 커스텀 바이너리 프로토콜을 올렸고, 보안 연결이 성립되지 않은 상태의 캡쳐 요청은 거부합니다.
보안·프라이버시 설계는 특히 촘촘합니다.
- 지문 DB는 다른 서비스 DB와 물리적으로 분리된 독립 DB
- 인바운드는 서버 IP로 제한하고, 아웃바운드는 아예 허용하지 않음
- 내부망 전용 SourceAFIS 서버도 SSRF에 대비해 토큰 인증을 요구
- 등록 시 전체 DB에 매칭을 수행해, 이미 타인 계정에 등록된 지문이면 거부
운영 편의성도 놓치지 않았습니다. 매번 분해해서 J-Link를 꽂기 싫어서 BLE DFU를 구성했는데, Flash Slot 2 기록 → CRC 검증 → pending 표시 → Reset 순서라 전송이 끊겨도 기존 펌웨어로 안전하게 부팅됩니다. 매점에 나가 있는 단말이 벽돌이 되면 답이 없으니, 꼭 필요한 설계죠.
결과: 어디서 시간을 벌었나
| 구간 | V1 | V2 | |---|---|---| | 지문 이미지 읽기 | 3.80s (UART) | 0.36s (SPI) | | 이미지 처리 | 0.3s | 0.63s | | BLE 전송 | 1s | 0.15s | | 서버 매칭 | 0.7s | 0.24s |
흥미로운 건 이미지 처리 시간은 오히려 늘었다(0.3s → 0.63s)는 점입니다. 3세대 이진화 파이프라인이 더 무거워진 대가죠. 하지만 센서 읽기에서 3.4초 넘게 벌었기 때문에 전체적으로는 압도적인 이득입니다. 어디를 최적화할지 정확히 골랐다는 좋은 사례입니다.
마치며
이 프로젝트가 인상적인 이유는 단순히 "고등학생이 만들었다"가 아닙니다.
- 제도 변화(스마트폰 반입 금지)라는 실제 문제에서 출발했고
- UART 병목처럼 소프트웨어로 못 푸는 문제는 하드웨어 요구조건을 바꿔서 풀었고
- 생체정보라는 민감한 데이터를 가이드라인에 맞춰 분리·최소화해 다뤘으며
- 월 582만 원의 실제 결제를 처리하는 프로덕션으로 굴러가고 있습니다.
무엇보다, 발진 원인을 잘못 짚었던 것을 나중에 바로잡은 기록처럼 실패와 오답까지 남긴 문서라는 점이 좋습니다. 임베디드, BLE, 생체인증 어느 쪽에 관심이 있든 한 번 읽어볼 만한 사례입니다.
원문 출처: GeekNews - 개발/기술/스타트업 뉴스 서비스