정보처리기사로 알아보는 QR코드 원리, 일부가 가려져도 인식되는 이유
일부가 가려진 QR코드를 읽을 수 있는 핵심 이유
남아 있는 데이터와 오류정정 정보를 함께 사용한다
QR코드는 검은 칸과 흰 칸을 단순히 그림처럼 늘어놓은 것이 아니다. 위치를 찾기 위한 패턴, 데이터를 표현하는 영역, 읽기 방식을 알려 주는 정보, 손상된 내용을 복원하는 데 쓰는 오류정정 정보가 정해진 규칙에 따라 배열된다. 스캐너는 먼저 코드의 위치와 방향을 파악하고 각 칸을 판독한 뒤, 읽은 값의 오류를 검사한다. 일부 칸이 얼룩이나 가림 때문에 사라져도 나머지 데이터와 오류정정용 중복 정보가 충분하고 핵심 구조가 보존돼 있다면 원래 메시지를 복원할 가능성이 생긴다. 이것이 일부가 가려져도 인식되는 가장 직접적인 이유다.
다만 ‘일부’라는 말만으로 성공 여부를 판단할 수는 없다. 같은 넓이가 가려져도 한곳에 몰려 있는지 여러 곳에 흩어져 있는지, 위치 탐지 패턴이나 형식 정보처럼 판독에 중요한 부분을 덮었는지, 카메라 초점과 조명이 안정적인지에 따라 결과가 달라진다. 인쇄된 코드가 구겨진 경우와 휴대전화 화면이 빛을 반사하는 경우도 판독 실패 원인이 서로 다르다. 오류정정은 손상을 무시하는 마법이 아니라, 읽을 수 있는 정보가 일정 조건을 충족할 때 계산으로 누락과 오류를 복구하려는 절차다.
정보처리기사 관점에서는 QR코드를 ‘입력 장치가 이미지를 받아 구조를 찾고, 기호를 데이터로 변환한 다음, 오류를 검출·정정해 문자열을 출력하는 정보 처리 과정’으로 보면 이해하기 쉽다. 카메라가 모양을 찾는 단계, 모듈을 흑백 값으로 바꾸는 단계, 코드워드를 조립하는 단계, 오류정정 연산을 수행하는 단계가 차례로 이어진다. 앞 단계에서 위치를 잘못 잡으면 뒤 단계의 데이터가 아무리 많이 남아 있어도 읽기 어렵다. 반대로 구조가 선명하고 손상이 복구 범위 안에 있으면 눈으로는 조금 망가져 보여도 판독될 수 있다.

