한 줄로 말하면

QR 코드 마스크는 같은 데이터를 모듈 격자에 배치할 때 적용할 수 있는 여러 패턴이야. QR 코드는 8개 마스크를 각각 적용해 본 뒤, ISO/IEC 18004의 페널티가 가장 낮은 후보를 골라 스캔하기 좋은 모양을 선택해.1

비유로 이해하기

같은 문장을 서로 다른 글꼴로 출력한다고 생각해 보자. 내용은 같지만 글자와 배경이 뭉치거나 반복되는 정도는 달라질 수 있어. QR 코드의 마스크도 데이터 자체를 바꾸는 게 아니라 격자에 보이는 검정·흰색 배치의 표면을 바꿔.

여기까지가 이해를 돕는 비유야. 실제로는 QR 인코더가 8개 후보를 모두 만들어 평가하고, 정해진 페널티가 가장 낮은 후보를 선택해. “가장 예쁜 모양”을 고르는 것이 아니라, 표준이 정한 가독성 평가를 통과한 모양을 고르는 구조에 가까워.

정확한 정의

마스크 선택은 QR 코드의 데이터와 오류 정정 수준을 바탕으로 여러 마스크 패턴을 적용한 뒤, 각 결과를 평가하는 단계야. QR 표준에서 서로 교체 가능한 8개 마스크 패턴을 두고, ISO/IEC 18004 페널티가 가장 낮은 마스크를 선택하는 방식이 기본 흐름이야.1

구조를 단순화하면 이렇게 볼 수 있어.

flowchart LR
    A[데이터와 오류 정정 수준] --> B[8개 마스크 후보 생성]
    B --> C[각 후보의 표준 페널티 평가]
    C --> D[가장 낮은 후보 선택]
    D --> E[QR 코드 출력]

마스크는 코드 안의 데이터 의미를 바꾸지 않아. 같은 내용과 오류 정정 수준을 유지한 채, 모듈이 배치되는 모양을 바꾸는 선택지야. 그래서 인코더는 하나를 미리 정해 두기보다 후보를 비교할 수 있어.

왜 중요한가

QR 코드는 작은 격자의 반복과 대비로 정보를 표현해. 특정 배치가 지나치게 뭉치거나 읽기 어려운 모양을 만들면 스캔에 불리할 수 있으니, 마스크 선택은 시각적 모양을 임의로 고르는 장식 단계가 아니야. 표준 페널티는 후보를 같은 기준으로 비교하는 장치야.1

이 구조는 다른 조건을 추가할 자리도 남겨 둬. 예를 들어 qr-swastika-avoider는 8개 후보를 모두 렌더링한 뒤 특정 문양이 없는 후보만 남기고, 그 안에서 ISO/IEC 18004 페널티가 가장 낮은 마스크를 반환해.1 이때 선택 순서는 “표준 점수가 제일 낮은 하나를 먼저 고른 다음 검사”가 아니야. 추가 검사를 통과한 후보 집합 안에서 표준 페널티를 비교하는 방식이지.

실제 예시

QR 생성기가 어떤 콘텐츠를 코드로 바꾼다고 해 보자. 생성기는 8개 마스크를 적용한 결과를 각각 만들고, 표준 페널티를 계산해 가장 낮은 후보를 선택해. 선택된 결과는 같은 콘텐츠를 담지만 모듈의 밝고 어두운 배치는 다른 QR 코드가 돼.1

특정 시각 패턴까지 피해야 한다면 과정이 한 단계 늘어나. 후보마다 문양 검사를 먼저 하고, 검사에서 제외된 후보를 버린다. 남은 후보가 있으면 그중 페널티가 가장 낮은 것을 반환하고, 생성할 수 없으면 명시적인 오류를 돌려주는 식이야.1

다만 추가 검사는 표준 가독성 평가와 같은 일이 아니야. 해당 구현은 파인더·타이밍·정렬·포맷·버전 모듈을 검사 대상에서 제외하고, 주변 대비가 없는 문양도 무시하도록 설계돼 있어. 또 축에 정렬된 5×5·7×7 형태와 두 색상 극성만 탐지하며, 45도·대각선·임의 회전 형태는 범위에 들어오지 않아.1

헷갈리지 말아야 할 점

  • 마스크는 오류 정정 자체가 아니야. 마스크는 같은 QR 데이터의 모듈 배치를 바꾸는 선택이고, 오류 정정 수준은 입력으로 함께 주어지는 별도 요소야.1
  • 페널티가 낮다고 모든 시각적 문제를 없애지는 않아. 표준 점수는 표준이 평가하는 가독성 기준이고, 특정 상징이나 사람의 해석까지 자동으로 판단하는 검사는 아니야.1
  • 후보를 걸러내면 선택 기준이 달라져. 추가 조건을 적용한 구현에서는 전체 8개 중 가장 낮은 점수가 아니라, 조건을 통과한 후보 중 가장 낮은 점수를 선택해.1
  • 검사 범위에는 한계가 있어. 특정 구현이 다루지 않는 회전·대각선 패턴까지 피한다고 읽으면 안 돼.1

관련 문서

  • 데이터를 격자에 배치하고 사람이 읽을 수 있는 결과를 만드는 문제는 컨텍스트 엔지니어링과는 다른 층위지만, 표현의 제약을 먼저 정한 뒤 결과를 고르는 구조라는 점에서 비교해 볼 수 있어.

남은 질문들

  • ISO/IEC 18004의 각 페널티 항목은 어떤 시각적 패턴을 감점하고, 서로 어떤 트레이드오프를 만들까?
  • 8개 마스크 중 최저점 후보가 실제 카메라·거리·인쇄 조건에서도 안정적으로 읽히는지는 어떻게 검증할까?
  • 특정 문양 회피 같은 추가 필터가 후보를 너무 많이 버릴 때 오류 정정 수준과 생성 가능성은 어떻게 달라질까?

각주

  1. GeekNews, 「qr-swastika-avoider v0.1.0 — QR 코드의 우발적 스와스티카 문양 회피」(2026-07-16) . ↩︎ ↩︎2 ↩︎3 ↩︎4 ↩︎5 ↩︎6 ↩︎7 ↩︎8 ↩︎9 ↩︎10 ↩︎11