QR 코드 디코딩: 이미지에서 데이터를 읽어내는 원리와 안전 수칙
QR 코드는 흑백 사각형 패턴에 데이터를 담은 이차원 바코드입니다. 이 도구는 업로드한 이미지에서 그 패턴을 찾아 원래 데이터를 복원해 보여 줍니다. 스마트폰 카메라로 스캔하면 바로 링크를 열어 버리는 것과 달리, 여기서는 어디로 연결되는지 먼저 확인할 수 있습니다. 출처가 불분명한 QR 코드를 대할 때 이 차이가 중요합니다.
QR 코드가 데이터를 담는 방식
QR 코드에는 데이터 외에도 읽기를 돕는 구조가 함께 인쇄됩니다. 세 모서리의 큰 정사각형은 파인더 패턴으로, 디코더가 코드의 위치와 회전 각도를 파악하는 기준입니다. 그래서 QR 코드는 뒤집혀 있거나 비스듬히 찍혀도 읽힙니다. 그 사이의 점선은 타이밍 패턴으로 격자 간격을 맞추는 데 쓰이고, 큰 코드에는 정렬 패턴이 추가되어 곡면에 붙어 휘어진 경우를 보정합니다.
데이터 영역에는 Reed-Solomon 오류 정정 코드가 함께 들어갑니다. 이 때문에 코드의 일부가 가려지거나 더러워져도 복원이 됩니다. 정정 수준은 네 단계이며, 높은 수준을 고르면 손상에 강해지지만 같은 데이터를 담기 위해 코드가 더 커집니다.
| 오류 정정 수준 | 복원 가능 손상률 | 용도 |
|---|---|---|
| L (Low) | 약 7% | 깨끗한 화면 표시용 |
| M (Medium) | 약 15% | 일반적인 인쇄물 (기본값) |
| Q (Quartile) | 약 25% | 손상 가능성이 있는 환경 |
| H (High) | 약 30% | 로고를 겹쳐 넣는 디자인, 야외 부착물 |
사용 방법
- QR 코드가 포함된 이미지 파일을 업로드합니다. 스크린샷이나 사진 모두 가능합니다.
- 디코딩된 내용이 텍스트로 표시됩니다.
- URL이 나왔다면 도메인을 먼저 확인합니다. 단축 URL이라면 최종 목적지를 별도로 확인하세요.
- 인식되지 않으면 아래의 실패 원인 항목을 참고해 이미지를 다시 준비합니다.
디코딩이 실패하는 흔한 원인
- 해상도 부족: 코드 한 칸(모듈)이 이미지에서 최소 2~3픽셀은 되어야 합니다. 작게 캡처된 QR은 확대해도 정보가 없으므로 원본을 다시 받아야 합니다.
- 여백(quiet zone) 없음: QR 코드 규격은 주변에 모듈 4칸 폭의 빈 여백을 요구합니다. 코드에 딱 붙여 잘라낸 이미지는 인식되지 않습니다.
- 명암 대비 부족: 밝은 배경에 밝은 색 코드처럼 대비가 약하면 흑백 구분이 되지 않습니다.
- 반전된 색상: 어두운 배경에 밝은 코드는 일부 디코더가 처리하지 못합니다.
- 심한 왜곡이나 흐림: 비스듬히 찍혀 원근 왜곡이 크거나 초점이 맞지 않은 사진.
- 화면 촬영 시의 모아레: 모니터를 찍으면 픽셀 격자가 간섭 무늬를 만들어 인식을 방해합니다. 스크린샷을 쓰는 편이 확실합니다.
- 여러 개의 코드: 이미지에 QR 코드가 여러 개 있으면 하나만 읽거나 실패할 수 있습니다. 잘라서 하나씩 넣어 보세요.
QR 코드에 담기는 데이터 형식
QR 코드 자체는 그냥 텍스트를 담습니다. 스캔했을 때 앱이 특정 동작을 하는 것은 텍스트가 약속된 형식을 따르기 때문입니다.
| 형식 | 예 | 스캔 시 동작 |
|---|---|---|
| URL | https://example.com | 브라우저로 열기 |
| 일반 텍스트 | 안녕하세요 | 텍스트 표시 |
| Wi-Fi | WIFI:T:WPA;S:이름;P:비번;; | 네트워크 접속 제안 |
| 연락처(vCard) | BEGIN:VCARD... | 주소록에 추가 |
| 전화 | tel:+821012345678 | 전화 앱 실행 |
| 문자 | smsto:number:message | 문자 앱에 내용 입력 |
| 이메일 | mailto:a@b.com?subject=... | 메일 작성 화면 |
| 일정 | BEGIN:VEVENT... | 캘린더에 추가 |
| 결제·송금 | 서비스별 자체 규격 | 해당 앱 실행 |
QR 코드가 보안 문제가 되는 이유
QR 코드의 근본적인 문제는 사람이 목적지를 읽을 수 없다는 것입니다. 링크는 마우스를 올려 도메인을 확인할 수 있지만, QR 코드는 스캔하기 전까지 무엇인지 알 수 없습니다. 이 성질을 이용한 피싱을 큐싱(quishing)이라 부르며, 이메일 필터가 이미지 안의 URL을 검사하지 못한다는 점 때문에 실제로 널리 쓰입니다.
물리적 공격도 단순합니다. 공공장소의 정당한 QR 코드 위에 스티커를 덧붙이면 됩니다. 주차 요금 정산기나 식당 메뉴판, 공용 자전거 대여소의 QR 코드가 이런 방식으로 바꿔치기된 사례가 여러 나라에서 보고되었습니다.
그래서 실무적인 수칙은 이렇습니다. 스캔 후 열리는 URL의 도메인을 반드시 확인하고, 로그인이나 결제 정보를 요구하는 페이지라면 QR 링크를 통해서가 아니라 직접 앱이나 주소를 입력해 접속하세요. 출처가 의심되는 코드는 이 도구처럼 먼저 내용을 확인하는 수단을 쓰는 것이 안전합니다. 특히 Wi-Fi QR 코드는 스캔만으로 악의적인 네트워크에 접속할 수 있어 주의가 필요합니다.
이런 작업에 씁니다
- 받은 QR 코드가 어디로 연결되는지 스캔 전에 확인
- 인쇄물에 넣은 QR 코드가 의도한 URL을 담고 있는지 배포 전 검증
- Wi-Fi 공유 QR 코드에 담긴 네트워크 이름과 비밀번호 확인
- 오래된 자료의 QR 코드가 아직 유효한 주소를 가리키는지 점검
- 디자인 과정에서 로고를 겹친 QR 코드가 여전히 읽히는지 테스트
자주 묻는 질문
- 업로드한 이미지가 서버로 전송되나요?
- 전송되지 않습니다. 이미지를 canvas에 그려 픽셀 데이터를 얻은 뒤 jsQR 라이브러리로 브라우저에서 디코딩합니다. 파일이 외부로 나가지 않으므로 개인적인 QR 코드도 확인할 수 있습니다.
- QR 코드에 담을 수 있는 데이터 양은 얼마인가요?
- 최대 버전(40)에서 숫자만 담으면 약 7,089자, 영숫자는 약 4,296자, 한글 등 8비트 바이트 데이터는 약 2,953바이트입니다. 다만 데이터가 많아지면 코드의 모듈 수가 늘어 촘촘해지므로, 인쇄 크기가 작으면 읽히지 않습니다. 실무에서는 긴 내용을 직접 담기보다 짧은 URL을 담고 실제 내용은 웹에 두는 방식을 씁니다.
- 코드 중앙에 로고를 넣어도 읽히나요?
- 오류 정정 덕분에 가능합니다. 다만 가려지는 면적이 정정 한계를 넘으면 읽히지 않으므로, 로고를 넣을 계획이라면 오류 정정 수준을 H로 올리고 로고 크기를 코드 면적의 20% 이내로 제한하는 것이 안전합니다. 그리고 반드시 실제 기기 여러 대로 테스트하세요. 파인더 패턴과 타이밍 패턴은 절대 가리면 안 됩니다.
- 동적 QR 코드는 무엇인가요?
- 코드 안에 최종 목적지가 아니라 중간 단축 URL을 담아, 나중에 그 URL의 연결 대상을 바꿀 수 있게 한 방식입니다. 인쇄물을 다시 만들지 않고 목적지를 변경할 수 있고 스캔 통계도 수집할 수 있습니다. 반면 서비스가 종료되면 모든 코드가 무효가 되고, 사용자가 목적지를 미리 확인하기 어려워집니다.
- 손상된 QR 코드를 복원할 수 있나요?
- 오류 정정 범위 안이라면 디코더가 자동으로 복원합니다. 그 범위를 넘으면 복원이 불가능합니다. 다만 일부만 지워진 경우 이미지 편집으로 흰 여백을 정리하거나 대비를 높이면 읽히는 경우가 있어 시도해 볼 가치는 있습니다.
- 바코드도 읽을 수 있나요?
- 이 도구는 QR 코드 전용입니다. EAN·UPC 같은 일차원 바코드나 Data Matrix, PDF417 같은 다른 이차원 코드는 형식이 달라 인식되지 않습니다. 그런 코드에는 각 형식을 지원하는 디코더가 필요합니다.
💡 참고: 출처가 불분명한 QR 코드는 카메라로 바로 스캔하지 말고 사진을 찍어 이 도구로 내용을 먼저 확인하세요. 목적지를 눈으로 보고 나서 여는 것과 열고 나서 아는 것은 전혀 다릅니다.