Lab QR Access · 실습실 QR 출입 시스템
폰으로 실습실 이용을 신청하고, 승인되면 30초마다 바뀌는 QR로 문을 여는 출입통제 시스템 (Cloudflare Workers + ESP32-P4 단말)
| NO. | S-03 |
|---|---|
| FIELD | 웹 · 임베디드 |
| SCALE | 일반 |
| TOOLS | Workers · ESP-IDF |
| DATE | 2026 |
| REPO | khw1566/lab-qr-access |
왜 만들었나
실습실 열쇠는 늘 한 사람에게 있었고, 누가 언제 썼는지는 종이 대장에 의존했습니다. 신청과 승인은 메신저로, 출입은 열쇠로 따로 놀다 보니 기록이 남지 않고, 열쇠가 없으면 승인을 받아도 들어갈 수 없는 문제가 반복됐습니다. 그래서 신청 → 승인 → 출입 → 기록을 하나로 잇는 시스템을 직접 만들었습니다.
무엇을 만들었나
- 모바일 웹앱 (학생 + 관리자 탭): 학생은 실습실·시간·목적을 적어 신청하고, 관리자는 가입과 신청을 승인/반려합니다. 실습실마다 자동 승인 규칙(허용 시간대, 최대 이용 시간, 동시 정원)을 켜 두면 규칙에 맞는 신청은 바로 승인됩니다.
- 서버 (Cloudflare Workers + D1): API와 웹앱을 한 Worker에서 서빙합니다. 사용자, 예약, 단말, 출입 기록을 D1에 저장합니다.
- 출입문 단말 (ESP32-P4 보드): 7인치 터치 LCD와 MIPI 카메라가 달린 보드가 QR을 읽어 서버에 묻고, 허용되면 릴레이로 도어락을 몇 초간 엽니다.
어떻게 만들었나
1. 위조·공유가 안 되는 QR
QR 내용은 LA1.<예약ID>.<30초 스텝>.<서명> 형식이고, 서버 비밀키로 HMAC 서명합니다. 30초마다 바뀌고 약 90초가 지나면 무효가 됩니다. 같은 QR은 token_uses 테이블로 한 번만 통과시켜, 화면을 캡처해 친구에게 보내는 경우까지 막았습니다. 캡처 공유가 제일 현실적인 공격이라고 봤음
2. 판단은 전부 서버가 (fail-secure)
단말은 QR을 읽어 전달만 하고, 시간·승인 상태·실습실 일치 여부는 모두 서버가 판단합니다. 서버에 연결되지 않으면 문은 열리지 않습니다. 단말마다 개별 키를 발급하고 서버에는 SHA-256 해시만 저장하며, 단말은 자기가 등록된 실습실의 예약만 열 수 있습니다. 비밀번호는 PBKDF2-SHA256(10만 회), 세션은 HttpOnly 서명 쿠키를 썼습니다.
3. 단말 펌웨어 (ESP-IDF 5.5)
- 카메라:
esp_video(V4L2)로 프레임을 받아 quirc로 QR을 디코딩합니다. 보드 카메라 센서 모델이 공개되지 않아 4종 센서를 자동 감지하도록 했습니다. - Wi-Fi: P4에는 무선이 없어서 보드의 ESP32-C6를 SDIO로 연결해
esp_wifi_remote로 씁니다. - 같은 QR을 4초 안에 다시 보내지 않도록 쿨다운을 두고, 1분마다 서버에 상태 핑을 보냅니다.
- 도어락(12V)은 릴레이 접점으로 별도 전원에 연결해 보드 전원과 분리했습니다. 도어락 전원을 보드 5V에서 끌어오면 안 됨
결과
- 서버: 로컬 환경에서 가입 → 가입 승인 → 신청 → 승인 → QR 발급 → 단말 검증(허용) → 같은 QR 재사용 거부 → 위조 QR 거부 → 잘못된 단말 키 거부 → 자동 승인까지 전 과정을 확인했습니다.
- 펌웨어: ESP-IDF 5.5에서 esp32p4 타깃 빌드 성공 (우리 코드 경고 없음).
- 남은 일: 실제 보드에서 카메라 인식, Wi-Fi 접속, 릴레이 동작 확인. 이후 LCD에 환영/거부 사유 표시, 문 열림 센서 연동, 관리자 원격 개방을 붙일 계획입니다.
기계과지만 "문이 실제로 열린다"까지 하드웨어와 소프트웨어를 한 번에 설계해 본 프로젝트