QR코드는 작은 칸을 데이터 단위로 사용한다
모듈과 코드워드가 메시지를 담는 방식
QR코드를 확대하면 정사각형의 작은 칸이 모여 있는 것을 볼 수 있다. 이 한 칸을 모듈이라고 하며, 각 모듈의 밝고 어두운 상태가 정보를 구성한다. 그러나 모듈 하나가 곧바로 한 글자나 숫자 하나를 뜻하는 것은 아니다. 입력한 문자와 숫자는 선택된 인코딩 방식에 따라 비트열로 바뀌고, 길이 정보와 종료 정보, 채움 비트 등이 더해진다. 이어 여러 비트를 묶은 코드워드가 만들어지고, 이 코드워드와 오류정정 코드워드가 정해진 순서로 모듈에 배치된다. 따라서 화면에서 보이는 네모무늬는 데이터와 제어 정보가 결합된 최종 표현이다.
QR코드의 크기는 버전에 따라 달라진다. 버전이 커지면 한 변의 모듈 수가 늘어나 더 많은 정보를 담을 여지가 생기지만, 실제 저장 가능한 양은 문자 종류와 오류정정 수준에도 영향을 받는다. 숫자만 저장할 때와 한글·영문·기호가 섞인 문장을 저장할 때 필요한 비트 수가 같지 않기 때문이다. 또 오류정정 정보를 많이 넣을수록 손상에 대응할 여지는 커지지만 같은 크기에서 순수 데이터에 쓸 공간은 줄어든다. ‘네모가 크면 무조건 많이 저장된다’거나 ‘패턴이 촘촘하면 무조건 잘 읽힌다’고 단순화할 수 없는 이유다.
모듈 배치는 그대로 노출되지 않고 마스크라는 규칙을 적용해 읽기 어려운 무늬가 생기는 것을 줄인다. 검은 칸이나 흰 칸이 지나치게 길게 이어지거나 위치 탐지 패턴과 비슷한 모양이 우연히 생기면 카메라가 경계를 찾기 어려울 수 있기 때문이다. 인코더는 여러 마스크 후보를 평가하고 적절한 패턴을 선택하며, 어떤 마스크와 오류정정 수준을 사용했는지는 형식 정보에 담는다. 디코더는 형식 정보를 읽어 같은 규칙을 되돌린 뒤 데이터 코드워드를 복원한다. 이 과정 때문에 QR코드는 단순한 흑백 그림이 아니라 규칙이 명확한 이차원 기호 체계다.
세 모서리의 위치 탐지 패턴이 방향을 잡는다
찾기·정렬·경계 구분을 먼저 끝내야 하는 이유
QR코드의 세 모서리에는 큰 네모 안에 작은 네모가 겹친 듯한 위치 탐지 패턴이 있다. 세 점의 상대적 배치를 찾으면 스캐너는 코드가 어디에 놓였는지, 어느 방향으로 회전했는지, 대략 얼마나 큰지 계산할 수 있다. 네 모서리 모두가 아니라 세 모서리에 패턴을 두는 이유는 방향을 구분하기에 충분한 비대칭 구조를 만들기 위해서다. 스캐너는 이 패턴을 기준으로 촬영된 사각형의 기울기와 원근 왜곡을 보정하고, 각 모듈을 어느 지점에서 샘플링할지 격자를 맞춘다. 위치 탐지에 실패하면 데이터 영역 자체를 올바른 좌표로 나눌 수 없다.
위치 탐지 패턴만 있는 것은 아니다. 가로와 세로로 번갈아 나타나는 타이밍 패턴은 모듈 간격을 맞추는 기준이 되고, 큰 버전에서는 정렬 패턴이 휘거나 비스듬하게 촬영된 격자를 보정하는 데 도움을 준다. 코드 바깥의 밝은 여백인 콰이어트 존도 주변 글자나 그림과 QR코드의 경계를 구분하는 데 중요하다. 스티커를 테두리까지 잘라 붙이거나 코드 바로 옆에 검은 글자를 인쇄하면 데이터 영역이 손상되지 않았더라도 시작 경계를 잘못 찾을 수 있다. 판독 가능성을 높이려면 코드 내부뿐 아니라 주변 여백도 함께 보존해야 한다.
가림 위치가 중요한 이유도 여기에 있다. 가상의 QR에서 중앙의 데이터 모듈 몇 개가 가려졌다면 위치와 격자를 먼저 찾은 뒤 오류정정을 시도할 수 있다. 반면 같은 면적의 가림이 위치 탐지 패턴 전체나 여러 기준 패턴을 동시에 덮으면 스캐너가 QR코드인지조차 확신하지 못할 수 있다. 형식 정보가 심하게 손상돼 오류정정 수준과 마스크 규칙을 알아내지 못하는 경우도 복원이 어려워진다. 그래서 손상률 하나만 묻기보다 ‘어떤 기능 영역이 얼마나, 어떤 형태로 손상됐는가’를 살피는 편이 기술적으로 정확하다.
오류정정은 중복된 코드워드로 복원을 시도한다
리드-솔로몬 방식과 L·M·Q·H 수준의 의미
QR코드는 데이터 코드워드에 리드-솔로몬 방식으로 계산한 오류정정 코드워드를 더한다. 이 값은 원문을 그대로 한 번 더 저장한 사본이 아니라, 여러 데이터 값을 수학적으로 조합한 중복 정보다. 판독 과정에서 일부 코드워드가 잘못 읽히거나 읽히지 않았을 때 디코더는 남아 있는 값과 오류정정 값을 비교해 모순이 생긴 위치를 찾고 원래 값을 계산한다. 여러 조각에 공통된 단서를 분산해 두었다가 빠진 조각을 추론하는 것과 비슷하지만, 실제로는 유한체 연산과 다항식 계산을 사용하는 엄격한 부호 이론이다.
QR코드에는 L, M, Q, H로 구분되는 오류정정 수준이 있다. 높은 수준을 선택하면 오류정정에 배정되는 코드워드가 늘어 손상에 대응할 여지가 커질 수 있지만, 같은 버전에서 사용자 데이터를 담을 수 있는 공간은 줄어든다. 반대로 낮은 수준은 데이터 용량을 더 확보할 수 있으나 손상에 대한 여유는 상대적으로 작다. 어떤 수준을 쓸지는 코드가 놓일 환경, 인쇄 품질, 저장할 데이터 길이와 필요한 판독 안정성을 함께 고려해 결정한다. 수준 이름 하나만으로 실제 현장의 인식 성공률을 보증할 수는 없다.
오류정정 능력은 보통 코드워드 단위의 복구 능력으로 설명해야 한다. 사진에서 검게 보이는 면적 비율과 코드워드 손실량은 일대일로 대응하지 않기 때문이다. 작은 얼룩이 모듈 경계를 따라 넓게 번지면 여러 코드워드에 영향을 줄 수 있고, 비교적 큰 가림이라도 특정 블록에 한정되면 결과가 달라질 수 있다. 여기에 위치 탐지 실패, 초점 흐림, 반사광처럼 데이터 값 자체를 안정적으로 샘플링하지 못하게 하는 문제가 겹치면 이론적인 오류정정 여유를 다 쓰기도 전에 실패한다. 따라서 특정 훼손 비율이면 무조건 스캔된다는 문장은 피해야 한다.
오류정정 수준은 복원 여유를 뜻할 뿐, 어떤 가림과 촬영 조건에서도 성공한다는 보증이 아니다.
가상의 손상 사례는 면적보다 위치와 분포가 중요하다
중앙 가림·모서리 가림·분산 얼룩을 비교해 보기
가상 사례 A는 세 위치 탐지 패턴과 바깥 여백은 선명하고, 중앙 데이터 영역의 작은 사각형만 불투명 스티커로 가려진 경우다. 스캐너가 코드의 위치와 모듈 격자를 정상적으로 잡고 가려진 부분이 오류정정 범위 안에 머문다면 복원을 시도할 수 있다. 그러나 가려진 사각형의 실제 크기, 코드 버전, 오류정정 수준, 데이터 배치와 인쇄 상태를 모르는 채 성공한다고 단정할 수는 없다. 같은 중앙 가림이라도 코드 자체가 작거나 모듈이 번져 있으면 카메라가 주변 칸까지 잘못 읽어 손실이 예상보다 커질 수 있다.
가상 사례 B는 면적은 A와 비슷하지만 왼쪽 위 위치 탐지 패턴을 가린 경우다. 이때는 데이터 복원 이전에 코드의 위치와 방향을 찾는 과정부터 불안정해질 수 있다. 다른 두 패턴과 주변 특징을 활용하는 구현도 있을 수 있지만 모든 판독기가 같은 방식으로 보완한다고 가정할 수 없다. 가상 사례 C는 작은 점 얼룩이 코드 전체에 흩어진 경우다. 한곳의 큰 손상보다 눈에는 덜 심해 보여도 여러 코드워드와 기능 영역을 동시에 건드리면 복원 부담이 넓게 퍼질 수 있다. 손상의 모양과 분포가 결과를 바꾸는 대표적인 비교다.
가상 사례 D는 코드가 손상되지 않았지만 투명 포장지의 반사광이 한쪽을 하얗게 날려 버린 경우다. 카메라 입장에서는 반사된 부분의 검은 모듈이 사라진 것처럼 보이므로 물리적 손상과 비슷한 판독 오류가 생긴다. 촬영 각도를 바꾸거나 조명을 줄이면 같은 코드가 곧바로 읽힐 수도 있다. 반대로 종이가 젖어 잉크가 번졌다면 각도를 바꿔도 모듈 경계 자체가 회복되지 않는다. 사용자는 ‘가렸다’는 한 단어 대신 가림 위치, 분포, 대비, 초점, 반사와 코드 크기를 함께 관찰해야 문제 원인을 좁힐 수 있다.
- 중앙 데이터 영역 가림: 구조 탐지 후 오류정정을 시도할 여지가 있지만 성공을 보장하지 않는다.
- 위치 탐지 패턴 가림: 데이터 복원 전의 위치·방향 판별부터 실패할 수 있다.
- 전체에 흩어진 얼룩: 여러 기능 영역과 코드워드에 영향을 줄 가능성을 살핀다.
- 반사광과 초점 흐림: 코드가 멀쩡해도 촬영 영상에서는 손상처럼 나타날 수 있다.
인식 성능은 코드 제작과 촬영 조건에도 달려 있다
모듈 크기·대비·여백·초점이 함께 맞아야 한다
작은 QR코드에 긴 데이터를 넣으면 모듈 하나의 실제 크기가 매우 작아질 수 있다. 프린터가 모듈 경계를 선명하게 표현하지 못하거나 카메라의 한 화소가 여러 모듈을 뭉개면 흑백을 안정적으로 구분하기 어렵다. 확대 인쇄한다고 항상 해결되는 것도 아니다. 저해상도 원본을 그림처럼 늘리면서 가장자리를 흐리게 보간하면 경계가 오히려 번질 수 있다. QR코드는 벡터나 정수 배율처럼 모듈 경계를 선명하게 유지하는 방식으로 출력하고, 예상 스캔 거리와 카메라 성능에 맞는 물리적 크기를 선택해야 한다.
검은 모듈과 밝은 배경의 대비도 중요하다. 장식 목적으로 색을 반전하거나 무늬가 있는 사진 위에 겹치면 판독기가 밝고 어두운 값을 잘못 분류할 수 있다. 광택 재질은 조명 방향에 따라 일부가 과도하게 밝아지고, 곡면 포장은 격자를 휘게 만든다. 코드 가장자리의 콰이어트 존을 잘라 내거나 테두리와 맞닿게 글자를 배치하는 것도 경계 탐지를 방해한다. 디자인을 적용하려면 위치 탐지 패턴, 형식 정보, 타이밍 패턴과 여백을 훼손하지 않는지 확인하고 실제 사용 기기와 거리에서 반복 시험해야 한다.
스캔이 실패할 때는 오류정정 수준부터 바꾸기보다 원인을 순서대로 분리하는 편이 효율적이다. 먼저 렌즈를 닦고 초점을 맞춘 뒤, 반사가 없는 각도로 이동하고 화면 밝기나 주변 조명을 조절한다. 다음으로 코드 전체와 바깥 여백이 카메라 안에 들어오는지 확인한다. 그래도 읽히지 않으면 인쇄 번짐, 모듈 크기, 기능 패턴의 가림과 원본 데이터 손상을 점검한다. 여러 휴대전화에서 모두 실패하면 코드 제작 문제일 가능성이 커지고, 한 기기에서만 실패하면 카메라나 앱의 판독 조건을 따로 살펴볼 수 있다.
- 코드 전체와 주변의 밝은 여백이 한 화면에 들어오게 한다.
- 반사광을 피하고 카메라가 모듈에 초점을 맞추도록 거리를 조절한다.
- 위치 탐지 패턴과 모듈 경계가 선명한지 확인한다.
- 다른 기기에서도 시험해 코드 문제와 촬영 기기 문제를 구분한다.
QR코드를 읽었다는 사실과 내용의 안전성은 별개다
판독 결과를 확인하는 습관까지가 올바른 사용법
오류정정에 성공했다는 것은 인코딩된 문자열을 복원했다는 뜻이지, 그 문자열이 가리키는 웹사이트나 결제가 안전하다는 뜻은 아니다. QR코드는 문자, 연락처, 주소, 웹 링크 등 여러 데이터를 담는 운반 수단이다. 공격자가 정상 안내문 위에 다른 QR 스티커를 붙이면 코드는 매우 선명하게 읽히면서도 사용자를 다른 주소로 보낼 수 있다. 스캔 앱이 보여 주는 도메인과 경로를 확인하고, 출처가 불분명한 코드가 앱 설치나 로그인, 송금 정보를 요구하면 진행을 멈춰야 한다. 기술적 판독 성공과 콘텐츠 신뢰성 판단은 서로 다른 단계다.
직접 QR코드를 제작할 때는 저장할 데이터를 먼저 줄이고 필요한 오류정정 수준을 선택한 뒤, 충분한 모듈 크기와 여백을 확보해야 한다. 로고나 장식을 넣고 싶다면 특정 훼손 비율을 믿고 덮는 대신 기능 패턴을 피하고 실제 출력물로 시험한다. 화면용과 인쇄용은 밝기, 해상도, 재질과 관찰 거리가 다르므로 각각 검증하는 것이 좋다. 원본 이미지를 보관하고 인쇄 과정에서 비율이 찌그러지거나 흐림 효과가 적용되지 않게 관리한다. 이 절차는 오류정정 기능에 기대는 것이 아니라 판독 오류가 생길 원인을 줄이는 예방 중심의 설계다.
정리하면 QR코드가 일부 가려져도 읽힐 수 있는 이유는 남아 있는 구조 정보로 위치와 격자를 찾고, 데이터 코드워드와 리드-솔로몬 오류정정 코드워드를 이용해 손상된 값을 복원할 수 있기 때문이다. 하지만 성공 여부는 오류정정 수준만으로 결정되지 않는다. 기능 패턴의 보존, 손상 위치와 분포, 모듈 크기, 대비, 여백, 초점과 반사까지 함께 작용한다. 따라서 ‘몇 퍼센트까지 괜찮다’는 식의 단정 대신 실제 사용 환경에서 시험하고 원본 코드와 주변 여백을 온전히 유지하는 것이 가장 안전한 결론이다.