공개 테스트 코퍼스
스캐너 호환성에 관한 저희의 주장은 그 근거가 되는 증거만큼만 신뢰할 수 있습니다. 이 페이지가 코퍼스입니다. 저희 인코더 계열들에 대해 회귀 테스트를 실행하는 입력과, 저희 말을 그냥 믿지 않고도 직접 확인할 수 있는 스마트폰 카메라 동작을 담고 있습니다.
corpus.zip 다운로드 fixtures JSON + CSV + 방법론 + README 번들. 약 4 KB.
버전 로드 중…
코퍼스 사용 방법
모든 테스트 벡터는 /test-vectors/fixtures.json에 있습니다. 타입별로 하나의 JSON 객체가 있으며, 입력 필드와 기대되는 디코딩 서브문자열이 포함됩니다. 이 사이트에서 실시간으로 가져오므로 오래된 복사본이 없습니다.
임의의 fixture의 fields 맵을 가져와 해당 타입의 생성기에 값을 입력하고 생성을 누릅니다. 생성된 QR 코드는 저희 CI가 라운드트립 테스트에 사용하는 것과 비트 단위로 동일합니다.
iPhone Camera, Android Camera, Google Lens, 산업용 스캐너(Zebra, Honeywell, Datalogic), 또는 앱 전용 리더(은행 앱, 인증 앱)를 생성된 QR 코드에 겨냥합니다. 디코딩된 텍스트에 해당 fixture의 모든 expect 서브문자열이 포함되어 있는지 확인하세요.
플리트의 스캐너가 fixture와 일치하지 않는 디코딩 결과를 반환하면 이슈를 등록하세요. 재현하고, 해당 스캐너를 공개 호환성 매트릭스에 추가하고, (인코더 버그라면) 수정 사항을 배포합니다.
예상 스캔 결과
호환성 매트릭스 및 각 타입 페이지의 "스캔 가능" 줄과 동일한 데이터셋에서 렌더링되므로 셋이 서로 어긋날 수 없습니다. /test-vectors/의 전체 fixture 파일에는 저희가 회귀 테스트하는 인코더 계열마다 하나씩, 33개의 항목이 있습니다. 제품 타입마다 한 행이 아니며, 그렇다고 주장하지도 않습니다.
| 유형 | Fixture 입력 | iPhone Camera | Android Camera | 프로 스캐너 |
|---|---|---|---|---|
| URL | https://example.com/test | 링크 열기A1 | 링크 열기A5 | 디코딩A8 |
| WiFi | WIFI:S:MyNet;T:WPA;P:...;; | 네트워크 연결A1 | 네트워크 연결A5 | 페이로드 디코딩A8 |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+, 보고됨U | 디코딩됨; 연결 여부는 제조사에 따라 다름U | 페이로드 디코딩Q |
| vCard | FN=Alice ORG=Acme ... | 연락처에 추가A1 | 연락처에 추가A5 | 페이로드 디코딩A8 |
| TOTP | otpauth://totp/...?secret=JBSW... | 인증 앱이 읽음A9, A10 | 인증 앱이 읽음A9, A10 | URI 디코딩A8 |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ 프로비저닝A4 | Android 13+ 프로비저닝U | URI 디코딩Q |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | 지갑 앱 열림Q | 지갑 앱 열림Q | URI 디코딩Q |
| SEPA (EPC) | BCD header + name + IBAN + amount | 원시 문자열만Q | 원시 문자열만Q | 원시 문자열 디코딩Q |
| Swiss QR-bill | SPC header + IBAN + address + amount | 원시 문자열만Q | 원시 문자열만Q | 원시 문자열 디코딩Q |
| Micro QR | Compact payload | 디코딩 불가V, U | 디코딩 불가G | 산업용 리더Z |
| rMQR | Rectangular payload | 디코딩 불가U | 디코딩 불가G | 최신 Zebra, Scandit, Cognex 펌웨어Z |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | URL 열기Q | URL 열기Q | POS 펌웨어가 AI를 파싱함Q |
| Aztec | Arbitrary payload | 디코딩 불가A2 | Google Lens, 일부 변형A7 | 네이티브A8 |
| Data Matrix | Arbitrary payload | 디코딩 불가A2 | Google LensA6 | 네이티브A8 |
| PDF417 | AAMVA or arbitrary | 디코딩 불가A2 | Google Lens, 고르지 않음A7 | 네이티브A8 |
| AAMVA driver license | @\n\x1e\rANSI 636014100002DL... | iOS 17+ 면허증 인식 흐름A3 | 면허증 인식 앱 전용U | 네이티브A8 |
| EAN-13 / UPC-A | 0012345678905 | 디코딩 불가Ap | Google LensG | 모든 소매 POSA8 |
| Code 128 | ABC-123 | 디코딩 불가Ap | Google LensG | 네이티브A8 |
표시 읽는 법
- ✓: 추가 앱 없이 기본 카메라 앱에서 읽습니다
- ~: 셀에 명시된 조건(특정 앱, OS 버전, 모드)에서 읽습니다
- ✗: 디코딩하지 못합니다. 스캐너 앱이나 하드웨어가 필요합니다
근거
- A: our own device test; the number is the row in the attestation log
- Ap: Apple's support page describes the Camera app and Code Scanner as reading QR codes and lists no other symbology
- G: Google Lens decodes the ML Kit barcode formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, Aztec, Data Matrix, PDF417 and QR Code; Micro QR and rMQR are not on the list
- Z: Zebra lists Micro QR and rectangular Micro QR among the DS8100 series' 2D symbologies
- V: Apple's Vision framework decodes Micro QR for third-party apps since iOS 15; that is a developer API, not the Camera app
- Q: a standard QR symbol, so decoding is the attested QR result; the question is what the phone does with the payload
- U: not in our attestation log yet; from vendor documentation or field reports, treat as provisional
"예상 스캔 결과"의 의미
- 디코딩, 스마트폰 네이티브 카메라 리더가 별도 앱 없이 페이로드를 반환합니다.
- 부분 지원, 디코딩이 특정 앱(인증 앱, 지갑, 은행)이나 특정 OS 버전에 따라 달라집니다.
- 디코딩 불가, 네이티브 카메라가 아무것도 반환하지 않습니다. 전문 스캐너나 리더가 필요합니다.
- 작은 글자는 각 결과 뒤에서 근거를 나타냅니다: A와 숫자 조합은 아래 인증 로그의 한 행을 가리키며, 그 외 글자는 각 표 아래에 나열된 벤더 문서를 가리킵니다. U는 저희가 아직 그 셀을 자체 기기로 테스트하지 않았다는 뜻입니다.
방법론 참고 사항
- 모든 fixture는 라운드트립을 통과합니다. CI는 헤드리스 Chromium에서 각 코드를 생성하고 브라우저의
BarcodeDetectorAPI를 통해 다시 디코딩하여 서브문자열 일치를 확인합니다. CI 그린은 코퍼스가 내부적으로 일관됨을 의미합니다. - 이 표의 스캐너 결과는 실제 기기에서의 수동 테스트 결과입니다. 합성이 아닙니다. iOS 18.3의 iPhone 15 Pro, Android 14의 Pixel 8, 펌웨어 CAAACS00-002-R06의 Zebra DS8100 이미저.
- 부정적인 결과도 공개합니다. iPhone Camera가 특정 심볼로지(Data Matrix, Aztec, PDF417)의 디코딩을 거부하면 표에 "디코딩 불가"로 표시합니다. "네이티브 리더"로 이름을 바꾸지 않습니다.
- 코퍼스는 버전 관리됩니다. 타입을 추가하거나 인코더 버그를 수정할 때 해당 fixture 항목이 같은 커밋에 포함됩니다. 변경 로그가 각 fixture 변경 사항을 기록하며, corpus.VERSION.txt는 현재 ZIP이 빌드된 fixture 파일의 해시를 담고 있습니다.
스캐너 플리트 인증 로그
모든 수동 기기 테스트를 날짜별로 기록합니다. 새 하드웨어를 확보하거나 사용자가 불일치를 보고할 때 행이 추가됩니다. 결과는 조용히 바뀌지 않으며, 항상 새 행으로 추가됩니다.
| # | Device | OS / app | Corpus slice | Result | Date | Notes |
|---|---|---|---|---|---|---|
| A1 | iPhone 15 Pro | iOS 18.3, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A2 | iPhone 15 Pro | iOS 18.3, native Camera | Aztec, PDF417, Data Matrix | fail | 2026-04-10 | 네이티브로 디코딩하는 것 없음(예상된 결과, /standards/non-qr-2d/ 참고) |
| A3 | iPhone 15 Pro | iOS 18.3, native Camera | AAMVA PDF417 | partial | 2026-04-10 | iOS 17+ 면허증 인식 흐름이 Wallet에 추가를 제안함; 원시 PDF417은 반환되지 않음 |
| A4 | iPhone 15 Pro | iOS 18.3, Wallet | eSIM LPA | pass | 2026-04-12 | Add-eSIM 흐름이 정상적으로 시작됨 |
| A5 | Pixel 8 | Android 14, native Camera | All QR fixtures | pass | 2026-04-10 | |
| A6 | Pixel 8 | Android 14, Google Lens | Data Matrix | pass | 2026-04-10 | |
| A7 | Pixel 8 | Android 14, Google Lens | Aztec, PDF417 | partial | 2026-04-10 | 일부 변형은 디코딩됨; 지원이 고르지 않음 |
| A8 | Zebra DS8100 | firmware CAAACS00-002-R06 | All 2D + 1D fixtures | pass | 2026-04-11 | 산업용 이미저, 기준 참조 |
| A9 | Google Authenticator | v7.0+ (iOS/Android) | TOTP, HOTP | pass | 2026-04-12 | SHA-1 전용, 6자리(Google의 사실상 표준 프로필에 따라 algorithm/digits 파라미터 무시) |
| A10 | 1Password | v8 (iOS/Android/macOS) | TOTP, HOTP | pass | 2026-04-12 | SHA-256, SHA-512, 8자리를 포함한 전체 RFC 지원 |
앞으로의 계획
- 사전 렌더링된 아티팩트. 현재 ZIP에는 fixtures + 방법론 + CSV가 포함됩니다. 향후 개정판에는 각 fixture의 사전 렌더링된 SVG + PNG가 추가될 예정으로, 스캐너 플리트 하네스에 직접 넣을 수 있게 됩니다. 빌드 타임 헤드리스 브라우저 단계 대기 중입니다.
- 스캐너 플리트 인증. 날짜별 기기 로그가 이 페이지에 공개되어 있으며, 새 기기를 검증할 때마다 추가됩니다.
- 제3자 검증. 독립 보안 연구소가 코퍼스를 스캐너 플리트로 실행하고 서명된 인증서를 공개합니다. 대기 중, 의뢰 완료. 보고서는 도착하는 즉시 여기에 공개됩니다.
관련 항목
- /test-vectors/, 전체 fixture JSON 및 검색 가능한 테이블.
- /compatibility/, 실시간 스캐너 호환성 매트릭스.
- /standards/, 표준별 참조 페이지.
- /print-size/, 코퍼스에 딸린 물리적 인쇄 지침.