Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 발급자가 검증 가능 자격 증명에 대해 간결한 암호학적 증인의 색인화된 목록을 게시하기 위한 메커니즘을 설명한다. 검증자는 이러한 목록을 사용하여 검증 가능 자격 증명이 주장된 발급자에 의해 실제로 발급되었는지 확인할 수 있다 — 이는 발급자의 서명 키를 침해한 공격자가 위조한 자격 증명과 구별하기 위한 것이다. 증인 목록 자체가 검증 가능 자격 증명이므로, 보호되는 자격 증명과 다른 알고리즘으로 서명될 수 있으며, 여기에는 양자 내성 서명 방식도 포함된다. 이는 기존의 서명 키가 양자 능력을 갖춘 공격자에게 침해된 시나리오에서 이 메커니즘을 특히 가치 있게 만든다.
이 작업은 Quantum-Resistant Cryptosuites 1.0 작업을 보완하며, 동일한 위협, 즉 암호학적으로 관련 있는 양자 컴퓨터에 의한 기존 서명 키의 침해를 동기로 한다. 이러한 암호 제품군은 발급자가 양자 내성 서명으로 새로운 증명을 보호할 수 있게 한다. 이 명세는 발급자가 양자에 취약한 기존 알고리즘으로 서명되었거나 앞으로 서명될 자격 증명에 대해, 양자 내성 방식으로 서명된 증인 목록을 게시함으로써 양자 내성에 기반한 진정성을 확립할 수 있게 한다.
이 명세는 세 가지 사용
모드에 대한 데이터 모델과 알고리즘을 정의한다. 보호되는 자격 증명을 수정하지 않고 기존
Verifiable Credential Bitstring Status
List에 편승하는 암시적 모드; 보호되는 자격 증명에
credentialStatus 항목을 추가하는 명시적 모드; 그리고 자체 인덱스
할당을 정의하는 사용 사례를 위한
독립형 모드이다.
이 절은 이 문서가 게시된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 문서는 Verifiable Credentials Working Group이 Recommendation 트랙을 사용하여 첫 공개 작업 초안으로 게시하였다.
첫 공개 작업 초안으로 게시되었다는 사실이 W3C 및 그 회원의 승인을 의미하지는 않는다.
이 문서는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허 공개를 위한 지침도 포함되어 있다. 자신이 알고 있는 특허가 필수 청구항을 포함한다고 믿는 실제 지식이 있는 개인은 W3C 특허 정책 제6절에 따라 그 정보를 공개해야 한다.
이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.
이 절은 비규범적이다.
검증 가능 자격 증명은 흔히 그 내용에 대한 디지털 서명으로 보호된다. 발급자의 개인 서명 키가 손상되면 — 인프라 침해를 통해서든, 암호학적으로 관련 있는 양자 컴퓨터의 개발과 같은 암호 분석의 진전을 통해서든 — 공격자는 표준 서명 검증만으로는 발급 주체가 만든 것과 구별할 수 없는 자격 증명을 위조할 수 있다.
이 명세는 Verifiable Credential Bitstring Status List와 유사한 메커니즘을 제공하여, 발급자가 자신의 개인 키 자료로 발급된 자격 증명 중 실제로 자신이 발급한 하위 집합이 무엇인지 주장할 수 있게 한다. 이는 발급자가 자신의 자격 증명과 함께 게시하는 증인 목록의 형태를 취한다. 발급된 각 자격 증명에 대해, 발급자는 무작위 시드와 목록 내 자격 증명의 위치에서 파생된 짧은 암호학적 증인을 계산한다. 목록을 가져온 검증자는 자신이 검증하는 자격 증명의 증인이 발급자가 게시한 증인과 일치하는지 확인할 수 있다.
증인 목록 자체는 검증 가능 자격 증명이며 목록에 있는 자격 증명과 다른 디지털 서명 알고리즘을 사용하여 서명될 수 있다. 특히 증인 목록은 Quantum-Resistant Cryptosuites 1.0 명세에 있는 것과 같은 양자 내성 디지털 서명으로 서명될 수 있다. 이런 방식으로 발급자는 기존의 비양자 내성 디지털 서명으로 발급된 자격 증명에 대해 양자 내성 진정성을 확립할 수 있다.
이 명세는 Quantum-Resistant Cryptosuites 1.0을 보완한다. 둘 다 같은 위협 — 특히 암호학적으로 관련 있는 양자 컴퓨터에 의한 기존 서명 키의 침해 — 에 대한 대응이다. 양자 내성 암호 제품군은 향후의 위협을 다루며, 양자 이후 환경에서도 위조 불가능하게 유지되는 증명을 생성한다. 증인 목록은 이미 구축된 기반과 전환 기간을 다룬다. 이는 발급자가 이미 발급되었거나 — 계속 발급되어야 하는 — 기존 서명 기반 자격 증명에 대해 재발급 없이, 양자 이후 서명 아래에서 보증할 수 있게 한다. 두 메커니즘은 함께 사용되도록 의도되어 있다.
이 절은 비규범적이다.
이 절은 비규범적이다.
검증 가능 자격 증명 발급 시점에, 발급자는 자격 증명 데이터를 사용하여 암호학적 증인을 생성한다. 이러한 증인들의 집합은 무작위 시드와 결합되어 배열에 패킹되고, 증인 목록 자격 증명으로 함께 게시된다. 이 자격 증명은 — 선택적으로 양자 이후 알고리즘으로 — 서명되며, 검증자가 접근할 수 있도록 게시된다.
검증 시점에, 검증자는 증인 목록 자격 증명을 얻고, 게시된 무작위 시드와 자격 증명 데이터를 사용하여 검증 중인 자격 증명의 증인을 다시 도출한 다음, 이를 자격 증명의 증인 인덱스에 저장된 값과 비교한다. 불일치는 해당 자격 증명이 주장된 주체에 의해 발급되지 않았음을 나타낸다.
비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.
이 문서에서 핵심어 MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, REQUIRED, 및 SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.
적합 문서는 4. 데이터 모델 절의 규범 요구 사항을 준수하는 데이터 모델의 모든 구체적 표현이다. 적합 처리기는 4. 데이터 모델 및 5. 알고리즘 절의 규범 요구 사항에 따라 적합 문서를 생성하거나 소비하는, 소프트웨어 및/또는 하드웨어로 실현된 모든 알고리즘이다.
적합 처리기는 부적합 문서가 소비될 때 오류를 생성해야 한다(MUST).
다음 용어는 이 문서 전반에서 사용된다. [VC-DATA-MODEL-2.0]에 정의된 용어는 그곳에 정의된 의미로 사용된다.
SHA-256(seedBytes || credentialHash)를 계산하고 그 출력의
최상위 증인 길이 비트를 취하여,
증인
시드와 자격 증명 해시에서 파생되는
고정 길이 의사난수 비트열.
credentialSubject가 WitnessList 유형이고
증인 목록 속성을 포함하는, WitnessListCredential 유형의
검증 가능
자격 증명.
credentialStatus에 나타날 수 있는(MAY)
WitnessListEntry 유형의 객체로, 명시적인
witnessListCredential 속성을 통해 참조되는
증인 목록 자격 증명 내 위치에
해당 자격 증명을 연결한다.
u)이며, JSON-LD 컨텍스트에서
https://w3id.org/security#multibase로 형식화된다.
credentialStatus 항목에서 추론되며,
상태 목록 인덱스가 증인 인덱스로 재사용된다.
credentialStatus 안에
증인 목록 항목을 포함하고,
해당 항목이
증인 목록 자격 증명과
증인 인덱스를 직접 참조하는 사용 모드.
증인 목록 자격 증명은
credentialSubject가 WitnessList 유형이고
증인
목록 속성
(witnessSeed, witnessLength,
witnessCount, 및 encodedWitnesses)을 직접 담는
검증 가능
자격 증명이다. 발급자는 증인 목록 자격 증명에 서명하기 위해
별도의 키 쌍을 사용해야 하며(SHOULD) — 양자 이후 서명 방식을 사용할 수 있다(MAY).
이는 그 제공하는 보호가 일반 서명 키가 손상된 뒤에도 검증될 수 있을 때에만
의미가 있기 때문이다.
자격 증명의 type 배열은
WitnessListCredential을 포함해야 한다(MUST).
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/vc-forgery-defense/v1rc1"
],
"id": "https://issuer.example/witnesses/1",
"type": ["VerifiableCredential", "WitnessListCredential"],
"issuer": "did:example:issuer",
"validFrom": "2024-01-15T00:00:00Z",
"credentialSubject": {
"type": "WitnessList",
"witnessSeed": "26ea4078-968d-4d98-aba7-695610c0dfb6",
"witnessLength": 128,
"witnessCount": 131072,
"encodedWitnesses": "uQYF16SSSbR_LrMZFbFvbGkn8B7ggEZtov3KVL..."
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-rdfc-2022",
"comment": "MAY use a post-quantum cryptosuite here",
"verificationMethod": "did:example:issuer#pq-key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z..."
}
}
WitnessListCredentials가 발급자에 의해
공간 제약이 있는 매체(예: 대형 자격 증명을 위한 웹)를 통해 배포될 때는,
이를 CBOR-LD로
인코딩하여 바이트로 전송하는 것이 권장된다(RECOMMENDED).
WitnessList의 credentialSubject는
다음 속성을 직접 포함해야 한다(MUST).
u)이며,
https://w3id.org/security#multibase로 형식화된다.
증인 인덱스 i의 증인은
(i − 1) × witnessLength부터
i × witnessLength − 1까지의 비트(포함)를
최상위 비트 우선 순서로 차지한다.
명시적 모드에서 사용될 때, 보호되는
검증 가능
자격 증명은 그
credentialStatus 배열에(또는 유일한
credentialStatus 값으로)
증인 목록
항목을 포함할 수 있다(MAY).
항목의 type은 WitnessListEntry이어야 한다(MUST).
Verifiable Credential Bitstring Status
List의
statusListCredential 속성 패턴을 따라, 이 항목은
명시적인 witnessListCredential 속성을 통해 그
증인 목록 자격 증명을 참조하며,
그 값은 해당 자격 증명의 URL이다. 항목의 id가 있는 경우,
이는 항목에 대한 선택적(OPTIONAL) 고유 식별자이며,
목록을 찾는 데 사용되지 않는다.
statusListCredential와 유사한 속성이다.
witnessCount를 초과해서는 안 된다(MUST NOT).
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/vc-forgery-defense/v1rc1"
],
"id": "https://issuer.example/credentials/1234",
"type": ["VerifiableCredential", "ExampleDegreeCredential"],
"issuer": "did:example:issuer",
"validFrom": "2024-01-15T00:00:00Z",
"credentialStatus": [
{
"id": "https://issuer.example/status/1#94567",
"type": "BitstringStatusListEntry",
"statusPurpose": "revocation",
"statusListIndex": "94567",
"statusListCredential": "https://issuer.example/status/1"
},
{
"type": "WitnessListEntry",
"witnessListCredential": "https://issuer.example/witnesses/1",
"witnessIndex": 94567
}
],
"credentialSubject": {
"id": "did:example:holder",
"degree": {"type": "BachelorDegree", "name": "Computer Science"}
},
"proof": { ... }
}
다음 알고리즘은 N개의 자격 증명 해시 집합에 대한 증인 목록을 생성한다. 입력: 원하는 witnessIndex 값의 순서대로 정렬된 N개의 해시 배열과 증인 길이 b (기본값 128). 출력: 증인 시드와 인코딩된 증인.
(i − 1) × b에 최상위 비트 우선으로 쓴다.
u를 앞에 붙인다
[MULTIBASE].
다음 알고리즘은 증인 목록 생성의 출력을 서명된 검증 가능 자격 증명으로 감싼다.
type에 WitnessListCredential 포함credentialSubject.type을 WitnessList로 설정credentialSubject.witnessSeed를
seed로 설정
credentialSubject.witnessLength를
b로 설정
credentialSubject.witnessCount를
N으로 설정
credentialSubject.encodedWitnesses를
encodedWitnesses로 설정
다음 알고리즘은 주어진 자격 증명의 증인이 유효한지 검증한다. 입력: 해석된 증인 목록 자격 증명, 자격 증명 해시, 그리고 증인 인덱스 i.
credentialSubject로 둔다.
.witnessSeed로 둔다..witnessLength로 둔다..witnessCount로 둔다..encodedWitnesses로 둔다.
u로 시작하는지 검증한다. 그렇지 않으면 오류를 반환한다.
(i − 1) × b부터
i × b − 1까지의 비트를 최상위 비트 우선으로 추출한다.
이를 storedW로 둔다.
valid를 반환한다. 그렇지 않으면 invalid를 반환한다.
암시적 모드에서는 보호되는 자격 증명이 수정되지 않는다.
증인 목록에 대한 어떤 참조도 자격 증명 자체에 나타나지 않는다.
검증자는 대역 외 정보 — 일반적으로 자격 증명의 기존
credentialStatus 항목에서 파생된 정보 — 를 사용하여
증인 목록을 찾고, 상태 목록 인덱스를
증인 인덱스로 재사용한다.
이 모드는 다음을 요구한다(REQUIRES).
BitstringStatusListEntry(또는 동등한 항목)가 있다.
// 보호되는 자격 증명은 다음을 가진다:
// credentialStatus.statusListCredential = "https://issuer.example/status/1"
// credentialStatus.statusListIndex = "94567"
// 검증자는 발급자 메타데이터에서 증인 목록 URL을 발견한다:
// GET https://issuer.example/.well-known/witness-lists
// -> { "https://issuer.example/status/1":
// "https://issuer.example/witnesses/1" }
// 증인 인덱스 = 94567 (상태 목록 인덱스와 동일)
// 실행: i = 94567로 Verify a Credential Witness
명시적 모드에서는 보호되는 자격 증명이
그 credentialStatus 안에
증인 목록 항목을 포함한다.
항목의 witnessListCredential 속성은
증인 목록 자격 증명 URL을 제공하고,
witnessIndex는 목록 내 1부터 시작하는 위치를 지정한다.
검색 메커니즘은 필요하지 않다.
명시적 모드는 다른 credentialStatus 항목
(예: 폐지를 위한 BitstringStatusListEntry)과 공존할 수 있다(MAY).
둘 다 있는 경우, witnessIndex가
상태 목록 인덱스와 같을 필요는 없다.
WitnessListEntry 유형의
credentialStatus 항목을 찾는다.
witnessListCredential 속성 값으로 둔다.
witnessIndex 값을 i로 사용하여
자격 증명 증인 검증을 실행한다.
독립형 모드에서는 증인 목록이 어떤 상태 목록 인프라와도 독립적으로 사용된다. 자격 증명에 대한 증인 인덱스의 할당은 특정 애플리케이션 또는 사용 사례에 의해 정의된다. 증인 목록 자격 증명은 자격 증명, 애플리케이션 계층 레코드 또는 외부 레지스트리에서 참조될 수 있다(MAY) — 참조 메커니즘은 이 명세의 범위를 벗어난다.
양자 능력을 갖춘 공격자는 기존(예: ECDSA) 공개 키에 대응하는 개인 키를 복구할 수 있다. 발급자가 증인 목록 자격 증명에 양자 이후 서명 방식으로 서명했다면, 그 목록에 있는 자격 증명의 서명 키가 깨진 뒤에도, 양자 이후 키가 안전하게 유지되는 한 검증자는 여전히 증인 목록을 신뢰할 수 있다.
발급자는 그 증인 목록 자격 증명이 포괄하는 자격 증명이 상당한 가치 또는 긴 유효 기간을 가질 때마다 증인 목록 자격 증명에 양자 이후 서명 방식으로 서명해야 한다(SHOULD).
증인
시드는 증인 목록 자격 증명의
credentialSubject에 나타나며,
증인 목록 자격 증명을 얻은 모든 당사자에게 보인다.
이는 의도된 설계이다 — 검증자는 증인을 다시 계산하기 위해 시드가 필요하다.
검증을 특정 검증자 집합으로 제한하려는 발급자는
증인 목록 자격 증명의 배포를 그에 맞게 제한해야 한다(SHOULD).
인덱스 i의 위조된 자격 증명은 2−b의 확률로 증인 검증을 통과한다. 여기서 b는 증인 길이이다. 기본값 b = 128에서 이 확률은 약 2.9 × 10−39이다.
구현은 b가 32보다 작은 값을 허용해서는 안 된다(MUST NOT). 상당한 가치가 있는 자격 증명에는 최소 64가 권장된다(RECOMMENDED).
증인은 일반적으로 충돌에 강한 방식으로 계산되어야 하며(SHOULD), 두 번째 원상 공격에 강한 방식으로 계산되어야 한다(MUST).
검증자는 그 내용을 신뢰하기 전에 증인 목록 자격 증명의 증명을 검증해야 한다(MUST). 검증자는 네트워크 노출 및 서비스 거부 위험을 줄이기 위해 해석된 증인 목록 자격 증명을 그 유효 기간 동안 캐시해야 한다(SHOULD).
목록이 포괄하는 발급된 검증 가능 자격 증명의 수에 정확히 맞춘 witnessCount를 사용하면, 발급자 프로세스에 관한 정보가 두 가지 방식으로 유출된다.
첫 번째 유출을 완화하기 위해, 발급자는 고정된 witnessCount 값을 사용해야 한다(SHOULD). 이를 통해 모든 증인 목록에서 총 증인 수가 변하지 않도록 하고, 임의 데이터 증인 자리표시자는 시간이 지남에 따라 VC에 대응하는 증인으로 대체된다.
이것은 첫 번째 유출을 완화하는 데 충분하다 - 그러나 공격자는 시간이 지남에 따라 어떤 증인 값이 바뀌는지 추적함으로써 여전히 얼마나 많은 증인이 "실제"인지, 그리고 얼마나 많은 VC가 발급되고 있는지 추적할 수 있다. 이를 해결하기 위해, 발급자는 WitnessListCredential을 갱신할 때마다 무작위 증인 시드를 다시 생성해야 한다(MUST).
게시된 증인 목록 자격 증명을 수정된 버전으로 교체할 수 있는 공격자는 위조 방지 메커니즘을 우회할 수 있다. 발급자는 무결성이 보호되는 채널을 통해 증인 목록 자격 증명을 게시해야 하며(MUST), 짧은 유효 기간과 빈번한 재발급을 함께 사용해야 한다(SHOULD).
발급자는 증인 목록 자격 증명의 유일한 작성자이며, 목록이 갱신될 때마다 증인 시드를 다시 생성해야 한다(REQUIRED) (7.5 발급자 정보 유출 참조). 따라서 발급자는 이전에 발급한 자격 증명을 부인할 수 있다. 즉, 해당 자격 증명의 증인이 없거나 변경된 새로운 증인 목록 자격 증명을 게시하면, 최신 목록에 대해 증인을 다시 계산하는 검증자는 불일치를 얻고, 그 밖에는 진짜인 자격 증명을 거부하게 된다. 위조와 달리, 이 동작은 정당한 발급자가 할 수 있으며 메커니즘만으로는 방지될 수 없다. 게시된 모든 목록이 유효하게 서명된 자격 증명이기 때문이다.
이후의 부인에도 발급의 증거가 유지되기를 요구하는 의존 당사자는,
자신들이 의존한
증인 목록 자격 증명을
그 증명 및 유효 기간과 함께 보관(캐시 또는 아카이브)해야 한다(SHOULD).
각
증인 목록 자격 증명은
validFrom 값을 가진 서명된
검증 가능
자격 증명
자체이므로,
부인 이전에 게시된 목록에 대해 검증된 자격 증명은
여전히 그 이전 목록 시점에 진짜였음을 보여줄 수 있다. 캐시된 서명 목록은
발급자가 그 시점에 해당 자격 증명을 증명했음을 보여주는 지속적인 증거이다.
게시된 목록에 대한 독립적인 아카이브, 공증 또는 투명성 로그 증인은
발급자의 게시 이력을 부인 불가능하게 만들어 이 보증을 강화한다.
witnessCount 값은 배치 내 자격 증명의 최대 수를 드러낸다.
발급자는 개별 보유자가 목록 내 위치로 식별되지 않도록
큰 집합 크기(최소 131072개 항목)를 사용해야 한다(MUST).
이러한 집합의 모든 슬롯은, 증인을 생성하는 데 사용된 해시가
검증 가능 자격 증명에 대응하는지 여부와 관계없이 채워져야 한다.
증인 목록 자격 증명을 가져오는 것은 검증이 발생하고 있음을 호스트에게 드러낼 수 있는 네트워크 요청을 생성한다. 검증자는 증인 목록 자격 증명을 캐시해야 하며(SHOULD), 목록을 가져올 때 개인정보 보호 보존 네트워크 전송을 사용할 수 있다(MAY). 발급자는 상관 가능성을 줄이기 위해 CDN 또는 콘텐츠 주소 지정 시스템을 통해 증인 목록을 제공해야 한다(SHOULD).
이 문서의 예제는 vc-forgery-defense JSON-LD
컨텍스트의 v1rc1 버전을 참조한다.
이 컨텍스트는 참고를 위해 아래에 재현되어 있다.
{
"@context": {
"@protected": true,
"id": "@id",
"type": "@type",
"WitnessListCredential": "https://w3id.org/vc-forgery-defense#WitnessListCredential",
"WitnessList": "https://w3id.org/vc-forgery-defense#WitnessList",
"WitnessListEntry": "https://w3id.org/vc-forgery-defense#WitnessListEntry",
"witnessSeed": {
"@id": "https://w3id.org/vc-forgery-defense#witnessSeed"
},
"encodedWitnesses": {
"@id": "https://w3id.org/vc-forgery-defense#encodedWitnesses",
"@type": "https://w3id.org/security#multibase"
},
"witnessLength": {
"@id": "https://w3id.org/vc-forgery-defense#witnessLength",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessCount": {
"@id": "https://w3id.org/vc-forgery-defense#witnessCount",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessIndex": {
"@id": "https://w3id.org/vc-forgery-defense#witnessIndex",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessListCredential": {
"@id": "https://w3id.org/vc-forgery-defense#witnessListCredential",
"@type": "@id"
}
}
}
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: