QR코드는 어떻게 만들어질까? 원리부터 활용법까지
QR코드는 네모난 격자 안에 데이터를 담는 2차원 바코드입니다. 간단해 보이지만 내부에는 데이터 인코딩, 에러 정정(Reed–Solomon), 마스크 선택 등 정교한 알고리즘이 숨어 있습니다. 이 글에서는 QR코드의 구조와 생성 원리를 알기 쉽게 풀고, 실무에서 바로 활용할 수 있는 제작 팁과 보안 체크리스트까지 한 번에 정리합니다.
1) QR코드, 무엇이 특별할까?
QR코드(Quick Response Code)는 가로·세로 두 방향 모두에 정보를 담아 1차원 바코드보다 더 많은 용량을 저장하고, 손상되거나 일부 가려져도 에러 정정으로 복원이 가능한 것이 특징입니다. 제조 라인에서의 고속 스캔을 위해 개발되었지만, 지금은 결제, 홍보, 티켓, 재고 관리, 디지털 전환(O2O)까지 영역을 넓혔습니다.
“QR코드를 잘 만든다는 건, 스캔 성공률과 사용자 경험을 높이는 것. 기술적 정확성과 디자인의 균형이 핵심입니다.”
2) QR코드의 구조 해부
QR 매트릭스는 검정/흰색 모듈(module)로 구성됩니다. 여백(quiet zone)을 포함한 내부에는 아래 패턴이 배치됩니다.
- 파인더 패턴: 좌상단·우상단·좌하단의 큰 정사각 패턴. 방향과 위치를 빠르게 잡습니다.
- 타이밍 패턴: 정사각 사이의 점선 라인. 행·열 정렬 기준을 제공합니다.
- 얼라인먼트 패턴: 고버전에서 왜곡 보정용 작은 패턴이 여러 개 배치됩니다.
- 포맷 정보: 마스크 패턴과 에러 정정 레벨 정보를 담습니다.
- 버전 정보: 버전 7 이상에서 사용. 매트릭스 크기 식별용 비트가 포함됩니다.
- 데이터 영역: 실제 데이터와 Reed–Solomon 기반 에러 정정 코드워드가 섞여 배치됩니다.
버전과 크기
QR코드는 버전 1~40까지 있으며, 버전이 높을수록 모듈 수가 늘어납니다. 각 버전의 한 변 크기는 21 + (버전-1)×4 모듈입니다.
| 버전 | 모듈(가로×세로) | 숫자 전용(최대, L레벨) | 바이트(최대, L레벨) | 주요 용도 |
|---|---|---|---|---|
| 1 | 21×21 | 41자 | 17바이트 | 짧은 URL, 간단한 텍스트 |
| 5 | 37×37 | 106자 | 67바이트 | 쿠폰, Wi‑Fi 접속정보 |
| 10 | 57×57 | 274자 | 174바이트 | 명함 vCard, 이벤트 링크 |
| 20 | 97×97 | 721자 | 484바이트 | 설문 URL+파라미터 |
| 40 | 177×177 | 7089자 | 2953바이트 | 대용량 데이터(실무에선 비추천) |
3) QR코드는 이렇게 만들어진다: 인코딩 절차
-
데이터 분석 및 모드 결정
- 숫자 모드: 0–9만. 가장 압축 효율이 좋음.
- 알파뉴메릭 모드: 0–9, A–Z, 공백, $, %, *, +, -, ., /, : 포함.
- 바이트 모드: UTF-8 등 8비트 바이너리. 한국어 등 다국어 텍스트는 보통 이 모드.
- 한자 모드: Shift JIS 기반. 한국어에는 일반적으로 비사용.
-
버전 및 에러 정정 레벨 선택
에러 정정 레벨은 L(7%), M(15%), Q(25%), H(30%)로, 숫자는 복원 가능한 최대 손실 비율을 의미합니다. 로고를 올리거나, 인쇄 환경이 열악할수록 Q/H 권장.
-
비트스트림 작성
모드 인디케이터 → 글자수 비트 → 데이터 비트 → 종료 비트(0000) → 패딩(11101100, 00010001 반복) 순으로 코드워드를 채웁니다.
-
Reed–Solomon 에러 정정 코드 생성
Galois Field(GF(256)) 기반 다항식 연산으로 패리티(EC) 코드워드를 만들고, 인터리빙해 배치하여 국부 손상에도 견고하게 합니다.
-
마스킹 및 품질 평가
8가지 마스크 패턴 중 데이터 패턴을 덮어 씌워 연속된 동일색 모듈이나 오인식 패턴을 줄입니다. 벌점 규칙을 계산해 최저 스코어 마스크를 채택합니다.
-
최종 매트릭스 렌더링
포맷/버전 정보를 기록하고, 모듈을 픽셀 또는 벡터(SVG/PDF)로 출력합니다. Quiet Zone(최소 4모듈)을 반드시 확보합니다.
에러 정정 레벨 비교
| 레벨 | 복원율(대략) | 장점 | 주의점 |
|---|---|---|---|
| L | 약 7% | 가장 많은 데이터 저장 | 손상/저화질에 취약 |
| M | 약 15% | 일반적 마케팅 용도 무난 | 데이터 용량 감소 |
| Q | 약 25% | 인쇄물/로고 삽입 시 유리 | 더 큰 버전 필요 |
| H | 약 30% | 거친 표면/야외 환경 적합 | 가장 큰 사이즈 필요 |
4) 지금 바로 만들어보기: 코드 예제
파이썬
# pip install qrcode[pil]
import qrcode
data = "https://example.com/promo?utm_source=qr&utm_medium=print"
qr = qrcode.QRCode(
version=None, # 자동 선택
error_correction=qrcode.constants.ERROR_CORRECT_Q, # Q 레벨
box_size=10, # 픽셀 크기
border=4 # Quiet Zone (모듈)
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("promo_qr.png")
자바스크립트(SVG 출력)
// npm i qrcode
const QRCode = require('qrcode');
const url = 'https://my.site/wifi?ssid=Office&enc=WPA&pass=hello123';
QRCode.toString(url, { type: 'svg', errorCorrectionLevel: 'H', margin: 4 }, (err, svg) => {
if (err) throw err;
require('fs').writeFileSync('wifi.svg', svg);
});
커맨드라인
# macOS: brew install qrencode
qrencode -l Q -s 6 -m 4 -o out.png "https://example.com/survey?c=2024_fall"
5) 정적 vs 동적 QR코드
- 정적 QR: 데이터가 코드 안에 고정. URL이 바뀌면 재인쇄 필요. 보관/내부 시스템용, 비용 無.
- 동적 QR: 코드에는 단축/리다이렉트 링크만 담고, 서버에서 최종 목적지를 변경. 캠페인 전환·A/B 테스트·만료 설정·클릭 통계에 최적.
마케팅이나 오프라인 인쇄물에는 동적 QR을 추천합니다. 단, 리다이렉트 서버 안정성과 SSL(HTTPS)은 필수입니다.
6) 인쇄·디자인 최적화 가이드
- 크기: 일반 시야거리 50cm 기준, 최소 2cm(약 0.8인치) 이상. 야외 포스터는 3~5cm 이상 권장.
- 대비: 어두운 전경(검정) vs 밝은 배경(흰색). 반전 금지, 그라데이션/글로시 코팅 주의.
- Quiet Zone: 최소 4 모듈. 배경 패턴/테두리와 겹치지 않게.
- 로고 삽입: Q/H 레벨 + 충분한 크기. 중앙 로고 투명 여백 확보.
- 해상도: 래스터는 300dpi+, 가능하면 SVG/PDF 벡터 사용.
- 테스트: iOS·Android 기본 카메라, 저가형 단말, 어두운 조도에서 각각 테스트.
7) 보안·프라이버시 체크리스트
- HTTPS 강제: HSTS, 유효한 인증서, 도메인 스푸핑 방지.
- 리다이렉트 검증: 동적 QR의 목적지 화이트리스트, UTM 파라미터 검증.
- 민감정보 금지: QR에 직접 개인식별정보/토큰/세션ID를 넣지 말 것.
- 만료·권한: 이벤트 종료 시 자동 만료, 역할 기반 접근(RBAC) 적용.
- 로그 최소화: 동적 QR 통계 수집 시 IP, 위치 등은 최소화하고 보관기한 명시.
- 사용자 안내: 인쇄물에 “공식 도메인”과 “짧은 설명”을 병기해 신뢰도 제고.
8) 실전 활용 아이디어
- 결제/주문: 테이블 오더, 무인 키오스크 대체.
- 오프라인→온라인: 포스터·전단에서 랜딩 페이지 유도.
- 티켓/입장: 일회성 토큰+서버 검증으로 실시간 유효성 체크.
- 재고/자산 관리: 내부 식별자 연결, 상태 페이지 표시.
- 교육/전시: 작품·설비 설명, 다국어 안내.
- Wi‑Fi 공유: SSID/암호를 표준 포맷으로 인코딩.
- vCard/MeCard: 명함에 디지털 연락처 첨부.
- IoT 페어링: 디바이스 설정 URL/키 전달.
9) 빠른 문제 해결 Q&A
- Q1. 스캔이 잘 안 됩니다. 가장 먼저 볼 것은?
- Quiet Zone 부족, 대비 약함, 크기 과소, 해상도 저하가 80% 원인입니다. 마스크/에러 정정 레벨 재생성도 고려하세요.
- Q2. 로고를 넣으면 어디까지 가려도 되나요?
- 이론상 H 레벨은 약 30%까지 복원 가능하지만, 데이터 영역 손상 분포와 마스크에 따라 달라집니다. 경험상 전체 면적의 10~15% 이내, 중앙 배치+투명 여백을 권장합니다.
- Q3. 긴 URL을 직접 넣어도 될까요?
- 가능하나 모듈이 촘촘해져 스캔률이 떨어집니다. 단축 URL 또는 동적 QR로 전환해 안정성과 통계를 동시에 확보하세요.
- Q4. 한국어 텍스트는 어떤 모드로 인코딩되나요?
- 일반적으로 바이트(UTF‑8) 모드로 저장됩니다. 일부 라이브러리가 ECI를 자동 지정합니다.
- Q5. 인쇄 시 최소 크기 기준은?
- 실무 권장: 버전 1~7은 2cm 이상, 8~15는 2.5~3cm, 16 이상은 3cm+. 관건은 모듈당 실제 밀도와 스캐너 해상도입니다.
- Q6. 색상을 바꿔도 되나요?
- 가능합니다. 단, 전경이 배경보다 충분히 어두워야 하며 투명/메탈릭/파스텔 조합은 피하세요.
- Q7. PDF나 벡터로 생성해야 하는 이유는?
- 크게 인쇄하거나 리사이즈해도 경계가 무너지지 않기 때문입니다. 브랜드 가이드에 맞춘 일관된 출력 품질도 유지됩니다.
- Q8. 보안 QR(서명된 데이터)을 만들 수 있나요?
- 가능합니다. 데이터(payload)에 전자서명 또는 HMAC을 포함하고, 서버에서 검증하세요. 단, 길이가 길어지므로 동적 QR+서버 검증 조합을 추천합니다.
10) 한눈에 보는 제작 체크리스트
- 데이터 최소화 → URL은 단축/리다이렉트 사용
- 레벨: 일반 M, 로고/열악 환경 Q/H
- Quiet Zone 4+ 모듈, 대비 확실
- SVG/PDF 벡터 우선, 래스터는 300dpi+
- iOS/Android/저조도/오래된 기기에서 실기 테스트
- 동적 QR은 HTTPS, 만료, 통계, 화이트리스트 필수
댓글 쓰기