디지털 제품 패스는 모든 사람에게 동일한 정보를 보여주지는 않습니다. 구매자는 공개된 데이터만 볼 수 있습니다. 수리 업체나 재가공 업체는 더 많은 정보를 볼 수 있습니다. 시장 감독 당국은 모든 정보를 볼 수 있습니다. 이는 이미 명확히 정립된 사항이며, 현재 유럽 표준에도 명시적으로 규정되어 있습니다.
더 흥미로운 질문은 다음과 같습니다. 공개된 데이터 외에도 비공개 필드가 누군가에게 공개될 경우, 그 사람은 하필 그 필드들이 진짜라는 사실을 입증할 수 있을까요? 아니면 플랫폼이 해당 필드를 정확하게 선별하여 변경 없이 전달했다고 믿어야만 할까요?
대부분의 플랫폼에서 솔직한 대답은 ‘신뢰’입니다. 우리는 공개 시점에 추가되는 모든 필드에 대해, 단순히 공개 필드뿐만 아니라 ‘증거’라는 답이 나오도록 플랫폼을 구축했습니다. 왜 이러한 차이가 중요한지, 그리고 왜 우리가 이를 위해 더 많은 노력을 기울였는지 설명하겠습니다.
접근 권한 규칙은 모두 동일하게 준수합니다
DPP(데이터 처리 플랫폼)의 접근 권한, 보안 및 기밀성에 관한 유럽 표준인 EN 18239는 데이터 요소별 접근 제어를 요구합니다. 즉, 각 필드마다 누가 볼 수 있는지에 대한 규칙이 존재합니다. 이는 올바른 요구 사항이며, 충족하기 어렵지 않습니다. 이러한 표준들이 실제로 어떤 지위를 가지는지에 대해서는 조화 표준에서 자세히 설명했습니다.
이를 구현하는 일반적인 방법은 서버 측 필터링입니다. 서버는 누가 요청하는지 파악하고, 해당 사용자가 볼 수 있는 내용을 조회한 뒤 정확히 그 부분만 반환합니다. 접근 제어: 완료. 표준에서 요구하는 것은 이것뿐입니다.
하지만 표준이 다루지 않는 한 가지 문제가 있습니다: 제공된 데이터는 서명되지 않은 상태로 도착합니다. 독자는 자신에게 맞춰 구성된 화면을 받게 되며, 서버가 정직하게 데이터를 선별했고 전송 과정에서 아무것도 변경하지 않았다고 믿어야만 합니다. 공개용 안내서라면 괜찮을 수 있습니다. 하지만 데이터 처리자가 중고 배터리 가격을 산정하는 데 바로 이 데이터를 근거로 삼는다면, 이는 지나치게 큰 믿음입니다.
단일 서명이 한계에 부딪히는 지점
가장 손쉬운 해결책은 데이터에 서명을 하는 것입니다. 양극단에서는 일반적인 서명이 잘 작동합니다. 공개용 뷰에 서명하고, 전체 데이터 세트에 서명한 다음, 서버가 개입하지 않은 상태에서 공개 키를 통해 양쪽을 모두 검증하면 됩니다. 이 과정이 구체적으로 어떻게 진행되는지는 DPP의 서명 및 인증서에서 확인할 수 있습니다.
문제는 중간에서 발생합니다. 문서 전체에 대한 서명은 정확히 하나의 필드 집합, 즉 서명 시점에 존재했던 필드들만을 포함합니다. 권한이 있는 독자에게 보호된 필드를 추가로 공개하면, 이 필드는 서명된 범위를 벗어나므로 서명이 적용되지 않은 상태로 전달됩니다. 대신 처음부터 전체 데이터 세트에 서명하면 서명이 모든 것을 포함하지만, 이 경우 모든 사람에게 모든 내용을 공개해야만 합니다.
그 사이의 단계들, 즉 수리 업체, 보험사, 재활용 업체 등은 이 체계에서 빠져버립니다. ‘누가 무엇을 보는지’에 대한 모든 가능한 조합을 미리 서명하려면 조합마다 별도의 서명된 문서가 필요하며, 접근 그룹이 하나씩 추가될 때마다 조합의 수는 기하급수적으로 늘어납니다. 아무도 그렇게 하지 않습니다. 결국 서명되지 않은 서버 필터로 되돌아갈 수밖에 없으며, 중간 단계는 다시 신뢰에 의존하게 됩니다.
각 필드를 개별적으로 서명하기
더 나은 구조가 있으며, 우리는 이를 기반으로 플랫폼을 구축합니다. 완성된 문서를 하나의 블록으로 서명하는 대신, 발행자는 단 한 번의 서명 과정에서 각 필드를 개별적으로 지정합니다(표준에 정통한 분들을 위해: 선택적 공개를 위한 W3C 사양 ecdsa-sd-2023).
모든 보기는 공개 핵심에서 시작됩니다
모든보기는 동일한 공개 필드에서 시작됩니다. 독자가 그 이상으로 보게 되는 내용은 필드별로 추가되며, 이러한 각 필드는 오프라인 상태에서도, 재서명 없이, 보기를 구성한 기관에 대한 신뢰 없이도 발행자의 공개 키로 거슬러 올라갑니다. 권한이 없는 필드는 단순히 누락됩니다. 검게 가려진 것이 아니라 아예 존재하지 않으며, 이를 통해 어떤 정보도 새어 나오지 않습니다.
왜 ‘끊김 없이’가 핵심인 이유
편지 전체를 공증하는 것이 아니라 각 단락을 개별적으로 공증하는 공증인을 상상해 보십시오. 공개 편지는 누구나 받습니다. 더 많은 내용을 요구할 권리가 있는 사람은 추가 단락을 받게 되며, 그 각 단락에는 여전히 동일한 공증인의 인장이 찍혀 있습니다. 일반적인 절차에서는 플랫폼이 이러한 단락을 대신 입력해 주며, 여러분에게 전달되는 내용에는 플랫폼의 말만 담겨 있습니다.
왜 ‘깨지지 않은’ 상태가 중요한지, 한 문장 더 설명할 가치가 있습니다. 손상되지 않은 인장은 내용이 사실임을 보장하지 않습니다. 그 인장은 “발행자가 정확히 이 내용을 작성했으며, 그 이후로 누구도 그 내용을 변경하지 않았다”는 것을 말해줍니다. 따라서 문서를 단순히 전달하기만 한 모든 주체 - 중간 저장소, 네트워크, 아카이브, 우리 - 는 신뢰 문제에서 제외됩니다. 누가 귀하에게 여권을 건넸는지는 더 이상 중요하지 않습니다.
그리고 인장은 이진적입니다. 유효하거나 무효하거나, 반쯤 깨진 인장은 존재하지 않습니다. 인장이 깨지면 어떤 문장이 변경되었는지는 알 수 없고, 단지 그 문서 전체를 더 이상 신뢰할 수 없다는 사실만 알게 됩니다. 따라서 추가 필드가 인장과 함께 전달되든 없든, 그 차이는 점진적인 것이 아닙니다. 인장이 없다면 해당 필드의 유효성이 약간 약해진 것이 아니라, 아예 유효하지 않은 것입니다.
두 가지 확인 방법
누구나 직접 확인해 볼 수 있습니다. Transpareo Time Machine은 제품 패스를 위한 당사의 오픈소스 뷰어 앱입니다. 이 앱은 패스의 버전 이력을 훑어보며, 당사의 서버에 요청하지 않고도 사용자의 브라우저에서 각 서명을 재계산합니다. 이 앱에는 두 가지 예시 패스가 공개되어 있습니다. 티셔츠 패스는 문서 전체에 대한 서명을 포함하고 있으며, 배터리 패스는 필드별 공개 정보를 담고 있습니다.
두 가지 모두 공개된 W3C 사양입니다: 문서 전체에 대한 서명은 eddsa-jcs-2022, 필드별 공개는 ecdsa-sd-2023입니다. 원하는 사람이라면 누구나 이를 구현할 수 있습니다. 하지만 많은 사람들이 이를 적용하지 않을 이유는 바로 그 부담 때문입니다. 문서 전체에 대한 서명은 구축 및 운영 비용이 훨씬 저렴하며, 공개 데이터만 제공하는 경우에는 이 방법만으로도 충분합니다.
타임머신이 두 가지 방식을 모두 지원하는 것은 의도된 것이며 앞으로도 그대로 유지될 것입니다. 타임머신은 어떤 플랫폼에도 속하지 않습니다. 더 비싼 방식만 수용하는 검증자는 우리에게만 유용한 도구가 될 뿐, 그 외 누구에게도 도움이 되지 않을 것입니다.
보호된 필드가 누구에게 공개되는가
공개된 데이터를 넘어 실제로 어떤 정보가 누구에게 공개되는지 묻는 것은 의미 있는 일입니다. 우연히 지나가던 구매자에게는 공개된 정보만 제공됩니다. 중고 배터리 팩의 가치를 평가하는 처리업체, 위험을 산정하는 보험사, 화학 물질을 분류하는 재활용업체, 사건을 수사하는 당국이 바로 그 대상입니다. 이들이야말로 금전적 이익이나 안전에 직결된 결정을 내리는 정보의 수신자들입니다.
그리고 바로 이 필드들이 일반적인 접근 방식에서는 노출되지 않은 채 전달됩니다. 암호화 검증 정보를 가장 필요로 하는 사람들이, 정작 자신의 결정에 영향을 미치는 필드에 대해서는 그 정보를 얻지 못하는 것입니다.
우리는 검증 마크가 모든 사람에게 동일한 의미를 가져야 한다고 생각합니다. 수리 업체의 상세 정보 화면에 표시된 “Transpareo에서 검증함”이라는 문구는 구매자의 공개 인증서에 표시된 것과 동일한 의미를 지닙니다. 표시된 모든 항목은 발급 기관에서 제공한 것이며, 그 이후로 수정된 적이 없습니다. 공개 필드에만 적용되는 인증 마크는 반쪽짜리 인증 마크일 뿐입니다.
표준이 요구하는 것 이상
솔직히 말씀드리자면 ## ,이 중 어떤 것도 의무 사항이 아닙니다. EN 18239## 표준은접근 제어를 요구하며, 서버 측 필터는 접근을 완벽하게 제어합니다. 공개된 필드까지 암호학적으로 검증 가능하게 만드는 것 역시 우리가 추가로 수행하는 조치일 뿐, 규정이 우리에게 요구하는 필수 항목은 아닙니다.
바로 그 이유 때문에 이 점을 명시할 가치가 있습니다. 단순히 규격의 문언을 충족하고, 서버 필터를 제공한 뒤 해당 단계를 완료로 선언하는 것은 쉬운 일입니다. 하지만 우리는 인증 마크가 표시되는 모든 곳에서 그 약속이 지켜지기를 원합니다. 서명된 패스의 진정한 의미는 누구도 플랫폼을 신뢰할 필요가 없다는 점에 있기 때문입니다. 중간 단계를 예외로 제외해 버리면, 바로 그 서명이 없애려 했던 신뢰를 다시 불러오게 됩니다.
같은 원리로 특정 필드는 제외될 수 있습니다
각 필드를 개별적으로 규정하는 것은 두 번째 특성을 수반하며, 이는 실제로 유럽 법이 요구하는 사항입니다. 일반 개인정보 보호 규정은 개인에게 개인정보를 삭제할 권리를 부여합니다. 하나의 블록으로 서명된 데이터 세트는 자체 서명을 무효화하지 않고서는 이 요구 사항을 충족할 수 없습니다.
여기서는 각 필드가 독립적으로 존재하기 때문에, 나머지 모든 필드는 계속 유효한 상태로 유지된 채로 단일 필드만 제거할 수 있습니다. 실수로 여권에 개인정보가 포함되더라도, 해당 정보는 깨끗하게 제거되고 여권은 유효한 상태를 유지합니다. 재발급도 필요 없고, 기록이 훼손되는 일도 없습니다. 법률에 따라 보관해야 하는 필수 항목은 그대로 유지되며, 삭제 가능한 항목은 요청 시 수년이 지난 후에도 삭제할 수 있습니다.
그럼에도 불구하고 아주 평범한 여권
이 모든 것이 여권을 오직 우리 도구로만 열 수 있는 특별한 객체로 만들지는 않습니다. 이 여권은 웹 표준 세계가 지향하는 형식인 JSON-LD의 ‘검증 가능한 자격 증명(Verifiable Credential)’으로 남아 있으며, 이는 UN 투명성 프로토콜(UN Transparency Protocol)과 나머지 W3C 환경에서도 사용하는 것과 동일한 형식입니다.
따라서 구매자가 브라우저에서 스캔하는 여권은 데이터룸 파트너가 읽어 들일 수 있는 것과 동일한 객체이며, 우리 측뿐만 아니라 표준을 준수하는 모든 검증자가 이를 검증할 수 있습니다. 이러한 추가적인 보안은 독자에게 아무런 비용도 발생시키지 않으며, 누구도 우리와 묶어두지 않습니다.
기술적으로 어려운 이유
먼저, 오해가 생기지 않도록 말씀드리자면: ## 이방식을 우리가 발명한 것은 아닙니다. ecdsa-sd-2023은 공개된 W3C 사양이며, 그 기반이 되는 암호화 기술은 우리가 개발한 것이 아닙니다. 이를 구현하고자 하는 분이라면 관련 문서를 참고하시면 됩니다. 아이디어를 떠올리는 것은 어렵지 않습니다. 어려운 점은 10년 후에도 여권이 여전히 유효성을 검증할 수 있도록 구축하는 것입니다. 바로 그 부분에 노력이 필요하며, 이에 대해 유용한 이야기를 할 수 있습니다.
차이는 사소해 보이지만, 그 기반을 완전히 바꿔 놓습니다. 일반적인 서명은 문서의 바이트를 기반으로 계산합니다. 선택적 공개는 문서의 진술 내용을 기반으로 계산합니다. 여권은 서명 전에 표준화된 형식으로 변환되는데, 이 형식에서는 각 정보가 독립된 문장으로 존재합니다. 그래야만 나머지 문장에 영향을 주지 않고 특정 문장 하나만 생략할 수 있습니다.
이로 인해 바이트 서명에는 없는 문제가 발생합니다. 바로 10년 후에도 동일한 표준화된 형식이 정확히 재현되어야 한다는 점입니다. 대략적으로가 아니라 문자 하나하나까지 정확히 일치해야만, 그렇지 않으면 더 이상 증명이 유효하지 않습니다. 이를 가로막는 세 가지 요소가 있는데, 이 세 가지 모두 눈에 잘 띄지 않습니다.
숫자는 유형을 잃습니다. 숫자를 단순한 JSON으로 작성하면, 전송 과정에서 어떤 종류의 숫자였는지가 사라집니다. 2.0과 같은 값은 JSON을 한 번 거치면 2로 돌아옵니다. 사람에게는 똑같은 값이지만, 표준화된 형식에서는 다른 문장이 되어 검증이 실패합니다.
명칭만으로는 의미가 아닙니다. 표준화된 형식이 생성되려면 각 필드 이름이 고유한 의미로 해석되어야 합니다. 하나가 빠지면 변환 과정에서 해당 필드는 아무런 알림 없이 사라집니다. 패스에는 여전히 존재하지만, 검증에서는 이를 포함하지 않으므로 아무도 눈치채지 못합니다.
의미는 대개 네트워크에 있습니다. 이 매핑 정보는 어휘집에 담겨 있으며, 대부분의 도구는 검증 시 네트워크를 통해 이를 다시 불러옵니다. 이렇게 하는 사람은 자신의 여권 검증 가능성을 10년 후에도 외부 주소가 변함없이 응답할 것이라는 전제에 의존하게 됩니다.
우리가 이를 해결한 방법
우리는 나중에 이를 차단하는 대신, 문제의 근원에서 세 가지 요소를 해결했습니다.
타입. 모든 값은 해당 타입과 함께 기록되며, 표준화된 형식에 타입이 지정되지 않은 숫자가 단 하나라도 나타나면 게시 과정이 중단됩니다. 이로써 오류는 수년 후 설명할 수 없는 검증 위반으로 나타나는 대신, 한 줄의 코드가 소요되는 시점에서 바로 발견됩니다.
어휘집. 패스가 참조하는 모든 어휘집은 우리 시스템에 로컬로 저장되어 있으며, 절대로 네트워크를 통해 불러오지 않습니다. 알 수 없는 주소는 서명 과정에서 즉시 중단되는 원인이 되며, 빈 결과로 조용히 되돌아가는 일이 없습니다.
식별자. 문서 내의 모든 노드는 안정적인 식별자를 가지고 있어, 매 실행 시마다 새로운 보조 이름을 할당하는 대신 표준화된 형식을 재현할 수 있도록 합니다.
가장 까다로운 부분은 ‘Bring Your Own Key(자신의 키를 가져오기)’에 있습니다. 각 발급 시마다 공개 가능한 필드를 개별적으로 서명하는 데 사용되는 추가적인 단기 유효 키가 필요합니다. 이 키는 발급자가 직접 생성하고 폐기합니다. 만약 이 키가 우리에게 있다면, 우리는 나중에 개별 필드를 임의로 만들어낼 수 있고, 발행자 서명의 독립성은 단지 주장에 그칠 뿐입니다. 우리는 반환된 증명을 신뢰하기 전에, 저장된 공개 키를 대조하여 검증합니다.
각 패스에는 이러한 증명서가 두 개씩 포함되어 있는데, 하나는 발행자의 것이고 다른 하나는 Transpareo의 것이며, 두 증명서 모두 독자가 볼 때 서로 독립적으로 도출됩니다. 단 하나의 공개된 필드에 대해서도 두 개의 서명과 서로 독립적인 두 기관이 존재합니다.
저희에게 있어 이러한 노력은 필요한 곳에 투자된 것입니다. 우리는 검증 기능을 사후에 추가한 것이 아닙니다. 플랫폼은 첫 번째 버전부터 이를 중심으로 구축되었습니다. 각 여권은 발행 시 서명되며 이전 버전과 연결됩니다. 변경 불가능한 10년 보관소가 마련되어 있으며, 여권이 EU-DPP 등록부에 등록되는 즉시 활성화됩니다. 전체 블록 대신 각 필드마다 서명하는 것은 이 핵심 기능의 확장일 뿐, 애초에 그런 용도로 설계되지 않은 것에 억지로 덧붙인 것이 아닙니다.
현재 상황
간단히 말해, 선택은 명확합니다. 보호된 필드를 공개하고 독자에게 필터를 신뢰해 달라고 요청할 수 있습니다. 이는 표준을 충족합니다. 또는 필드를 공개하면서 동시에 증명을 함께 제공할 수도 있습니다. 이는 우리 생각에 이 필드들이 마땅히 받아야 할 더 높은 기준을 충족시킵니다.
우리는 모든 독자를 위해 ‘증거’를 선택했습니다. 왜냐하면 인증 마크는 누가 보든 동일한 의미를 가져야 하기 때문입니다. 작동 방식을 직접 확인하고 싶으신 분들을 위해: 위에서 링크한 두 데모는 브라우저 내에서, 오프라인 상태에서, 공개 키만을 사용하여 직접 검증됩니다.
