BIP21 QR은 단순 주소 이미지가 아니라 `bitcoin:` 주소와 query 매개변수를 담은 결제 URI일 수 있습니다. 지갑이 채운 수신 주소, BTC 단위 amount, label·message를 최종 화면에서 다시 확인하세요. 모르는 일반 매개변수는 무시할 수 있지만 `req-`로 시작한 필수 매개변수를 이해하지 못하는 지갑은 결제를 거부해야 합니다.
QR 안에는 주소 외에도 결제 조건이 들어갈 수 있습니다
BIP21 URI는 `bitcoin:` 뒤 path에 비트코인 주소를 두고 물음표 뒤 query에 지급 옵션을 넣습니다. 예를 들어 `amount`, `label`, `message`가 함께 들어가면 지갑이 수신 주소뿐 아니라 금액과 표시 문구를 자동 채울 수 있습니다. 카메라로 QR을 읽었다는 사실은 그 값들이 사용자의 의도와 맞다는 보증이 아닙니다.
표준은 URI를 받은 클라이언트가 사용자 승인 없이 행동하지 말고 각 결제를 수동 승인하도록 권고합니다. 주문 페이지가 변조됐거나 다른 창의 QR을 읽었을 수 있으므로 스캔 직후 지갑의 최종 확인 화면에서 주소, 네트워크, 금액을 원래 청구서와 대조해야 합니다.
QR은 입력을 줄이는 전달 형식이지 결제 상대와 금액을 대신 판단해 주는 신뢰 표시가 아닙니다.
JOBCOIN 해설

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.
- QR 안에는 주소 외에도 결제 조건이 들어갈 수 있습니다
BIP21 URI는 `bitcoin:` 뒤 path에 비트코인 주소를 두고 물음표 뒤 query에 지급 옵션을 넣습니다.
- amount는 BTC 십진수로 해석합니다
BIP21의 `amount`는 BTC 단위 십진수이며 소수점 구분자로 점을 사용합니다.
- label과 message는 인증서가 아닙니다
`label`은 주소록에 저장할 수신자 이름 같은 표시값이고 `message`는 사용자에게 보이는 결제 설명입니다.
AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.
amount는 BTC 십진수로 해석합니다
BIP21의 `amount`는 BTC 단위 십진수이며 소수점 구분자로 점을 사용합니다. `amount=0.0015`는 0.0015 BTC, 즉 150,000 sat입니다. 쉼표가 들어간 `50,000.00` 같은 표기는 유효하지 않습니다. 지갑이 현지 통화나 sat 단위로 다시 표시한다면 변환값을 확인해야 합니다.
가정으로 청구 금액이 0.002 BTC인데 지갑 화면에 0.02 BTC가 채워졌다면 열 배 차이입니다. QR을 다시 찍기 전에 URI 원문과 주문서 금액을 비교하고 결제를 중단하세요. 네트워크 수수료는 지급 amount와 별도이므로 총 차감액이 청구 금액보다 큰 것은 정상일 수 있지만 수신액이 달라져서는 안 됩니다.
| 필드 | 역할 | 승인 전 확인 |
|---|---|---|
| 주소 path | 수신 스크립트 목적지 | 주문서 주소와 전체 대조 |
| amount | BTC 단위 지급액 | sat·법정화폐 표시와 변환 |
| label | 수신자 표시용 라벨 | 신원 인증으로 오해하지 않기 |
| message | 결제 설명 | 체인 메모로 저장된다고 단정 금지 |
| req-* | 지갑이 이해해야 하는 필수 기능 | 미지원이면 결제 중단 |
label과 message는 인증서가 아닙니다
`label`은 주소록에 저장할 수신자 이름 같은 표시값이고 `message`는 사용자에게 보이는 결제 설명입니다. 둘 다 URI를 만든 사람이 자유롭게 넣을 수 있으므로 유명 상점 이름이 표시됐다는 이유만으로 진짜 청구서가 되지 않습니다. 페이지 도메인, 주문 번호와 별도 채널의 상대 확인이 필요합니다.
message가 들어 있다고 블록체인에 그 문구가 기록되는 것도 아닙니다. 지갑 내부 거래 메모로만 남을 수 있고 다른 기기나 복구 후 사라질 수도 있습니다. 회계 증빙이 필요하면 주문서, txid, 지급 주소, 금액과 확인 시각을 별도로 보관하세요.
- QR을 스캔한 뒤 지갑이 표시한 네트워크를 확인합니다.
- 주소 전체 또는 검증 가능한 화면을 원 청구서와 대조합니다.
- BTC와 sat 단위를 변환해 amount를 재계산합니다.
- 알 수 없는 req- 매개변수가 있으면 결제하지 않습니다.
- 승인 후 txid와 주문 번호를 함께 기록합니다.
필수 매개변수는 req- 접두어로 구분됩니다
BIP21은 향후 확장을 위해 알 수 없는 일반 query 매개변수는 무시할 수 있게 했습니다. 그러나 이름이 `req-`로 시작하면 수신자가 결제 처리에 필수라고 선언한 기능입니다. 지갑이 그 의미를 이해하지 못하면 URI 전체를 유효하지 않은 것으로 보고 결제를 진행하지 않아야 합니다.
일반 매개변수를 모두 안전하다고 보는 것도 곤란합니다. PayJoin의 `pj`처럼 선택 기능이 거래 생성 흐름을 바꿀 수 있습니다. 지갑이 어떤 매개변수를 지원하고 최종 화면에 무엇을 표시하는지 확인하세요. 원문 URI를 로그로 남길 때는 주문 식별 정보가 포함될 수 있으므로 공개 공유하지 않습니다.
대체 규격과 지갑 호환성을 확인합니다
BIP21 문서는 현재 BIP321에 의해 대체됐다고 표시합니다. 그렇다고 기존 BIP21 QR이 즉시 무효라는 뜻은 아닙니다. 실제 지갑과 판매자가 어느 형식을 생성·해석하는지가 중요하며, 새 규격 기능을 모르는 지갑은 안전한 fallback 또는 명확한 오류를 보여야 합니다.
결제 사업자는 지원 지갑 목록만 나열하기보다 테스트 벡터를 마련해야 합니다. 금액 없는 URI, 소수점 amount, UTF-8 label, 알 수 없는 선택 필드, 알 수 없는 req- 필드를 각각 열어 예상대로 표시·거부되는지 확인하면 자동 입력 사고를 줄일 수 있습니다.
스캔 성공과 결제 완료를 다른 상태로 둡니다
QR을 읽고 지갑 화면이 열리는 것은 URI 파싱 성공일 뿐 거래가 생성·방송·확인됐다는 뜻이 아닙니다. 반대로 앱이 멈췄다고 즉시 다시 결제하면 첫 거래가 이미 방송돼 중복 지급할 수 있습니다. 승인 이후에는 지갑 기록과 txid, 수신 측 주문 상태를 확인하세요.
상점은 `QR 발급`, `지갑 열림`, `거래 감지`, `확인 수 충족`을 별도 상태로 기록하는 편이 좋습니다. 고객 지원도 QR 이미지만 다시 보내기 전에 기존 주문 주소의 입금 여부를 조회해야 합니다. 표준 URI는 전달 정확도를 높이지만 결제 상태 관리까지 대신하지는 않습니다.
자주 묻는 질문
BIP21 QR을 찍으면 바로 송금되나요?
표준은 사용자 승인을 요구합니다. 지갑이 채운 주소와 금액을 확인하고 직접 승인해야 하며 스캔만으로 결제 완료가 아닙니다.
amount=1은 1 sat인가요?
아닙니다. BIP21 amount는 BTC 단위이므로 1은 1 BTC입니다. 지갑의 표시 단위를 반드시 확인하세요.
label에 상점명이 맞으면 진짜 QR인가요?
아닙니다. label은 작성자가 넣는 표시 문자열입니다. 원래 페이지 도메인과 주문 정보, 주소를 별도로 대조하세요.
더 깊이 읽기
본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.



