Controlled Identifiers v1.0

W3C Recommendation

More details about this document
This version:
https://www.w3.org/TR/2025/REC-cid-1.0-20250515/
Latest published version:
https://www.w3.org/TR/cid-1.0/
Latest editor's draft:
https://w3c.github.io/cid/
History:
https://www.w3.org/standards/history/cid-1.0/
Commit history
Implementation report:
https://w3c.github.io/cid/implementations/1.0/
Editors:
Manu Sporny (Digital Bazaar)
Michael B. Jones (Invited Expert)
Authors:
Dave Longley (Digital Bazaar)
Manu Sporny (Digital Bazaar)
Markus Sabadello (Danube Tech)
Drummond Reed (Evernym/Avast)
Orie Steele (Transmute)
Christopher Allen (Blockchain Commons)
Feedback:
GitHub w3c/cid (pull requests, new issue, open issues)
public-vc-wg@w3.org with subject line [cid-1.0] … message topic … (archives)
Errata:
Errata exists.
Related Specifications
Decentralized Identifiers v1.0
The Verifiable Credentials Data Model v2.0
Data Integrity v1.0
Securing Verifiable Credentials using JOSE and COSE

See also translations.


이 문서는 W3C Controlled Identifiers v1.0의 한국어 번역본입니다.

이 문서에 오역 및 오타를 포함할 수 있습니다. 영어 원문만이 공식적이고 규범적인 효력을 가지고 있습니다. 문의나 개선사항은 깃헙 링크lukas.j.han@gmail.com로 연락주시기 바랍니다.

원문작성일: 2025-05-15
최초번역일: 2026-07-17
최종수정일: 2026-07-18

편집자 (가나다순):
한종호 (Hopae S.A.)

요약

제어 식별자 문서(controlled identifier document)는 암호학적 자료를 담고, 어떤 식별자의 제어자(controller)로부터의 암호학적 증명을 검증하고 그 제어자와 상호작용할 목적으로 서비스 엔드포인트를 나열한다.

현재 문서의 상태

이 절은 발행 시점의 이 문서의 상태를 기술한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/ 의 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 규격에 대한 의견은 언제든 환영한다. 이슈는 GitHub에 직접 올리거나, 그것이 불가능하면 public-vc-comments@w3.org로 보내주기 바란다. (구독, 아카이브).

이 문서는 Verifiable Credentials Working Group권고안 트랙(Recommendation track)을 사용하여 권고안(Recommendation)으로 발행하였다.

W3C는 이 규격을 웹의 표준으로 널리 배포할 것을 권장한다.

W3C 권고안이란 폭넓은 합의 형성을 거쳐 W3C와 그 회원사가 승인하고, 워킹 그룹 구성원들이 구현에 대해 로열티 없는 라이선스를 제공하기로 약속한 규격이다.

이 문서는 W3C 특허 정책(Patent Policy) 아래 운영되는 그룹이 작성하였다. W3C는 그 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지한다. 그 페이지에는 특허를 공개하는 방법에 대한 안내도 포함되어 있다. 필수 청구항(Essential Claim)을 포함한다고 믿는 특허를 실제로 알고 있는 개인은 W3C 특허 정책 6절에 따라 그 정보를 공개해야 한다.

이 문서는 2023년 11월 3일자 W3C 프로세스 문서(Process Document)의 적용을 받는다.

1. 소개

이 부분은 비규범적입니다.

제어 식별자 문서주체를 식별하고, 인증, 어테스테이션(attestation), (암호화를 위한) 키 합의, 역량 호출과 위임 같은 특정 목적을 위해 주체를 대신하여 생성된 증명을 검증하는 데 쓰이는, 공개키와 같은 공개 암호학적 자료를 표현하는 검증 방법을 제공한다. 제어 식별자 문서는 또한 식별자와 관련된 서비스 엔드포인트를 나열한다. 예를 들어 검증을 위한 추가 정보를 요청할 수 있는 곳이다.

다시 말해, 제어 식별자 문서는 어떤 식별자의 제어자와 통신하고/하거나 그 제어자가 특정 행위를 취했음을 증명하는 데 필요한 정보를 담으며, 여기에는 증명을 위한 자료와 추가 통신을 위한 서비스 엔드포인트가 포함된다.

제어 식별자 문서는 단일 식별자에 대한 검증 관계서비스 엔드포인트를 명시하며, 그 식별자에 대해서는 현재의 제어 식별자 문서가 권위를 갖는 것으로 간주된다.

Decentralized Identifiers (DIDs) v1.0 규격과 같은 다른 규격들은 이 규격에서 정의한 기능들을 프로파일링하여, 그중 일부의 사용을 요구하거나 권장하고 다른 일부의 사용을 금지하거나 폐기한다.

1.1 사용 사례

아래의 사용 사례들은 이 규격의 필요성을 보여준다. Use Cases and Requirements for Decentralized IdentifiersVerifiable Credentials Use Cases에 있는 것들처럼 관련된 다른 사용 사례도 많이 존재하지만, 아래에 기술한 것들이 이 규격이 다루고자 설계된 주요 시나리오다.

전역적으로 고유한 식별자

Lemmy는 다양한 조직에서 일하는 사람들이 제출한 대량의 민감한 데이터를 관리하는 여러 기업용 포털을 운영한다. 그는 데이터베이스 안의 엔티티에 대해, 자신의 고객이 제공하며 이메일 주소나 비밀번호처럼 피싱당하기 쉬운 정보에 의존하지 않는 식별자를 쓰고 싶어 한다.

암호학적 검증

Lemmy는 각 조직의 데이터에 접근하고 갱신할 수 있는 주체와 관련한 보안을 높이기 위해, 자신의 고객이 자신의 식별자에 대한 제어권을 — 예를 들어 공개키/개인키 암호화를 사용해 — 증명하도록 보장하고 싶어 한다.

암호학적 목적

고보안 서비스를 운영하는 Stef는 각 암호 키 유형마다 서로 다른 수준의 접근과 보호를 가능하게 하기 위해, 자신의 고객이 사용하는 특정 암호 키가 특정 목적(예: 암호화, 인가, 인증)으로만 사용될 수 있도록 보장하고 싶어 한다.

서비스 이용

소프트웨어 개발자인 Marge는 자신의 전역적으로 고유한 식별자를 기반으로, 웹의 다른 사람들이 자신이 사용하는 다양한 통신 서비스를 통해 자신에게 연락할 수 있는 방법을 공개적으로 알리고 싶어 한다.

확장성

시스템 아키텍트인 Cory는 다른 사람들이 추가하는 확장과 충돌을 일으키지 않으면서 새로운 기능을 제공하는 방식으로, 이 절에서 기술한 사용 사례를 확장하고 싶어 한다.

클레임 발급과 제시

Neru는 자신의 회사를 대신하여 직원에 관한 클레임을 담은 디지털 크리덴셜을 발급하고 싶어 한다. 이때 제기되는 클레임은 암호학적으로 Neru의 회사로 귀속될 수 있는 식별자를 사용해야 하며, 그 크리덴셜의 보유자가 크리덴셜을 제시할 때 자신을 암호학적으로 인증할 수 있도록 해야 한다.

1.2 요구사항

다음 요구사항들은 이 규격 앞부분에서 기술한 사용 사례로부터 도출된 것이다. 더욱 탈중앙화된 해법으로 이어질 수 있는 추가 요구사항은 Use Cases and Requirements for Decentralized Identifiers에서 찾을 수 있다.

1. 고유성이 보장된 식별자
식별자는 중복 가능성 없이 전역적으로 고유하다.
2. 제어권 증명
식별자에 대한 제어를 주장하는 엔티티가 실제로 그 제어자임을 증명할 수 있다.
3. 연관된 암호학적 자료
식별자는 엔티티가 그 식별자에 대한 제어를 증명하는 데 사용할 수 있는 암호학적 자료와 긴밀하게 결합되어 있다.
4. 간소화된 키 교체
지정된 식별자가 가리키는 엔티티는 요청 당사자의 직접적인 개입 없이 최소한의 개별 상호작용만으로 인증 자료를 갱신할 수 있다.
5. 서비스 엔드포인트 탐색
이러한 식별자는 요청 당사자가 식별자의 주체와 상호작용하기 위해 이용 가능한 서비스 엔드포인트를 조회할 수 있게 한다.
6. 제어권의 위임
식별자의 제어자는 그 제어권을 전부 또는 일부 제3자에게 위임할 수 있다.
7. 암호학적 미래 대비
이러한 식별자와 그에 연관된 정보는 기술이 발전함에 따라 갱신될 수 있다. 현재의 암호 기법은 양자 계산 공격에 취약한 것으로 알려져 있다. 미래 대비가 된 식별자는 갱신된 첨단 인증 및/또는 인가 기술로 동일한 식별자를 계속 사용할 수 있는 수단을 제공한다.
8. 암호학적 인증과 통신
이러한 식별자는 대체로 공개키-개인키 쌍을 사용하여, 개인을 인증하거나 식별자의 주체와의 통신을 보호하는 데 활용할 수 있는 암호 기법의 사용을 가능하게 한다.
9. 법적으로 인정 가능한 식별
이러한 식별자는 하나 이상의 관할권에서 법적으로 유효하다고 인정될 수 있는 크리덴셜과 거래의 기반으로 사용될 수 있다.
10. 인간 중심의 상호 운용성
탈중앙 식별자는 기술적 전문성이나 전문 지식이 없는 사람도 쉽게 사용할 수 있어야 한다.

1.3 적합성

비규범적이라고 표시된 절뿐 아니라, 이 규격의 모든 저작 지침, 다이어그램, 예시, 참고(note)도 비규범적이다. 이 규격의 그 밖의 모든 것은 규범적이다.

이 문서의 핵심 단어 MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, REQUIRED, SHOULD는 여기에 표시된 것처럼 모두 대문자로 나타날 때에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.

적합 제어 식별자 문서란 데이터 모델을 구체적으로 표현한 것 중 2. 데이터 모델 절과 4. 컨텍스트와 어휘 절의 관련 규범적 요구사항을 따르는 모든 것이다.

적합 검증 방법이란 데이터 모델을 구체적으로 표현한 것 중 2.2 검증 방법 절과 4. 컨텍스트와 어휘 절의 관련 규범적 요구사항을 따르는 모든 것이다.

적합 문서적합 제어 식별자 문서이거나 적합 검증 방법이다.

적합 프로세서3. 알고리즘 절의 관련 규범적 진술에 따라 적합 문서를 생성하거나 소비하는, 소프트웨어 및/또는 하드웨어로 구현된 모든 알고리즘이다. 적합 프로세서는 적합하지 않은 문서를 소비할 때 오류를 생성해야 한다.

1.4 용어

이 절은 이 규격에서 사용하는 용어를 정의한다. 이 용어 중 하나가 이 규격에 나타날 때마다 관련 정의로의 링크가 포함된다.

인증(authentication)
엔티티가 특정 속성을 가지고 있거나 특정 비밀을 제어하고 있음을 검증자에게 증명할 수 있는 과정.
인가(authorization)
엔티티가 특정 활동을 수행하도록 허용되어 있음을 검증자에게 증명할 수 있는 과정.
제어 식별자(controlled identifier)

어떤 엔티티의 제어 아래에 있음을 증명할 수 있는 유형의 식별자.

제어 식별자 문서(controlled identifier document)

암호학적 자료를 담고, 어떤 식별자의 제어자로부터의 증명을 검증하고 그 제어자와 상호작용하는 데 사용할 수 있는 서비스 엔드포인트를 나열하는 문서.

제어자(controller)

제어 식별자 문서를 갱신하거나 검증 방법을 사용하여 증명을 생성하는 것과 같이, 특정 자원에 대해 어떤 행위를 수행할 수 있는 엔티티.

암호 스위트(cryptographic suite)
특정 보안 목표를 달성하기 위해 특정 암호 프리미티브를 사용하는 수단. 이러한 스위트는 검증 방법, 디지털 서명 유형, 그것들의 식별자, 그리고 기타 관련 속성을 명시할 수 있다.
개인키(private key)
증명을 생성하는 데 사용할 수 있는 암호학적 자료.
증명(proof)
어떤 주장의 유효성을 확인해 주는 수학적 논증. 그 논증은 검증자가 그 주장의 유효성을 암호학적으로 확인할 수 있게 하는 속성과 값의 집합으로 이루어진다. 디지털 서명은 증명의 한 유형이다.
공개키(public key)
대응하는 개인키로 생성된 증명을 검증하는 데 사용할 수 있는 암호학적 자료.
주체(subject)

제어 식별자 문서에서 id 속성의 값이 가리키는, 사람·그룹·조직·물리적 사물· 디지털 사물·논리적 사물과 같은 엔티티. 제어 식별자 문서에서 식별된 주체는 인증 중이나 검증가능한 크리덴셜에서와 같이 다른 맥락에서도 주체로 사용된다.

검증 방법(verification method)

증명을 독립적으로 검증하는 데 사용되는 방법과 그 매개변수. 예를 들어 암호학적 공개키는 디지털 서명과 관련하여 검증 방법으로 사용될 수 있다. 그러한 사용에서 그것은 서명자가 연관된 암호학적 개인키를 사용했음을 검증한다.

검증 관계(verification relationship)

하나 이상의 검증 방법주체를 대신하여 만들어진 증명을 검증하도록 인가되었다는 표현. 검증 관계의 한 예는 2.3.1 인증이다.

2. 데이터 모델

제어 식별자 문서식별자검증 방법 및/또는 서비스 엔드포인트 집합 사이의 하나 이상의 관계를 명시한다. 제어 식별자 문서는 특정 목적을 위해 특정 검증 방법의 사용을 명시적으로 허용하는 검증 관계를 포함하는 것이 좋다.

예시 1: Multikey를 사용한 JSON-LD 형식의 제어 식별자 문서
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "authentication": [{
      "id": "https://controller.example#authn-key-123",
      "type": "Multikey",
      "controller": "https://controller.example",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }]
}

위 예시는 Multikey 형식을 사용하여 인증 목적으로 사용할 수 있는 공개키를 표현하는 유효한 JSON-LD 제어 식별자 문서를 보여준다.

예시 2: JsonWebKey를 사용한 JSON 형식의 제어 식별자 문서
{
  "id": "https://controller.example/101",
  "verificationMethod": [{
    "id": "https://controller.example/101#key-20240828",
    "type": "JsonWebKey",
    "controller": "https://controller.example/101",
    "publicKeyJwk": {
      "kid": "key-20240828",
      "kty": "EC",
      "crv": "P-256",
      "alg": "ES256",
      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
    }
  }],
  "authentication": ["#key-20240828"]
}

위 예시는 JsonWebKey 형식을 사용하여 인증 목적으로 사용할 수 있는 공개키를 표현하는 유효한 JSON 제어 식별자 문서를 보여준다.

참고: 서로 다른 타입의 맵에서 사용되는 속성 이름

속성 이름 id, type, controller는 제약이 서로 다를 수 있는 여러 타입의 맵에 나타날 수 있다.

2.1 제어 식별자 문서

다음 절들은 제어 식별자 문서의 속성들을, 그 속성이 필수인지 선택인지를 포함하여 정의한다. 이 속성들은 주체와 속성 값 사이의 관계를 기술한다.

다음 표들은 이 규격이 정의하는 핵심 속성에 대한, 기대되는 값과 필수 여부를 담은 비규범적 참고 자료다. 표 안의 속성 이름은 각 속성의 규범적 정의와 더 자세한 설명으로 연결된다.

속성 필수 여부 값 제약 정의
id URL 구문을 따르는 문자열. 2.1.1 주체
controller 아니요 문자열, 또는 각각이 URL 구문을 따르는 문자열집합. 2.1.2 제어자
alsoKnownAs 아니요 각각이 URL 구문을 따르는 문자열집합. 2.1.3 별칭(Also Known As)
service 아니요 서비스 집합. 2.1.4 서비스
verificationMethod 아니요 검증 방법 집합. 2.2 검증 방법
authentication 아니요 각각이 URL 구문을 따르는 문자열집합, 또는 검증 방법 집합. 2.3.1 인증
assertionMethod 아니요 각각이 URL 구문을 따르는 문자열집합, 또는 검증 방법 집합. 2.3.2 어써션(Assertion)
keyAgreement 아니요 각각이 URL 구문을 따르는 문자열집합, 또는 검증 방법 집합. 2.3.3 키 합의
capabilityInvocation 아니요 각각이 URL 구문을 따르는 문자열집합, 또는 검증 방법 집합. 2.3.4 역량 호출(Capability Invocation)
capabilityDelegation 아니요 각각이 URL 구문을 따르는 문자열집합, 또는 검증 방법 집합. 2.3.5 역량 위임(Capability Delegation)

2.1.1 주체

주체제어 식별자 문서에서 id 속성을 사용하여 표현된다. id 속성의 값을 식별자라고 부른다.

id
id 속성의 값은 URL Standard의 규칙을 따르는 문자열어야 한다.

제어 식별자 문서최상위 id 값을 포함해야 한다.

예시 3: `id` 속성의 사용
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "authentication": [{
      "id": "https://controller.example#authn-key-123",
      "type": "Multikey",
      "controller": "https://controller.example",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }]
}

제어 식별자 문서최상위 에 있는 id 속성의 값을 그 제어 식별자 문서기본 식별자라고 부른다. 주어진 식별자에 대해 현재의 권위 있는 제어 식별자 문서를 가져오는 데 쓰이는 URL을 그 제어 식별자 문서정규 URL이라고 부른다. 정규 URL을 역참조하면 현재의 권위 있는 제어 식별자 문서가 반환되어야 한다. 반환된 문서의 기본 식별자정규 URL과 같아야 한다. 그 밖의 값이라면 반환된 문서는 권위 있는 제어 식별자 문서가 아니며 그 식별자는 무효로 취급되는 것이 좋다. 모든 제어 식별자 문서는 그 문서의 정규 URL에 따라 저장되고 검색되며, 그 URL은 그 문서의 기본 식별자이기도 해야 한다.

참고: 식별자는 맥락에 따라 달라진다

제어 식별자 문서에서 id가 가리키는 주체는 시간이 지나도 일관되어, 그것을 사용하는 어떤 검증가능한 크리덴셜이든 동일한 엔티티를 가리키는 것으로 해석될 수 있으리라 기대된다. 예를 들어, 검증가능한 크리덴셜발급자가 그 식별자주체로 하는 크리덴셜을 발급하기 전에, 주체가 자신의 식별자에 대한 제어의 증명을 보이도록 요구하는 것이 바람직하다. 이는 그 식별자주체로 하는 각 크리덴셜의 발급에 동일한 엔티티가 관여했다는 확신을 만들어낸다.

그러나 그러한 관행이 불가능하거나 불합리한 정당한 경우들이 있다. 예를 들어 부모가 자녀를 위해 검증가능한 크리덴셜을 요청하는 경우다. 또한 발급자가 단순히 실수를 하거나 의도적으로 거짓 진술을 발급하는 경우도 있다. 특정 목적을 위해 주어진 식별자에 의존하는 것의 보안적 영향을 평가할 때 이 모든 가능성이 고려된다. 5.2 식별자 모호성 절을 참고하라.

2.1.2 제어자

제어 식별자 문서제어자란 그 제어 식별자 문서를 변경할 수 있는 모든 엔티티다. 제어자 문서의 정규 URL을 역참조하여 반환되는 자원의 내용을 갱신할 수 있는 자는, 정의상 그 문서와 그 문서의 정규 식별자의 제어자다. 제어 식별자 문서검증 방법을 충족하는 증명은 그 식별자제어자가 그 증명을 생성했다는 암호학적 확신으로 받아들여진다.

참고: 식별자 제어자 대 문서 제어자

제어 식별자 문서제어자는 그 문서의 정규 식별자, 곧 그 URL의 제어자로 간주된다. 즉, 제어 식별자 문서를 갱신할 수 있는 자는 문서 제어자이면서 동시에 식별자 제어자다. 문서를 갱신하는 것이 곧 식별자를 제어하는 방법이다. 이 용어들은 서로 바꿔 쓸 수 있다. 어떤 식별자의 정규 제어 식별자 문서를 제어하는 것은 그 식별자를 제어하는 것과 같다.

controller
controller 속성은 선택 사항이다. 문서의 정당한 제어자를 URL로 표현하는 것이 가능하다면, 그 문서는 그 제어자를 식별하는 URL을 나열하는 것이 좋다.
참고: 추정된 제어

제어 식별자 문서제어자가 아닌 다른 누군가의 통제 아래에 기능적으로 놓인 검증 방법을 나열하는 것도 가능하다. 예를 들어 문서 제어자는 다른 당사자의 통제 아래에 있는 공개키를 인증 검증 방법으로 설정할 수 있다. 이렇게 하면 (그 당사자의 공개키가 인증 검증 방법에 나열되어 있으므로) 그 당사자가 이 식별자를 대신하여 인증할 수 있게 되지만, 그 당사자가 제어 식별자 문서를 갱신할 수 있게 되지는 않는다. 그러나 문서 제어자가 그 키를 인증용으로 명시적으로 나열했으므로, 해당 증명은 그들의 명시적 수임자가 생성한 것이므로 문서 제어자가 생성한 것으로 받아들여진다. 이는 "다른 당사자"가 문서 제어자의 통제 아래에 있으면서도 별개의 암호학적 권한을 가진 기기일 때, 즉 자체 키 저장소를 가지고 증명을 생성할 수 있을 때 특히 유용하다. 그 패턴은 서로 다른 기기들이 각각 자신의 암호학적 자료를 사용하여, 식별자의 제어자가 생성한 증명으로 받아들여지는 검증가능한 증명을 생성할 수 있게 한다.

존재한다면 그 값은 문자열, 또는 각각이 URL Standard의 규칙을 따르는 문자열집합어야 한다.

controller 속성의 각 항목은 제어 식별자 문서의 정규 버전을 갱신할 수 있는 엔티티를 식별해야 한다. 이 제어 식별자 문서에 대한 이후의 요청은 그 정규 위치를 통해 항상 최신 버전을 받게 된다.

controller 속성이 존재하지 않으면, 문서에 대한 제어는 전적으로 그 저장 위치에 의해 결정된다.

예시 4: controller 속성을 가진 제어 식별자 문서
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controllerA.example",
  "controller": "https://controllerB.example/abc",
  "authentication": [{
      "id": "https://controllerA.example#authn-key-123",
      "type": "Multikey",
      "controller": "https://controllerA.example",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }]
}

제어자에 사용되는 식별자는 모호하지 않지만, 이것이 항상 단일 엔티티가 제어자임을 뜻하지도, 제어자가 식별자를 하나만 가짐을 뜻하지도 않는다. 제어자는 단일 엔티티일 수도 있고, 파트너십과 같은 엔티티의 집합일 수도 있다. 제어자는 또한 프라이버시나 조직 내 운영 경계 구분과 같은 목적으로 자신을 가리키는 데 여러 식별자를 사용할 수도 있다. 마찬가지로 제어자는 많은 검증 방법을 제어할 수도 있다. 이러한 이유로, 제어자가 단일 엔티티이거나 단일 검증 방법만 제어한다고 가정해서는 안 된다.

참고: 인증 대 인가

인증의 정의는 인가의 정의와 다르다는 점에 유의하라. 일반적으로 말해 인증은 "이 사람이 누구인지 우리가 아는가?"라는 질문에 답하는 반면, 인가는 "그들이 이 행위를 수행하도록 허용되어 있는가?"라는 질문에 답한다. 이 규격의 authentication 속성은 예상대로 인증을 수행하는 데 사용되고, capabilityDelegationcapabilityInvocation 같은 다른 검증 관계인가를 수행하는 데 사용된다. 인가를 성공적으로 수행하는 것은 시스템에 더 심각한 영향을 미칠 수 있으므로, 제어자인증을 수행할 때와 인가를 수행할 때 서로 다른 검증 방법을 사용하고, 인가에 사용되는 검증 방법인증에 사용되는 것보다 더 강한 접근 보호를 제공할 것을 강력히 권한다. 위협 모델과 공격 벡터에 관한 정보는 5. 보안 고려사항을 참고하라.

2.1.3 별칭(Also Known As)

주체는 서로 다른 목적으로 또는 서로 다른 시점에 사용되는 여러 식별자를 가질 수 있다. 둘 이상의 식별자(또는 다른 유형의 URI)가 동일한 주체를 가리킨다는 주장은 alsoKnownAs 속성을 사용하여 할 수 있다.

alsoKnownAs
alsoKnownAs 속성은 선택 사항이다. 존재한다면 그 값은 집합의 각 항목이 [RFC3986]을 따르는 URI인 집합어야 한다.

이 관계는 이 식별자의 주체가 하나 이상의 다른 식별자로도 식별된다는 진술이다.

예시 5: alsoKnownAs 속성을 사용하는 제어 식별자 문서
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "alsoKnownAs": [
    "https://someOtherIdentifier.example/xyz",
    "https://yetAnotherIdentifier.example/987"
  ],
  "authentication": [{
      "id": "https://controller.example#authn-key-123",
      "type": "Multikey",
      "controller": "https://controller.example",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }]
}
참고: 동등성과 alsoKnownAs

애플리케이션은 한 주체의 제어 식별자 문서에 표현된 alsoKnownAs 관계가 다른 주체의 제어 식별자 문서에서도 역방향으로(즉, 상호적으로) 표현되어 있을 때에 한해, alsoKnownAs로 연결된 두 식별자를 동등하다고 간주하기로 선택할 수 있다. 이러한 상호 관계가 없을 때 그것들을 동등하다고 간주하지 않는 것이 모범 사례다. 다시 말해, alsoKnownAs 주장이 존재한다고 해서 그 주장이 참임이 증명되는 것은 아니다. 따라서 요청 당사자는 alsoKnownAs 주장에 대해 독립적인 검증을 얻을 것을 강력히 권한다.

주체가 강화된 프라이버시 보호와 같은 서로 다른 목적으로 서로 다른 식별자를 사용할 수 있다는 점을 고려하면, 두 식별자 사이의 강한 동등성을 기대하거나, 대응하는 두 제어 식별자 문서의 정보를 병합하는 조치를 취하는 것은, 상호 관계가 있더라도 반드시 적절한 것은 아니다.

2.1.4 서비스

서비스제어 식별자 문서에서 제어되는 식별자와 관련하여 제어자 또는 연관된 엔티티와 통신하는 방법을 표현하는 데 사용된다. 서비스제어자가 추가적인 탐색, 인증, 인가, 상호작용을 위해 알리고자 하는 어떤 유형의 서비스든 될 수 있다.

프라이버시 우려로 인해, 소셜 미디어 계정, 개인 웹사이트, 이메일 주소와 같은 공개 정보를 서비스를 통해 노출하는 것은 권장되지 않는다. 프라이버시 우려에 대한 추가 논의는 6.1 개인 데이터를 비공개로 유지하기 절과 6.6 서비스 프라이버시 절에서 찾을 수 있다. 서비스에 연관된 정보는 흔히 서비스마다 다르다. 예를 들어 암호화된 메시징 서비스에 연관된 정보는 메시징이 시작되기 전에 암호화된 링크를 개시하는 방법을 표현할 수 있다.

서비스service 속성을 사용하여 표현되며, 아래에 설명되어 있다:

service

service 속성은 선택 사항이다. 존재한다면 연관된 값은 각 서비스가 으로 기술되는 서비스집합어야 한다. 각 서비스 id, type, serviceEndpoint 속성을 포함해야 한다. 각 서비스 확장은 추가 속성을 포함할 수 있고, 그 확장에 연관된 속성을 더 제한할 수도 있다.

id
id 속성은 선택 사항이다. 존재한다면 그 값은 URL Standard를 따르는 URL이어야 한다. 적합 문서는 동일한 id를 가진 service 항목을 여러 개 포함해서는 안 된다.
type
type 속성은 필수다. 그 값은 문자열 또는 문자열집합어야 한다. 상호 운용성을 극대화하기 위해, 서비스 타입과 그에 연관된 속성은 Verifiable Credential Extensions에 등록되는 것이 좋다.
serviceEndpoint
serviceEndpoint 속성은 필수다. serviceEndpoint 속성의 값은 단일 문자열, 단일 , 또는 하나 이상의 문자열 및/또는 으로 구성된 집합어야 한다. 각 문자열 값은 URL Standard를 따르는 유효한 URL이어야 한다.

서비스와 관련된 프라이버시 및 보안 고려사항에 대한 더 자세한 정보는 6.6 서비스 프라이버시, 6.1 개인 데이터를 비공개로 유지하기, 6.4 제어 식별자 문서 상관관계 위험, 5.11 인증 및 인가를 위한 서비스 엔드포인트를 참고하라.

예시 6: service 속성의 사용
{
  "id": "https://controller.example",
  "authentication": [{
      "id": "https://controller.example#authn-key-123",
      "type": "Multikey",
      "controller": "https://controller.example",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }],
  "service": [{
    "type": "https://social.example/ExampleSocialMediaService",
    "serviceEndpoint": "https://warbler.example/sal674"
  }]
}

2.2 검증 방법

제어 식별자 문서는 암호학적 공개키와 같은 검증 방법을 표현할 수 있으며, 이는 제어자나 연관 당사자와의 상호작용을 인증하거나 인가하는 데 쓰이는 것과 같은 증명을 검증하는 데 사용될 수 있다. 예를 들어 암호학적 공개키는 디지털 서명과 관련하여 검증 방법으로 사용될 수 있으며, 그러한 사용에서 그것은 서명자가 연관된 암호학적 개인키를 사용할 수 있었음을 검증한다. 검증 방법은 여러 매개변수를 받을 수 있다. 그 예로, 다섯 개의 암호 키 중 임의의 세 개가 암호학적 임계값 서명에 기여해야 하는 경우를 들 수 있다.

"검증"과 "증명"은 넓게 적용되도록 의도되었다. 예를 들어 암호학적 공개키는 Diffie-Hellman 키 교환 과정에서 암호화를 위한 공유 대칭키를 협상하는 데 사용될 수 있다. 이는 키 합의 과정의 무결성을 보장한다. 따라서 그 과정에 대한 설명이 "검증"이나 "증명"이라는 단어를 사용하지 않더라도, 그것은 또 다른 유형의 검증 방법이다.

검증 방법제어 식별자 문서에서 아래의 을 사용하여 정의되며, 이를 검증 방법 정의라고 부른다:

verificationMethod

verificationMethod 속성은 선택 사항이다. 존재한다면 그 값은 각 검증 방법으로 표현되는 검증 방법집합어야 한다. 검증 방법 id, type, controller, 그리고 type 값에 의해 결정되고 2.2.1 검증 자료에 정의된 특정 검증 자료 속성을 포함해야 한다. 검증 방법은 추가 속성을 포함할 수 있다.

id

검증 방법id 속성 값은 [URL] 구문을 따르는 문자열어야 한다. 이 값을 검증 방법 식별자라고 부르며, 증명 안에서 특정 검증 방법 인스턴스, 곧 검증 방법 정의를 가리키는 데에도 사용될 수 있다.

type
type 속성의 값은 정확히 하나의 검증 방법 타입을 참조하는 문자열어야 한다. 이 규격은 JsonWebKey(2.2.3 JsonWebKey 절 참고)와 Multikey(2.2.2 Multikey 절 참고) 타입을 정의한다.
controller
controller 속성의 값은 [URL] 구문을 따르는 문자열어야 한다.
expires
expires 속성은 선택 사항이다. 제공된다면, 그 값은 검증 방법의 사용이 언제 중단되는 것이 좋은지를 지정하는 [XMLSCHEMA11-2] dateTimeStamp 문자열이어야 한다. 값이 한 번 설정되면 갱신되지 않을 것으로 기대되며, 그 값에 의존하는 시스템은 만료 시점 또는 그 이후에 검증 방법에 연관된 어떤 증명도 검증하지 않을 것으로 기대된다.
revoked
revoked 속성은 선택 사항이다. 존재한다면, 그 값은 검증 방법이 언제 사용되어서는 안 되는지를 지정하는 [XMLSCHEMA11-2] dateTimeStamp 문자열이어야 한다. 값이 한 번 설정되면 갱신되지 않을 것으로 기대되며, 그 값에 의존하는 시스템은 폐기 시점 또는 그 이후에 검증 방법에 연관된 어떤 증명도 검증하지 않을 것으로 기대된다.
예시 7: 검증 방법 구조 예시
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "verificationMethod": [{
    "id": "https://controller.example#authn-key-123",
    "type": "Multikey",
    "controller": "https://controller.example",
    "expires": "2025-12-01T00:00:00Z",
    "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }, {
    "id": "https://controller.example/101#key-20240828",
    "type": "JsonWebKey",
    "controller": "https://controller.example/101",
    "revoked": "2024-12-10T15:28:32Z",
    "publicKeyJwk": {
      "kid": "key-20240828",
      "kty": "EC",
      "crv": "P-256",
      "alg": "ES256",
      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
    }
  }]
}
참고: `controller` 속성은 여러 객체에서 사용된다

controller 속성은 2.1 제어 식별자 문서 절에 기술된 대로 제어 식별자 문서에서 사용되고, 2.2 검증 방법 절에 기술된 대로 검증 방법에서도 사용된다. 어느 쪽에서 사용되든 그 목적은 본질적으로 같다. 즉, 그것이 연관된 자원과 관련한 특정 행위를 수행하도록 인가된 하나 이상의 엔티티를 표현한다. 다만, 검증 방법의 경우 그것은 제어 식별자 문서controller가 한 주장에 불과하며, 이 주장이 반드시 참인 것은 아니라는 점에 유의하라. 즉 거짓일 수도 있다. 검증 방법이 특정 제어자에 결속되어 있음을 보장하려면, 검증 방법의 표현에서 그것의 제어 식별자 문서로 이동한 다음, 후자가 검증 방법과 그 제어자 양쪽에 대한 참조를 담고 있는지 검증해야 한다. 적절한 결속이 검증됨을 보장하는 알고리즘은 3.3 검증 방법 조회 절을 참고하라.

제어 식별자 문서제어자는 문서의 내용을 갱신할 수 있다. (누가 제어자라고 주장되든 상관없이) 오직 검증 방법의 실제 제어자만이 그 방법을 충족하는 증명을 생성할 수 있다.

명시적인 보안 보장을 위해, 검증 방법제어자제어 식별자 문서로부터 추론될 수 없다. 검증 방법controller 값이 제어 식별자 문서controller 값과 반드시 같은 것은 아니므로, 키의 제어자의 식별자를 명시적으로 표현하는 것이 필요하다.

2.2.1 검증 자료

검증 자료란 검증 방법을 적용하는 과정에서 사용되는 모든 정보다. 검증 방법type은 그러한 과정과의 호환성을 판단하는 데 사용될 것으로 기대된다. 검증 방법의 예로 JsonWebKeyMultikey가 있다. 암호 스위트 규격은 검증 방법 type과 그에 연관된 검증 자료 형식을 지정할 책임이 있다. 검증 자료를 사용하는 예시는 Securing Verifiable Credentials using JOSE and COSE, the Data Integrity ECDSA Cryptosuites, the Data Integrity EdDSA Cryptosuites를 참고하라.

상호 운용 가능한 구현의 가능성을 높이기 위해, 이 규격은 제어 식별자 문서에서 검증 자료를 표현하는 형식의 수를 제한한다. 구현자가 선택해야 하는 형식이 적을수록 상호 운용성이 달성될 가능성이 높아진다. 이 접근법은 구현을 쉽게 하는 것과, 역사적으로 널리 배포되어 온 형식을 지원하는 것 사이에서 미묘한 균형을 맞추려는 시도다.

검증 방법은 동일한 자료에 대해 여러 검증 자료 속성을 포함해서는 안 된다. 예를 들어 검증 방법에서 키 자료를 publicKeyJwkpublicKeyMultibase를 동시에 사용하여 표현하는 것은 금지된다.

구현체는 운영상의 목적이나 암호 라이브러리와의 연동을 위해 필요에 따라 키를 형식 간에 변환할 수 있다. 내부 구현 세부사항으로서, 그러한 변환은 키 자료의 외부 표현에 영향을 주어서는 안 된다.

위 두 속성을 모두 사용하는 검증 방법을 담은 제어 식별자 문서의 예시가 아래에 나와 있다.

예시 8: publicKeyJwk와 publicKeyMultibase를 사용하는 검증 방법
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "verificationMethod": [{
    "id": "https://controller.example#authn-key-123",
    "type": "Multikey",
    "controller": "https://controller.example",
    "expires": "2025-12-01T00:00:00Z",
    "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }, {
    "id": "https://controller.example/101#key-20240828",
    "type": "JsonWebKey",
    "controller": "https://controller.example/101",
    "revoked": "2024-12-10T15:28:32Z",
    "publicKeyJwk": {
      "kid": "key-20240828",
      "kty": "EC",
      "crv": "P-256",
      "alg": "ES256",
      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
    }
  }]
}

2.2.2 Multikey

Multikey 데이터 모델은 키 유형을 하나의 이진 스트림으로 인코딩한 뒤 그것을 2.4 Multibase 절에 기술된 대로 Multibase 값으로 인코딩하는, 특정 유형의 검증 방법이다.

Multikey를 지정할 때, 객체는 다음 형태를 취한다:

type
type 속성의 값은 Multikey로 설정된 문자열어야 한다.
publicKeyMultibase
publicKeyMultibase 속성은 선택 사항이다. 존재한다면 그 값은 2.4 Multibase 절에 기술된 Multibase 인코딩 값이어야 한다.
secretKeyMultibase
secretKeyMultibase 속성은 선택 사항이다. 존재한다면 그 값은 2.4 Multibase 절에 기술된 Multibase 인코딩 값이어야 한다.

아래 예시는 위에서 정의한 형식을 사용하여 Ed25519 공개키를 표현한다:

예시 9: Ed25519 공개키의 Multikey 인코딩
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi#keys-1",
  "type": "Multikey",
  "controller": "https://controller.example/123456789abcdefghi",
  "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
}

공개키 값은 아래 표의 규칙을 사용하여 표현된다:

키 유형 설명
ECDSA 256비트 공개키 P-256 공개키의 Multikey 인코딩은 두 바이트 접두사 0x8024(0x1200의 varint 표현)로 시작해야 하며, 그 뒤에 33바이트 압축 공개키 데이터가 온다. 그 결과인 35바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
ECDSA 384비트 공개키 P-384 공개키의 인코딩은 두 바이트 접두사 0x8124(0x1201의 varint 표현)로 시작해야 하며, 그 뒤에 49바이트 압축 공개키 데이터가 온다. 그 결과인 51바이트 값은 그런 다음 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩되고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
Ed25519 256비트 공개키 Ed25519 공개키의 인코딩은 두 바이트 접두사 0xed01(0xed의 varint 표현)로 시작해야 하며, 그 뒤에 32바이트 공개키 데이터가 온다. 그 결과인 34바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
BLS12-381 381비트 공개키 G2 그룹의 BLS12-381 공개키의 인코딩은 두 바이트 접두사 0xeb01(0xeb의 varint 표현)로 시작해야 하며, 그 뒤에 96바이트 압축 공개키 데이터가 온다. 그 결과인 98바이트 값은 그런 다음 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
SM2 256비트 공개키 SM2 공개키의 인코딩은 두 바이트 접두사 0x8624(0x1206의 varint 표현)로 시작해야 하며, 그 뒤에 33바이트 압축 공개키 데이터가 온다. 그 결과인 35바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.

비밀키 값은 아래 표의 규칙을 사용하여 표현된다:

키 유형 설명
ECDSA 256비트 비밀키 P-256 비밀키의 Multikey 인코딩은 두 바이트 접두사 0x8626(0x1306의 varint 표현)로 시작해야 하며, 그 뒤에 32바이트 비밀키 데이터가 온다. 그 결과인 34바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
ECDSA 384비트 비밀키 P-384 비밀키의 인코딩은 두 바이트 접두사 0x8726(0x1307의 varint 표현)로 시작해야 하며, 그 뒤에 48바이트 비밀키 데이터가 온다. 그 결과인 50바이트 값은 그런 다음 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩되고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
Ed25519 256비트 비밀키 Ed25519 비밀키의 인코딩은 두 바이트 접두사 0x8026(0x1300의 varint 표현)로 시작해야 하며, 그 뒤에 32바이트 비밀키 데이터가 온다. 그 결과인 34바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
BLS12-381 381비트 비밀키 G2 그룹의 BLS12-381 비밀키의 인코딩은 두 바이트 접두사 0x8030(0x130a의 varint 표현)로 시작해야 하며, 그 뒤에 96바이트 압축 공개키 데이터가 온다. 그 결과인 98바이트 값은 그런 다음 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.
SM2 256비트 비밀키 SM2 비밀키의 인코딩은 두 바이트 접두사 0x9026(0x1310의 varint 표현)로 시작해야 하며, 그 뒤에 32바이트 비밀키 데이터가 온다. 그 결과인 34바이트 값은 2.4 Multibase 절에 따라 base-58-btc 알파벳으로 인코딩해야 하고, 그런 다음 base-58-btc Multibase 헤더(z)를 앞에 붙인다.

개발자는 실수로 비밀키의 표현을 공개하지 않도록 주의할 것을 권한다. 이 규격을 준수하는 구현체는 Multikey 헤더 값이 위의 공개키 헤더 표에 없는 경우, 또는 제어 식별자 문서에 공개된 것처럼 공개키로 기대되는 Multikey 값을 읽는데 그것이 알려진 공개키 헤더로 시작하지 않는 경우 오류를 일으킨다.

publicKeyMultibasesecretKeyMultibase에 사용할 값을 정의할 때, 규격 작성자는 다른 규격에서 다른 키 유형에 대한 추가 헤더 값을 정의할 수 있으나, 이 규격이 이미 정의한 키 유형에 대해 대체 인코딩을 정의해서는 안 된다.

2.2.3 JsonWebKey

JSON Web Key(JWK) 데이터 모델은 JWK 규격 [RFC7517]을 사용하여 키 유형을 매개변수 집합으로 인코딩하는, 특정 유형의 검증 방법이다.

JsonWebKey를 지정할 때, 객체는 다음 형태를 취한다:

type
type 속성의 값은 JsonWebKey로 설정된 문자열어야 한다.
publicKeyJwk

publicKeyJwk 속성은 선택 사항이다. 존재한다면 그 값은 [RFC7517]을 따르는 JSON Web Key를 나타내는 어야 한다. 그 JWK Registration Template에 기술된 d와 같은 개인 정보 클래스의 구성원을 포함해서는 안 된다. JWK [RFC7517]을 사용하여 공개키를 나타내는 검증 방법은 kid 값을 그 조각 식별자로 사용하는 것이 권장된다. JWK kid 값은 공개키의 SHA-256(SHA2-256) 해시 함수를 사용한 JWK Thumbprint [RFC7638]로 설정하는 것이 권장된다. 복합 키 식별자를 가진 공개키의 예시는 예시 8의 첫 번째 키를 참고하라.

JWK 규격 4.4절에 지정된 대로, 선택alg 속성은 공개키와 함께 사용하도록 의도된 알고리즘을 식별하며, 동일한 키를 여러 알고리즘과 함께 사용할 때 발생할 수 있는 보안 문제를 방지하기 위해 포함하는 것이 좋다. 타원 곡선을 사용하는 키를 기술하는 JWA 규격 6.2.1.1절에 지정된 대로, 필수 crv 속성은 공개키의 특정 곡선 유형을 식별하는 데 사용된다. JWS 규격 4.1.4절에 지정된 대로, 선택kid 속성은 키를 찾는 데 도움을 주는 힌트다. 존재한다면 kid 값은 그것을 감싸는 JsonWebKey 객체의 id 속성과, URL의 경로·질의·조각의 일부로서 일치하거나 그 안에 포함되는 것이 좋다.

secretKeyJwk
secretKeyJwk 속성은 선택 사항이다. 존재한다면 그 값은 [RFC7517]을 따르는 JSON Web Key를 나타내는 어야 한다. 이 속성은 그것을 담은 데이터 구조가 공개되거나 비밀키의 정당한 보유자가 아닌 당사자에게 드러날 수 있는 경우 사용해서는 안 된다.

JsonWebKey를 따르는 객체의 예시가 아래에 나와 있다:

예시 10: secp384r1(P-384) 공개키의 JSON Web Key 인코딩
{
  "id": "https://controller.example/123456789abcdefghi#key-1",
  "type": "JsonWebKey",
  "controller": "https://controller.example/123456789abcdefghi",
  "publicKeyJwk": {
      "kid": "key-1",
      "kty": "EC",
      "crv": "P-384",
      "alg": "ES384",
      "x": "1F14JSzKbwxO-Heqew5HzEt-0NZXAjCu8w-RiuV8_9tMiXrSZdjsWqi4y86OFb5d",
      "y": "dnd8yoq-NOJcBuEYgdVVMmSxonXg-DU90d7C4uPWb_Lkd4WIQQEH0DyeC2KUDMIU"
    }
}

위 예시에서 publicKeyJwk 값은 JSON Web Key를 담고 있다. kty 속성은 "Elliptic Curve"(타원 곡선)를 뜻하는 "EC" 키 유형을 인코딩한다. alg 속성은 공개키와 함께 사용하도록 의도된 알고리즘을 식별하며, 이 경우 ES384다. crv 속성은 공개키의 특정 곡선 유형인 P-384를 식별한다. xy 속성은 공개키에 연관된 P-384 곡선 위의 점을 지정한다.

publicKeyJwk 속성은 "d"를 포함하여, JOSE Registries [JOSE-REGISTRIES]에 담긴 어떤 레지스트리에서든 "Private" 또는 "Secret"으로 표시된 속성을 포함해서는 안 된다.

JSON Web Key 데이터 모델은 때때로 개인키(private key)라고도 불리는 비밀키(secret key)를 인코딩하는 것도 가능하다.

예시 11: secp384r1(P-384) 비밀키의 JSON Web Key 인코딩
{
  "id": "https://controller.example/123456789abcdefghi#key-1",
  "type": "JsonWebKey",
  "controller": "https://controller.example/123456789abcdefghi",
  "secretKeyJwk": {
      "id": "secret-1",
      "kty": "EC",
      "crv": "P-384",
      "alg": "ES384",
      "d": "fGwges0SX1mj4eZamUCL4qtZijy9uT15fI4gKTuRvre4Kkoju2SHM4rlFOeKVraH",
      "x": "1F14JSzKbwxO-Heqew5HzEt-0NZXAjCu8w-RiuV8_9tMiXrSZdjsWqi4y86OFb5d",
      "y": "dnd8yoq-NOJcBuEYgdVVMmSxonXg-DU90d7C4uPWb_Lkd4WIQQEH0DyeC2KUDMIU"
    }
}

위의 개인키 예시는 앞의 공개키 예시와 거의 동일하되, 정보가 (publicKeyJwk가 아니라) secretKeyJwk 속성에 저장되고, 개인키 값이 그 안의 d 속성에 인코딩된다는 점만 다르다(여전히 공개키에 연관된 P-384 곡선 위의 점을 지정하는 xy 속성과 함께).

2.2.4 검증 방법 참조하기

검증 방법2.3 검증 관계에 기술된 대로 다양한 검증 관계에 연관된 속성 안에 내장되거나 그로부터 참조될 수 있다. 검증 방법을 참조하면 그것을 둘 이상의 검증 관계에서 사용할 수 있다.

검증 방법 속성의 값이 이면, 그 검증 방법은 내장된 것이며 그 속성에 직접 접근할 수 있다. 그러나 값이 URL 문자열이면, 그 검증 방법은 참조로 포함된 것이며 그 속성은 제어 식별자 문서의 다른 곳이나 다른 제어 식별자 문서로부터 가져와야 한다. 이는 URL을 역참조하고, 그 결과인 자원에서 값이 그 URL과 일치하는 id 속성을 가진 검증 방법 을 찾아서 수행한다.

예시 12: 검증 방법의 내장과 참조
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example",
  "authentication": [
    // this key is referenced and might be used by
    // more than one verification relationship
    "https://controllerB.example/123456789abcdefghi#keys-1",
    // this key is embedded and may *only* be used for authentication
    {
      "id": "https://controllerA.example/123456789abcdefghi#keys-2",
      "type": "Multikey",
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
    }
  ]
}

2.3 검증 관계

검증 관계란 하나 이상의 검증 방법이 주체를 대신하여 만들어진 증명을 검증하도록 인가되었다는 표현이다.

서로 다른 검증 관계는 연관된 검증 방법을 서로 다른 목적으로 사용할 수 있게 한다. 검증 시도의 유효성을 확인하는 것은 검증자의 몫이며, 검증자는 사용된 검증 방법제어 식별자 문서의 적절한 검증 관계 속성에 의해 참조되는지 확인함으로써 이를 판단한다.

주체검증 방법 사이의 검증 관계제어 식별자 문서에 명시적으로 표현된다. 특정 검증 관계와 연관되지 않은 검증 방법은 그 검증 관계에 사용될 수 없다. 예를 들어 인증 속성과 연관된 검증 방법은 키 합의 프로토콜에 참여하는 데 사용될 수 없다. 그것을 위해서는 keyAgreement 속성의 값이 사용되어야 한다.

참조된 검증 방법 정의가 그것을 역참조하는 데 사용된 최신 제어 식별자 문서에 없다면, 그 검증 방법은 무효이거나 폐기된 것으로 간주된다.

다음 절들은 몇 가지 유용한 검증 관계를 정의한다. 제어 식별자 문서는 특정 검증 관계를 표현하기 위해 이들 중 어느 것이나 또는 다른 속성을 포함할 수 있다. 상호 운용성을 극대화하기 위해, 그렇게 사용되는 속성은 DID Document Property Extensions 목록에 등록되는 것이 좋다.

2.3.1 인증

authentication 검증 관계는 웹사이트 로그인이나 온갖 종류의 챌린지-응답 프로토콜 참여와 같은 목적을 위해 주체가 어떻게 인증될 것으로 기대되는지를 지정하는 데 사용된다. 인증 이후에 수행되는 처리는 애플리케이션에 따라 다르다.

authentication
authentication 속성은 선택 사항이다. 존재한다면 그 값은 하나 이상의 검증 방법집합어야 한다. 각 검증 방법은 내장되거나 참조될 수 있다.
예시 13: 검증 방법 세 개를 담은 authentication 속성
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi",
  ...
  "authentication": [
    // this method can be used to authenticate
    "https://controller.example/123456789abcdefghi#keys-1",
    // this method is *only* approved for authentication, so its
    // full description is embedded here rather than using only a reference
    {
      "id": "https://controller.example/123456789abcdefghi#keys-2",
      "type": "JsonWebKey",
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyJwk": {
        "crv": "Ed25519",
        "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ",
        "kty": "OKP",
        "kid": "_Qq0UL2Fq651Q0Fjd6TvnYE-faHiOpRlPVQcY_-tA4A"
      }
    },
    {
      "id": "https://controller.example/123456789abcdefghi#keys-3",
      "type": "Multikey",
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
    }
  ]
  ...
}

이는 인증을 시도하는 엔티티가 유효한 인증 증명을 제시하고 있는지 확인해야 하는, 인증을 검증하는 모든 엔티티에게 유용하다. 그러한 인증 검증 엔티티가 (어떤 프로토콜별 형식으로) "인증" 목적으로 만들어진 증명을 담고 있으며 어떤 엔티티가 그 id로 식별된다고 말하는 데이터를 받으면, 그 검증자는 그 증명제어 식별자 문서authentication 아래에 나열된 검증 방법(예: 공개키)을 사용하여 검증될 수 있는지 확인한다.

제어 식별자 문서authentication 속성이 가리키는 검증 방법은 그 제어 식별자 문서기본 식별자를 대신하여 인증하는 데에만 사용될 수 있다는 점에 유의하라.

2.3.2 어써션(Assertion)

assertionMethod 검증 관계는 검증가능한 크리덴셜에서와 같이 어써션이나 클레임을 표현할 때 제어자가 사용을 인가하는 검증 방법을 지정하는 데 사용된다.

assertionMethod
assertionMethod 속성은 선택 사항이다. 존재한다면 그 연관된 값은 하나 이상의 검증 방법집합어야 한다. 각 검증 방법은 내장되거나 참조될 수 있다.

이 속성은 예를 들어 검증자가 검증가능한 크리덴셜을 처리하는 동안 유용하다.

예시 14: 검증 방법 두 개를 담은 assertionMethod 속성
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi",
  ...
  "assertionMethod": [
    // this method can be used to assert statements
    "https://controller.example/123456789abcdefghi#keys-1",
    // this method is *only* approved for assertion of statements, it is not
    // used for any other verification relationship, so its full description is
    // embedded here rather than using a reference
    {
      "id": "https://controller.example/123456789abcdefghi#keys-2",
      "type": "Multikey", // external (property value)
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
    }
  ]
  ...
}

2.3.3 키 합의

keyAgreement 검증 관계는 수신자와 보안 통신 채널을 확립하는 것과 같은 목적으로, 엔티티가 제어자를 위한 기밀 정보를 전송하기 위해 어떻게 암호화를 수행할 수 있는지를 지정하는 데 사용된다.

keyAgreement
keyAgreement 속성은 선택 사항이다. 존재한다면 그 연관된 값은 하나 이상의 검증 방법집합어야 한다. 각 검증 방법은 내장되거나 참조될 수 있다.

이 속성이 유용한 예는 제어자를 위한 메시지를 암호화할 때다. 이 경우 상대방은 검증 방법에 담긴 암호학적 공개키 정보를 사용하여 수신자를 위한 복호화 키를 감싼다.

예시 15: 검증 방법 두 개를 담은 keyAgreement 속성
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi",
  ...
  "keyAgreement": [
    "https://controller.example/123456789abcdefghi#keys-1",
    // the rest of the methods below are *only* approved for key agreement usage
    // they will not be used for any other verification relationship
    // the full value is embedded here rather than using only a reference
    {
      "id": "https://controller.example/123#keys-2",
      "type": "Multikey",
      "controller": "https://controller.example/123",
      "publicKeyMultibase": "zDnaerx9CtbPJ1q36T5Ln5wYt3MQYeGRG5ehnPAmxcf5mDZpv"
    },
    {
      "id": "https://controller.example/123#keys-3",
      "type": "JsonWebKey",
      "controller": "https://controller.example/123",
      "publicKeyJwk": {
        "kty": "OKP",
        "crv": "X25519",
        "x": "W_Vcc7guviK-gPNDBmevVw-uJVamQV5rMNQGUwCqlH0"
      }
    }
  ]
  ...
}

2.3.4 역량 호출(Capability Invocation)

capabilityInvocation 검증 관계제어 식별자 문서를 갱신할 권한과 같은 암호학적 역량을 호출하기 위해 제어자가 사용할 수 있는 검증 방법을 지정하는 데 사용된다.

capabilityInvocation
capabilityInvocation 속성은 선택 사항이다. 존재한다면 그 연관된 값은 하나 이상의 검증 방법집합어야 한다. 각 검증 방법은 내장되거나 참조될 수 있다.

이 속성이 유용한 예는 제어자가 사용하려면 인가가 필요한 보호된 HTTP API에 접근해야 할 때다. HTTP API를 사용할 때 인가하기 위해, 제어자는 HTTP API를 통해 노출되는 특정 URL과 연관된 역량을 사용한다. 역량의 호출은 여러 방식으로 표현될 수 있는데, 예를 들어 HTTP 헤더에 넣는 디지털 서명된 메시지로 표현될 수 있다.

HTTP API를 제공하는 서버는 그 역량의 검증자이며, 호출된 역량이 참조하는 검증 방법제어 식별자 문서capabilityInvocation 속성에 존재하는지 검증해야 한다. 검증자는 또한 수행되는 행위가 유효하고 역량이 접근되는 자원에 적절한지도 확인한다. 검증이 성공하면, 서버는 호출자가 보호된 자원에 접근하도록 인가되었음을 암호학적으로 판정한 것이다.

예시 16: 검증 방법 두 개를 담은 capabilityInvocation 속성
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi",
  ...
  "capabilityInvocation": [
    // this method can be used to invoke capabilities as https:...fghi
    "https://controller.example/123456789abcdefghi#keys-1",
    // this method is *only* approved for use in capability invocation; it will not
    // be used for any other verification relationship, so its full description is
    // embedded here rather than using only a reference
    {
    "id": "https://controller.example/123456789abcdefghi#keys-2",
    "type": "Multikey", // external (property value)
    "controller": "https://controller.example/123456789abcdefghi",
    "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
    }
  ]
  ...
}

2.3.5 역량 위임(Capability Delegation)

capabilityDelegation 검증 관계는 암호학적 역량을 다른 당사자에게 위임하는 데 사용될 수 있는 메커니즘을 지정하는 데 사용된다. Authorization CapabilityUCAN과 같은 메커니즘, 그리고 위임 이후에 수행되는, 특정 HTTP API에 접근하는 것과 같은 처리는 애플리케이션에 따라 다르다.

capabilityDelegation
capabilityDelegation 속성은 선택 사항이다. 존재한다면 그 연관된 값은 하나 이상의 검증 방법집합어야 한다. 각 검증 방법은 내장되거나 참조될 수 있다.

이 속성이 유용한 예는 제어자가 보호된 HTTP API에 접근할 자신의 역량을 자신이 아닌 다른 당사자에게 위임하기로 선택할 때다. 역량을 위임하기 위해, 제어자capabilityDelegation 검증 관계와 연관된 검증 방법을 사용하여 그 역량을 다른 제어자에게 암호학적으로 서명하여 넘긴다. 그러면 수임자는 2.3.4 역량 호출(Capability Invocation)에 기술된 예시와 유사한 방식으로 그 역량을 사용한다.

예시 17: 검증 방법 두 개를 담은 capabilityDelegation 속성
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123456789abcdefghi",
  ...
  "capabilityDelegation": [
    // this method can be used to perform capability delegation
    "https://controller.example/123456789abcdefghi#keys-1",
    // this method is *only* approved for granting capabilities; it will not
    // be used for any other verification relationship, so its full description is
    // embedded here rather than using only a reference
    {
      "id": "https://controller.example/123456789abcdefghi#keys-2",
      "type": "JsonWebKey", // external (property value)
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyJwk": {
        "kty": "OKP",
        "crv": "Ed25519",
        "x": "O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik"
      }
    },
    {
      "id": "https://controller.example/123456789abcdefghi#keys-3",
      "type": "Multikey", // external (property value)
      "controller": "https://controller.example/123456789abcdefghi",
      "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
    }
  ]
  ...
}

2.4 Multibase

Multibase 값은 이진 값을 base 인코딩된 문자열로 인코딩한다. 그 값은 이진 값을 인코딩하는 데 사용된 base와 인코딩 알파벳을 식별하는 한 글자 헤더로 시작하며, 그 뒤에 (그 base와 알파벳을 사용하여) 인코딩된 이진 값이 온다. 아래에 제공된 흔한 Multibase 헤더 값과 그에 연관된 base 인코딩 알파벳은 규범적이다:

Multibase 헤더 설명
u 바이트를 인코딩하는 데 base-64-url-no-pad 알파벳이 사용된다. 기본 알파벳은 다음 문자들로 순서대로 구성된다: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
z 바이트를 인코딩하는 데 base-58-btc 알파벳이 사용된다. 기본 알파벳은 다음 문자들로 순서대로 구성된다: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

다른 Multibase 인코딩 값이 사용될 수 있으나, 그러한 값을 사용하는 구현체 사이에서는 상호 운용성이 보장되지 않는다.

이진 값을 Multibase 문자열로 base 인코딩하려면, 구현체는 위 표의 원하는 base 인코딩과 알파벳으로 3.1 Base 인코딩 절의 알고리즘을 그 이진 값에 적용해야 하며, 위 표의 연관된 Multibase 헤더를 그 결과 앞에 반드시 붙여야 한다. 동등한 출력을 내는 어떤 알고리즘이든 사용될 수 있다.

Multibase 문자열을 base 디코딩하려면, 구현체는 Multibase 헤더에 연관된 알파벳으로 첫 글자(Multibase 헤더) 다음의 문자열에 3.2 Base 디코딩 절의 알고리즘을 적용해야 한다. 동등한 출력을 내는 어떤 알고리즘이든 사용될 수 있다.

2.5 Multihash

Multihash 값은 이진 헤더로 시작하는데, 이 헤더는 1) 특정 암호 해싱 알고리즘의 식별자, 2) 바이트 단위의 암호 다이제스트 길이, 3) 암호 다이제스트의 값을 포함한다. 이 규격이 정의하는 규범적 Multihash 헤더 값과 그에 연관된 출력 크기 및 연관된 규격은 아래에 제공된다:

Multihash 식별자 Multihash 헤더 설명
sha2-256 0x12 [RFC6234]에 정의된, 256비트(32바이트) 출력을 갖는 SHA-2.
sha2-384 0x20 [RFC6234]에 정의된, 384비트(48바이트) 출력을 갖는 SHA-2.
sha3-256 0x16 [SHA3]에 정의된, 256비트(32바이트) 출력을 갖는 SHA-3.
sha3-384 0x15 [SHA3]에 정의된, 384비트(48바이트) 출력을 갖는 SHA-3.

다른 Multihash 인코딩 값이 사용될 수 있으나, 구현체 사이에서 상호 운용성이 보장되지 않는다.

Multihash 값으로 인코딩하려면, 구현체는 연관된 Multihash 헤더(varint로 인코딩됨), 바이트 단위의 암호 다이제스트 길이(varint로 인코딩됨), 암호 다이제스트 값을 그 순서대로 이어붙여야 한다.

Multihash 값을 디코딩하려면, 구현체는 1) 암호 해싱 알고리즘의 유형을 식별하는, 앞에 붙은 Multihash 헤더 값을 제거하고, 2) 바이트 단위의 암호 다이제스트 길이를 제거하고, 3) 원시 암호 다이제스트 값을 추출해야 하는데, 이 값은 Multihash 헤더에 연관된 기대 출력 길이 및 Multihash 값 자체에 제공된 출력 길이와 일치해야 한다.

3. 알고리즘

이 절은 이 규격이 사용하는 알고리즘을 정의하며, 다음에 관한 지침을 포함한다. 값을 base 인코딩·디코딩하는 방법, 검증 방법을 안전하게 조회하는 방법, 문서 조각을 조회하는 방법, HTTP 채널을 통해 처리 오류의 설명을 생성하는 방법이다. 대체 알고리즘의 출력이 동일하게 유지되는 한, 이 절에서 제공하는 알고리즘의 대안이 사용될 수 있다.

3.1 Base 인코딩

다음 알고리즘은 각 바이트가 base-256 값을 나타내는 바이트 배열을, base-64-url-no-pad나 base-58-btc와 같은 특정 base 알파벳을 사용하는 다른 base 표현으로 인코딩하는 방법을 지정한다. 필요한 입력은 bytes, targetBase, baseAlphabet이다. 출력은 base 인코딩된 값을 담은 문자열이다. 모든 수학 연산은 정수 산술을 사용하여 수행해야 한다.

  1. 다음 변수들을 초기화한다. zeroes0으로, length0으로, begin0으로, endbytes의 길이로 초기화한다.
  2. beginzeroesbytes의 선행 0 바이트 값의 개수로 설정한다.
  3. baseValue를 최종 base 확장 값의 크기를 갖는 빈 바이트 배열로 설정한다. baseValue의 최종 size는 log(256)을 log(targetBase)로 나눈 다음, bytes의 길이에서 선행 zeroes를 뺀 값을 곱하여 계산한다. size 값에 1을 더한다.
  4. begin 오프셋부터 시작하여 bytes의 각 바이트를 byte로 처리한다:
    1. carry 값을 byte로 설정한다.
    2. baseValue 배열의 끝에서 시작하여 base 확장을 수행한다. 반복자 i0으로 초기화한다. basePositionsize에서 1을 뺀 값으로 설정한다. carry0이 아니거나 ilength보다 작고, basePosition-1이 아닌 동안 다음 루프를 수행한다.
      1. baseValue[basePosition]의 값에 256을 곱하여 carry에 더한다.
      2. baseValue[basePosition]의 값을 carrytargetBase로 나눈 나머지로 설정한다.
      3. carry의 값을 carrytargetBase로 나눈 값으로 설정하되, 나눗셈은 정수 나눗셈을 사용하여 수행한다.
      4. basePosition1 감소시키고 i1 증가시킨다.
    3. lengthi로 설정하고 begin1 증가시킨다.
  5. baseEncodingPositionsize에서 length를 뺀 값으로 설정한다. baseEncodingPositionsize와 같지 않고 baseValue[baseEncodingPosition]0이 아닌 동안 baseEncodingPosition을 증가시킨다. 이 단계는 base 인코딩 결과의 선행 0을 건너뛴다.
  6. baseAlphabet의 첫 항목을 zeroes 값(bytes의 선행 0의 개수)만큼 반복하여 baseEncoding을 초기화한다.
  7. baseValue의 나머지를 base 인코딩으로 변환한다. baseEncodingPositionsize보다 작은 동안 baseEncodingPosition을 증가시키며, baseEncodedValuebaseValue[baseEncodingPosition]으로 설정한다. baseAlphabet[baseEncodedValue]를 baseEncoding에 덧붙인다.
  8. baseEncoding을 base 인코딩된 값으로 반환한다.
예시 18: 위 일반 base 인코딩 알고리즘의 Javascript 구현
function baseEncode(bytes, targetBase, baseAlphabet) {
  let zeroes = 0;
  let length = 0;
  let begin = 0;
  let end = bytes.length;

  // count the number of leading bytes that are zero
  while(begin !== end && bytes[begin] === 0) {
    begin++;
    zeroes++;
  }

  // allocate enough space to store the target base value
  const baseExpansionFactor = Math.log(256) / Math.log(targetBase);
  let size = Math.floor((end - begin) * baseExpansionFactor + 1);
  let baseValue = new Uint8Array(size);

  // process the entire input byte array
  while(begin !== end) {
    let carry = bytes[begin];

    // for each byte in the array, perform base-expansion
    let i = 0;
    for(let basePosition = size - 1;
        (carry !== 0 || i < length) && (basePosition !== -1);
        basePosition--, i++) {
      carry += Math.floor(256 * baseValue[basePosition]);
      baseValue[basePosition] = Math.floor(carry % targetBase);
      carry = Math.floor(carry / targetBase);
    }

    length = i;
    begin++;
  }

  // skip leading zeroes in base-encoded result
  let baseEncodingPosition = size - length;
  while(baseEncodingPosition !== size &&
        baseValue[baseEncodingPosition] === 0) {
    baseEncodingPosition++;
  }

  // convert the base value to the base encoding
  let baseEncoding = baseAlphabet.charAt(0).repeat(zeroes)
  for(; baseEncodingPosition < size; ++baseEncodingPosition) {
    baseEncoding += baseAlphabet.charAt(baseValue[baseEncodingPosition])
  }

  return baseEncoding;
}

3.2 Base 디코딩

다음 알고리즘은 각 바이트가 base 인코딩된 값을 나타내는 바이트 배열을, base-64-url-no-pad나 base-58-btc와 같은 특정 base 알파벳을 사용하는 다른 base 표현으로 디코딩하는 방법을 지정한다. 필요한 입력은 sourceEncoding, sourceBase, baseAlphabet이다. 출력은 base 디코딩된 값을 담은 바이트 배열이다. 모든 수학 연산은 정수 산술을 사용하여 수행해야 한다.

  1. baseAlphabet의 각 문자를 baseAlphabet 문자열 내 그 정수 위치와 연관시켜 baseMap 매핑을 초기화한다.
  2. 다음 변수들을 초기화한다. sourceOffset0으로, zeroes0으로, decodedLength0으로 초기화한다.
  3. zeroessourceOffsetsourceEncoding의 선행 baseAlphabet[0] 값의 개수로 설정한다.
  4. decodedBytes를 최종 base 변환 값의 크기를 갖는 빈 바이트 배열로 설정한다. decodedBytes의 크기는 log(sourceBase)를 log(256)으로 나눈 다음, sourceEncoding의 길이에서 선행 0을 뺀 값을 곱하여 계산한다. 그 크기 값에 1을 더한다.
  5. sourceOffset 오프셋부터 시작하여 sourceEncoding의 각 문자를 character로 처리한다:
    1. carry 값을 character와 연관된 baseMap의 정수 값으로 설정한다.
    2. decodedBytes 배열의 끝에서 시작하여 base 디코딩을 수행한다. 반복자 i0으로 초기화한다. byteOffsetdecodedSize에서 1을 뺀 값으로 설정한다. carry0이 아니거나 idecodedLength보다 작고, byteOffset-1이 아닌 동안 다음 루프를 수행한다:
      1. sourceBasedecodedBytes[byteOffset]을 곱한 결과를 carry에 더한다.
      2. decodedBytes[byteOffset]을 carry256으로 나눈 나머지로 설정한다.
      3. carrycarry256으로 나눈 값으로 설정하되, 나눗셈은 정수 나눗셈을 사용하여 수행한다.
      4. byteOffset1 감소시키고 i1 증가시킨다.
    3. decodedLengthi로 설정하고 sourceOffset1 증가시킨다.
  6. decodedOffsetdecodedSize에서 decodedLength를 뺀 값으로 설정한다. decodedOffsetdecodedSize와 같지 않고 decodedBytes[decodedOffset]이 0인 동안 decodedOffset1 증가시킨다. 이 단계는 최종 base 디코딩된 바이트 배열의 선행 0을 건너뛴다.
  7. finalBytes 배열의 크기를 zeroesdecodedSize에서 decodedOffset을 뺀 값을 더한 값으로 설정한다. finalBytes의 처음 zeroes 바이트를 0으로 초기화한다.
  8. finalByteszeroes 개수에 1을 더한 값과 같은 오프셋부터 시작하여, decodedOffset 오프셋부터 decodedSize까지의 decodedBytes의 모든 바이트를 finalBytes로 복사한다.
예시 19: 위 일반 base 디코딩 알고리즘의 Javascript 구현
function baseDecode(sourceEncoding, sourceBase, baseAlphabet) {
  // build the base-alphabet to integer value map
  baseMap = {};
  for(let i = 0; i < baseAlphabet.length; i++) {
    baseMap[baseAlphabet[i]] = i;
  }

  // skip and count zero-byte values in the sourceEncoding
  let sourceOffset = 0;
  let zeroes = 0;
  let decodedLength = 0;
  while(sourceEncoding[sourceOffset] === baseAlphabet[0]) {
    zeroes++;
    sourceOffset++;
  }

  // allocate the decoded byte array
  const baseContractionFactor = Math.log(sourceBase) / Math.log(256);
  let decodedSize = Math.floor((
    (sourceEncoding.length - sourceOffset) * baseContractionFactor) + 1);
  let decodedBytes = new Uint8Array(decodedSize);

  // perform base-conversion on the source encoding
  while(sourceEncoding[sourceOffset]) {
    // process each base-encoded number
    let carry = baseMap[sourceEncoding[sourceOffset]];

    // convert the base-encoded number by performing base-expansion
    let i = 0
    for(let byteOffset = decodedSize - 1;
      (carry !== 0 || i < decodedLength) && (byteOffset !== -1);
      byteOffset--, i++) {
      carry += Math.floor(sourceBase * decodedBytes[byteOffset]);
      decodedBytes[byteOffset] = Math.floor(carry % 256);
      carry = Math.floor(carry / 256);
    }

    decodedLength = i;
    sourceOffset++;
  }

  // skip leading zeros in the decoded byte array
  let decodedOffset = decodedSize - decodedLength;
  while(decodedOffset !== decodedSize && decodedBytes[decodedOffset] === 0) {
    decodedOffset++;
  }

  // create the final byte array that has been base-decoded
  let finalBytes = new Uint8Array(zeroes + (decodedSize - decodedOffset));
  let j = zeroes;
  while(decodedOffset !== decodedSize) {
    finalBytes[j++] = decodedBytes[decodedOffset++];
  }

  return finalBytes;
}

3.3 검증 방법 조회

다음 알고리즘은 검증 방법 식별자를 사용하여 암호학적 공개키와 같은 검증 방법을 안전하게 조회하는 방법을 지정한다. 필요한 입력은 검증 방법 식별자(vmIdentifier), 검증 관계(verificationRelationship), 그리고 역참조 옵션(options) 집합이다. 검증 방법이 출력으로 생성된다.

  1. vmIdentifier가 유효한 URL이 아니면, 오류를 일으켜야 하며 INVALID_VERIFICATION_METHOD_URL 오류 유형을 전달하는 것이 좋다.
  2. controllerDocumentUrl을 URL 스킴의 규칙에 따라 vmIdentifier를 파싱하고 (조각 식별자를 제외한) 주 자원 식별자를 추출한 결과로 둔다.
  3. vmFragment를 URL 스킴의 규칙에 따라 vmIdentifier를 파싱하고 2차 자원 식별자(조각 식별자)를 추출한 결과로 둔다.
  4. controllerDocument를 URL 스킴의 규칙에 따라 제공된 options를 사용하여 controllerDocumentUrl을 역참조한 결과로 둔다.
  5. controllerDocument적합 제어 식별자 문서가 아니면, 오류를 일으켜야 하며 INVALID_CONTROLLED_IDENTIFIER_DOCUMENT 오류 유형을 전달하는 것이 좋다.
  6. controllerDocument.idcontrollerDocumentUrl과 일치하지 않으면, 오류를 일으켜야 하며 INVALID_CONTROLLED_IDENTIFIER_DOCUMENT_ID 오류 유형을 전달하는 것이 좋다.
  7. verificationMethodcontrollerDocument의 미디어 타입 규칙에 따라 controllerDocument에서 vmFragment를 역참조한 결과로 둔다.
  8. verificationMethod적합 검증 방법이 아니면, 오류를 일으켜야 하며 INVALID_VERIFICATION_METHOD 오류 유형을 전달하는 것이 좋다.
  9. verificationMethod.id의 절대 URL 값이 vmIdentifier와 같지 않으면, 오류를 일으켜야 하며 INVALID_VERIFICATION_METHOD 오류 유형을 전달하는 것이 좋다.
  10. verificationMethod.controller의 절대 URL 값이 controllerDocumentUrl과 같지 않으면, 오류를 일으켜야 하며 INVALID_VERIFICATION_METHOD 오류 유형을 전달하는 것이 좋다.
  11. verificationMethod가 참조(URL)로든 값(객체)으로든 verificationRelationship으로 식별되는 controllerDocument검증 관계 배열과 연관되어 있지 않으면, 오류를 일으켜야 하며 INVALID_RELATIONSHIP_FOR_VERIFICATION_METHOD 오류 유형을 전달하는 것이 좋다.
  12. verificationMethod검증 방법으로 반환한다.

다음 예시는 이 절의 알고리즘이 요구하는 대로 최소 적합 검증 방법을 담은 최소 적합 제어 식별자 문서를 제공한다:

예시 20: 최소 적합 제어 식별자 문서
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123",
  "verificationMethod": [{
    "id": "https://controller.example/123#key-456",
    "type": "Multikey",
    "controller": "https://controller.example/123",
    "publicKeyMultibase": "z6MkmM42vxfqZQsv4ehtTjFFxQ4sQKS2w6WR7emozFAn5cxu"
  }],
  "authentication": ["https://controller.example/123#key-456"]
}
참고: 제어 식별자 문서는 외부 검증 방법에 대한 참조를 담을 수 있다

검증 방법 식별자는 URL인 문자열로, 또는 값이 URL인 id 속성을 통해 표현된다. 제어 식별자 문서검증 관계를 통해, 그 제어 식별자 문서 외부에 존재하는 검증 방법을 표현하는 것도 가능하다. 5.9 제어자의 무결성 보호 절에 기술된 대로, 제어 식별자 문서 외부에 있는 검증 방법을 지정하는 것은 이 규격의 유효한 사용이다. 이 검증 방법이 외부 제어 식별자 문서로부터 조회되는 것이 매우 중요하다.

어떤 검증 방법을 조회하든, 위 알고리즘은 그 검증 방법이 올바른 제어 식별자 문서로부터 조회되도록 보장하는 데 사용된다. 이 알고리즘은 또한 이 제어 식별자 문서가 (검증 관계를 통해) 그 검증 방법을 가리키고, 그 검증 방법이 (그 검증 방법controller 속성을 통해) 그 제어 식별자 문서를 가리키도록 보장한다. 이 알고리즘이나 이러한 검사를 수행하는 동등한 알고리즘을 사용하지 않으면, 공격자가 피해자의 검증 방법에 대한 제어를 주장하여 캐시를 오염시키는 보안 침해로 이어질 수 있다.

예시 21: `capabilityInvocation`을 위한 외부 검증 방법 참조
{
  "id": "https://controller.example/123",
  "capabilityInvocation": ["https://external.example/xyz#key-789"]
}

위 예시에서 이 절에 기술된 알고리즘은 https://external.example/xyz#key-789 URL 값을 검증 방법 식별자로 사용한다. 그런 다음 알고리즘은 그 검증 방법이 외부 제어 식별자 문서에 존재하고, 이 절 앞부분에 기술된 대로 적절한 관계가 존재하는지 확인한다.

참고: 조각 식별자 처리

검증 방법을 조회할 때의 조각 식별자 처리 규칙은 제어 식별자 문서의 미디어 타입에 따라 다르다. 이 절의 알고리즘은 대응하는 제어 식별자 문서의 미디어 타입(application/did 등)을 따르려 시도하고, 3.4 조각 해석 절이 application/cid 미디어 타입에 따라 조각 식별자를 해석하는 방법을 정의하지만, 구현자는 다른 미디어 타입의 제어 식별자 문서가 다른 결과를 낼 수 있는 다른 조각 처리 규칙을 요구할 수 있음에 유의해야 한다.

3.4 조각 해석

다음 알고리즘은 주어진 조각 식별자를 담은 문서의 부분을 조회하는 방법을 지정한다. 필요한 입력은 제어 식별자 문서( document)와 조각 식별자 (문자열 fragmentIdentifier)다. 출력은 문서 조각을 담은 이다.

  1. documentFragmentnull로 둔다.
  2. canonicalDocumentUrldocument.id의 값으로 둔다.
  3. fullyQualifiedFragmentcanonicalDocumentUrlfragmentIdentifier를 덧붙인 값으로 둔다.
  4. document의 모든 을 재귀적으로 처리하며, 그것이 fullyQualifiedFragment 또는 fragmentIdentifier와 같은 id 값을 갖는지 확인한다. 일치하는 것이 발견되면 documentFragment를 일치한 으로 설정하고 재귀 처리를 멈춘다.
  5. documentFragment를 반환한다.
참고: 동일한 값을 가진 여러 조각

동일한 식별자를 사용하는 여러 조각을 담은 문서를 표현하는 것이 가능하기는 하지만, 상호 운용성 우려로 인해 그렇게 하는 것은 피해야 하며 그 동작은 정의되어 있지 않다.

3.5 처리 오류

이 규격에 기술된 알고리즘은 특정 유형의 오류를 던진다. 구현자는 이러한 오류를 다른 라이브러리나 소프트웨어 시스템에 전달하는 것이 유용하다고 느낄 수 있다. 이 절은 오류에 대한 특정 URL과 설명을 제공하여, 이 규격에 기술된 기술을 구현하는 생태계가 오류가 발생했을 때 더 효과적으로 상호 운용할 수 있게 한다.

이러한 오류를 HTTP 인터페이스를 통해 노출할 때, 구현자는 오류 데이터 구조를 인코딩하기 위해 [RFC9457]을 사용하는 것이 좋다. [RFC9457]이 사용되는 경우:

INVALID_VERIFICATION_METHOD_URL
증명verificationMethod 값이 잘못된 형식이었다. 3.3 검증 방법 조회 절을 참고하라.
INVALID_CONTROLLED_IDENTIFIER_DOCUMENT_ID
제어 식별자 문서id 값이 잘못된 형식이었다. 3.3 검증 방법 조회 절을 참고하라.
INVALID_CONTROLLED_IDENTIFIER_DOCUMENT
제어 식별자 문서가 잘못된 형식이었다. 3.3 검증 방법 조회 절을 참고하라.
INVALID_VERIFICATION_METHOD
제어 식별자 문서검증 방법이 잘못된 형식이었다. 3.3 검증 방법 조회 절을 참고하라.
INVALID_RELATIONSHIP_FOR_VERIFICATION_METHOD
제어 식별자 문서검증 방법증명proofPurpose 속성에 표현된 기대 검증 관계를 사용하여 연관되지 않았다. 3.3 검증 방법 조회 절을 참고하라.

4. 컨텍스트와 어휘

4.1 어휘

이 규격에 정의된 용어들은 RDF 어휘 네임스페이스 [RDF-CONCEPTS] https://w3id.org/security#의 일부이기도 하다. 임의의 TERM에 대해, 관련 URL은 https://w3id.org/security#TERM 또는 https://w3id.org/security#TERMmethod 형태다. RDF 처리를 사용하고 이 규격에 의존하는 구현체는 이 URL들을 사용해야 한다.

https://w3id.org/security# URL을 역참조할 때, 반환되는 데이터의 미디어 타입은 HTTP 콘텐츠 협상에 따라 달라진다. 다음과 같다:

미디어 타입 설명과 해시
application/ld+json JSON-LD 형식의 어휘 [JSON-LD11].
SHA2-256 Digest: 082434d5b742418753bbc5d593f93b66d4f1ccf1c627417c0caa2dea40728245
text/turtle Turtle 형식의 어휘 [TURTLE].
SHA2-256 Digest: 9a5ba1e23f54b9adc9c39429f5eb3bd672cb392495cc4159561462921e012b37
text/html HTML+RDFa 형식의 어휘 [HTML-RDFA].
SHA2-256 Digest: dadc810b5bb2c01a3caf276dc03a7c826311cddfefe86160a8c7d34704f50422

위 암호 다이제스트는 (<MEDIA_TYPE><DOCUMENT_URL>을 적절한 값으로 바꿔서) 다음과 같은 명령을 현대적인 UNIX 계열 OS 명령줄 인터페이스에서 실행하여 확인할 수 있다: curl -sL -H "Accept: <MEDIA_TYPE>" <DOCUMENT_URL> | openssl dgst -sha256

4.2 JSON-LD 컨텍스트

JSON-LD 처리를 수행하는 구현체는 다음 JSON-LD 컨텍스트 URL을 이미 해석된 것으로 취급해야 하며, 그 해석된 문서는 아래의 해당 해시 값과 일치한다:

컨텍스트 URL과 해시
URL: https://www.w3.org/ns/cid/v1
SHA2-256 Digest:
ea216ecc1cb02cd39b693dba2250141e270ba0bf95890be107dd9a9e8e43de85

위에 나열된 암호 다이제스트는 다음과 같은 명령을 현대적인 UNIX 계열 OS 명령줄 인터페이스에서 실행하여 확인할 수 있다: curl -sL -H "Accept: application/ld+json" https://www.w3.org/ns/cid/v1 | openssl dgst -sha256

위에 나열된 JSON-LD 컨텍스트가 해석하는 보안 어휘 용어들은 https://w3id.org/security# 네임스페이스에 있다. 더 자세한 내용은 4.1 어휘도 참고하라.

참고

애플리케이션이나 규격은 자체 JSON-LD 컨텍스트를 사용하여 이 어휘 URL로의 매핑을 정의할 수 있다. 예를 들어 이러한 매핑은 Verifiable Credential Data Integrity 1.0 규격이 정의한 https://w3id.org/security/data-integrity/v2 컨텍스트나, Decentralized Identifiers (DIDs) v1.0 규격이 정의한 https://www.w3.org/ns/did/v1 컨텍스트의 일부다.

4.2.1 컨텍스트 주입

@context 속성은 이 규격의 용어가 처리될 때 구현체들이 동일한 의미론을 사용하도록 보장하는 데 쓰인다. 예를 들어 이는 authentication 같은 속성이 처리되고 그 값(MultikeyJsonWebKey 등)이 사용될 때 중요할 수 있다.

애플리케이션이 제어 식별자 문서를 처리할 때, 문서에 @context 속성이 제공되지 않거나 문서에서 사용된 용어가 @context 속성의 기존 값으로 매핑되지 않으면, 구현체는 https://www.w3.org/ns/cid/v1 값을 갖는 @context 속성이나, Decentralized Identifier v1.1 컨텍스트 (https://www.w3.org/ns/did/v1)처럼 최소한 동일한 선언을 갖는 하나 이상의 컨텍스트를 주입하거나 덧붙여야 한다.

예시 22: @context 속성이 없는 제어 식별자 문서
{
  // The @context declaration is missing in this controlled identifier document
  "id": "https://controller.example/101",
  "verificationMethod": [{
    "id": "https://controller.example/101#key-203947",
    "type": "JsonWebKey",
    "controller": "https://controller.example/101",
    "publicKeyJwk": {
      "kid": "key-203947",
      "kty": "EC",
      "crv": "P-256",
      "alg": "ES256",
      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
    }
  }],
  "authentication": ["#key-203947"]
}

JSON-LD를 사용할 의도가 없는 구현체는 문서 최상위에 @context 선언을 포함하지 않기로 선택할 수 있다. @context 값이나 JSON-LD 프로세서가 사용되든 아니든, 적합 프로세서가 해석하는 적합 문서에 표현된 모든 속성과 값의 의미론은 동일하다. 두 방식 중 어느 쪽으로 처리되든 문서 사이의 의미론에 차이가 있다면 그것은 구현 버그이거나 규격 버그다.

4.3 데이터 타입

이 절은 이 규격이 사용하는 데이터 타입을 정의한다.

4.3.1 multibase 데이터 타입

Multibase 인코딩된 문자열은 이진 데이터를 ASCII와 같은 출력 가능한 형식으로 인코딩하는 데 사용되며, 이는 이진 값을 직접 표현할 수 없는 환경에서 유용하다. 이 규격은 이 인코딩을 활용한다. RDF [RDF-CONCEPTS]처럼 문자열 값에 대한 데이터 타입을 지원하는 환경에서는, Multibase 인코딩된 내용을 데이터 타입이 https://w3id.org/security#multibase로 설정된 리터럴 값을 사용하여 나타낸다.

multibase 데이터 타입은 다음과 같이 정의된다:

이 데이터 타입을 나타내는 URL
https://w3id.org/security#multibase
어휘 공간(lexical space)
Multibase 헤더로 시작하고 나머지 문자들이 해당 base 인코딩 알파벳에서 허용되는 문자로 구성된 모든 문자열.
값 공간(value space)
모든 정수라는 표준 수학 개념.
어휘-값 매핑
어휘 공간의 임의의 원소는 어휘 문자열의 첫 Multibase 헤더에 연관된 base 디코딩 알파벳에 기반하여 값을 base 디코딩함으로써 값 공간으로 매핑된다.
정규 매핑
정규 매핑은 어휘-값 매핑을 사용하는 것으로 이루어진다.

5. 보안 고려사항

이 부분은 비규범적입니다.

이 절은 이 규격을 사용하는 사람들이 이 기술을 운영 환경에 배포하기 전에 고려할 것을 권하는 다양한 보안 고려사항을 담고 있다. 이 문서에 기술된 기술은 많은 IETF 표준이 사용하고 [RFC3552]에 문서화된 위협 모델 아래에서 동작하도록 설계되었다. 이 절은 [RFC3552]의 여러 고려사항과, 이 규격에 고유한 다른 고려사항을 상술한다.

5.1 제어권과 결속 증명

디지털 세계나 물리적 세계의 엔티티를 식별자, 제어 식별자 문서, 또는 암호학적 자료에 결속하려면 이 규격이 상정하는 보안 프로토콜의 사용이 필요하다. 다음 절들은 몇 가지 가능한 시나리오와, 그 안의 엔티티가 인증이나 인가를 목적으로 식별자나 제어 식별자 문서에 대한 제어를 어떻게 증명할 수 있는지를 기술한다.

5.1.1 식별자 및/또는 제어 식별자 문서의 제어권 증명

식별자 및/또는 제어 식별자 문서에 대한 제어를 증명하는 것은 원격 시스템에 접근할 때 유용하다. 암호학적 디지털 서명은 제어 식별자 문서와 관련된 특정 보안 프로토콜을 암호학적으로 검증 가능하게 해준다. 이러한 목적을 위해 이 규격은 2.3.1 인증2.3.4 역량 호출(Capability Invocation)에서 유용한 검증 관계를 정의한다. 검증 방법에 연관된 비밀 암호학적 자료는 인증이나 인가 보안 프로토콜의 일부로서 암호학적 디지털 서명을 생성하는 데 사용될 수 있다.

5.1.2 물리적 신원에의 결속

식별자나 제어 식별자 문서는 본질적으로 어떤 개인 데이터도 담지 않으며, 비공개 엔티티는 제어 식별자 문서에 개인 데이터를 공개하지 않을 것을 강력히 권한다.

식별자를 사람이나 조직의 물리적 신원에 결속하는 것을, 정부와 같은 신뢰된 권위체가 증명 가능하게 주장하는 방식으로 표현하는 것이 유용할 수 있다. 이 규격은 이러한 목적을 위해 2.3.2 어써션(Assertion) 검증 관계를 제공한다. 이 기능은 사적이면서도 하나 이상의 관할권에서 법적으로 집행 가능하다고 간주될 수 있는 상호작용을 가능하게 한다. 그러한 결속을 확립하는 것은 프라이버시 고려사항과 신중하게 균형을 맞춰야 한다(6. 프라이버시 고려사항 참고).

식별자를 사람이나 조직과 같은 물리적 세계의 무언가에 결속하는 과정은 — 예를 들어 그 식별자와 동일한 주체를 갖는 검증가능한 크리덴셜을 사용하여 — 이 규격이 상정하는 것이며 Verifiable Credentials Data Model v2.0에서 더 자세히 정의된다.

5.2 식별자 모호성

식별자가 가리키는 주체가 제어를 증명하는 경우에도, 그 주체의 해석은 여전히 맥락에 따라 달라지며 잠재적으로 모호하다.

예를 들어 어느 학교가 https://controller.example/abc주체 식별자로 사용하여 컴퓨터 과학 입문의 교사에 관한 검증가능한 크리덴셜을 발급하면서, "https://controller.example/abc컴퓨터 과학 입문의 교사다"와 "https://controller.example/abc는 학교 컴퓨터실 접근을 통제한다. 접근을 요청하려면 그들에게 연락하라"라고 말할 수 있다.

이 사용에서는 https://controller.example/abc가 특정 교사를 가리키는지 아니면 현재의 교사가 누구든 그를 가리키는지 모호하다. 추가 진술이 있어야만 그 차이를 분간할 수 있을지 모른다. 하지만 여전히 까다롭다. 예를 들어 다음 진술의 주체는 여전히 모호하다:

예시 23: https://controller.example/abc의 이름에 관한 진술을 RDF 트리플로 표현
<https://controller.example/abc>
  <https://schema.org/name>
    "Bob Smith" .

https://controller.example/abc가 특정 인간을 가리킨다면, 그 진술은 그 이름으로 식별되는 특정 인간에 관한 어테스테이션으로 받아들여진다. 그러나 https://controller.example/abc가 _현재의_ 교사를 가리키는 데 사용된다면, 그것은 현재의 교사가 실제로 그 이름을 가지고 있는 경우에도 유효하다. 이 경우 모호성은 중요하지 않다.

그러나 다음과 같은 진술에서는 그 차이가 매우 중요해진다.

이 진술을 영어로 옮기면 "https://controller.example/abc가 가리키는 사람은 캘리포니아 형법 647b조로 유죄 판결을 받았다"가 될 수 있다. 그런데 우리가 뜻한 사람은 누구인가? 그 학교의 컴퓨터 과학 교사 중 한 명, 일부, 또는 전원이 PenalCode647b 위반으로 유죄 판결을 받았다고 말하려던 것인가? 아니면 특정 개별 교사, 아마도 "Bob Smith"라는 이름의 교사가 그 범죄로 유죄 판결을 받았다고 말하려던 것인가?

이 문제는 주체검증가능한 크리덴셜의 발급에 근본적으로 관여하지 않은 상황에서 특히 어렵다. 예를 들어 어떤 식별자가 학교에서 교사를 가리키는 데 사용되고, 학생이나 학부모가 교사와 학교 모두 관여하지 않은 채 그 식별자를 사용하여 그 교사에 관한 진술을 할 수 있다. 이런 경우, 예컨대 "컴퓨터 과학 수업의 현재 교사 누구든"이라는 학교가 의도한 의미의 미묘한 뉘앙스가 사라지고, 그 식별자가 학부모와 학생에 의해 특정 교사를 가리키는 데 오용되는 것을 쉽게 상상할 수 있으며, 이는 학교도 교사도 그 대화를 알지 못하는 맥락에서 일어날 가능성이 크다.

자연어에서는 이러한 모호성이 흔히 쉽게 무시되거나 바로잡힌다. 디지털 매체에서는 의도된 지시 대상을 확정하기 위해 맥락을 평가하는 것이 매우 중요한데, 특히 서로 다른 발급자가 서로 다른 맥락에서 식별자를 사용할 때 — 예를 들어 학교는 공식 학교 웹사이트에서, 학부모와 학생은 비공식 소셜 네트워킹 앱에서 사용할 때 — 그렇다.

요컨대, 특정 식별자주체에 대한 어떤 특정 해석에 의존할 때는 식별자가 생성되고 사용되는 맥락을 고려해야 한다.

5.3 키와 서명 만료

탈중앙 아키텍처에서는 암호학적 자료나 암호학적 디지털 서명의 만료 정책을 집행할 중앙 권위체가 없을 수 있다. 따라서 요청 당사자가 암호학적 자료가 사용된 시점에 만료되지 않았음을 검증하는 것은 검증 라이브러리와 같은 지원 소프트웨어를 통해서다. 요청 당사자는 자신의 검증 과정에 대한 입력에 더하여 자신만의 만료 정책을 적용할 수 있다. 예를 들어 어떤 요청 당사자는 5분 전의 인증을 받아들이는 반면, 고정밀 시간 소스에 접근할 수 있는 다른 요청 당사자는 인증이 지난 500밀리초 이내에 타임스탬프 되기를 요구할 수 있다.

레거시 암호학적 디지털 서명을 검증하는 것과 같이, 이미 만료된 암호학적 자료의 사용을 연장할 정당한 필요가 있는 요청 당사자도 있다. 이러한 시나리오에서 요청 당사자는 자신의 검증 소프트웨어에 암호 키 자료 만료를 무시하도록 지시하거나, 암호 키 자료가 사용된 시점에 만료되었는지를 판정하도록 지시할 수 있다.

5.4 검증 방법 교체

교체(rotation)는 새로운 검증 방법제어 식별자 문서에 추가된 후 기존 검증 방법에 연관된 비밀 암호학적 자료를 비활성화하거나 파기할 수 있게 하는 관리 과정이다. 이후로는 제어자가 기존 비밀 암호학적 자료를 사용하여 생성했을 새로운 증명을 이제 대신 새로운 암호학적 자료를 사용하여 생성할 수 있고, 새로운 검증 방법을 사용하여 검증할 수 있다.

교체는 검증 방법 침해에 대비하는 유용한 메커니즘인데, 제어자가 검증 방법을 자주 교체하면 침해된 단일 검증 방법이 공격자에게 갖는 가치가 줄어들기 때문이다. 교체 직후에 폐기를 수행하는 것은 메시지 암호화와 인증에 관여하는 것과 같이 제어자가 수명이 짧은 검증에 지정하는 검증 방법에 유용하다.

검증 방법 교체의 사용을 고려할 때 다음 고려사항이 유용할 수 있다:

5.5 검증 방법 폐기

폐기(revocation)는 기존 검증 방법에 연관된 비밀 암호학적 자료를 비활성화하여, 그것이 새로운 증명을 생성하는 유효한 형태가 되기를 멈추게 하는 관리 과정이다.

폐기는 검증 방법 침해에 대응하는 유용한 메커니즘이다. 교체 직후에 폐기를 수행하는 것은 메시지 암호화와 인증에 관여하는 것과 같이 제어자가 수명이 짧은 검증에 지정하는 검증 방법에 유용하다.

검증 방법에 연관된 비밀이 침해되면 공격자는 제어 식별자 문서에서 제어자가 표현한 검증 관계에 따라, 예를 들어 인증을 위해 그 비밀을 사용할 수 있다. 공격자의 비밀 사용은 검증 방법이 등록된 시점부터 폐기된 시점까지 정당한 제어자의 사용과 구별되지 않을 수 있다.

검증 방법 폐기의 사용을 고려할 때 다음 고려사항이 유용할 수 있다:

5.5.1 폐기 의미론

검증자는 폐기된 검증 방법의 증명이나 서명을 받아들이지 않기로 선택할 수 있지만, 어떤 검증이 폐기된 검증 방법으로 이루어졌는지 아는 것은 보기보다 까다롭다. 일부 감사 시스템은 특정 시점의 식별자 상태나 제어 식별자 문서의 특정 버전을 되돌아볼 수 있는 능력을 제공한다. 그러한 기능이 암호학적으로 검증 가능한 진술이 이루어졌을 때 존재했던 시간이나 식별자 버전을 신뢰성 있게 판정하는 방법과 결합되면, 폐기는 그 진술을 무효로 만들지 않는다. 이는 디지털 서명을 사용하여 구속력 있는 약속을 하는, 예컨대 담보 대출에 서명하는 것의 기반이 될 수 있다.

이러한 조건이 충족되면 폐기는 소급되지 않는다. 그것은 그 방법의 향후 사용만을 무효화한다.

그러나 그러한 의미론이 안전하려면, 두 번째 조건 — 어써션이 이루어진 시점에 제어 식별자 문서의 상태가 무엇이었는지 알 수 있는 능력 — 이 적용될 것으로 기대된다. 그 보장이 없으면, 누군가가 폐기된 키를 발견하여 그것을 사용해 과거의 날짜를 위조하여 암호학적으로 검증 가능한 진술을 할 수 있다.

일부 감사 시스템은 식별자의 현재 상태 조회만 허용한다. 이것이 사실이거나, 암호학적으로 검증 가능한 진술이 이루어진 시점의 식별자 상태를 신뢰성 있게 판정할 수 없을 때는, 현재 시점을 제외한 시간에 관한 상태의 고려를 일절 허용하지 않는 것이 유일하게 안전한 방침이다. 이 접근법을 취하는 식별자 생태계는 본질적으로 암호학적으로 검증 가능한 진술을, 제어자가 언제든 무효화할 수 있는 일시적 토큰으로 제공한다.

5.6 Multiformat 선택

Multiformats는 자기 기술적 데이터를 가능하게 한다. 데이터가 Multiformat임이 알려져 있다면, 데이터 시작 부분에 표현된 몇 개의 간결한 헤더 바이트를 읽어 그 정확한 타입을 판정할 수 있다. Multibase, Multihash, Multikey는 이 규격이 정의하는 Multiformat의 유형이다.

Multiformats 규격이 존재하는 이유는 애플리케이션 개발자가 서로 다른 사용 사례와 그 요구사항에 기반하여 서로 다른 base 인코딩 함수, 암호 해싱 함수, 암호 키 형식 등을 적절히 선택하기 때문이다. 세상의 어떤 단일 base 인코딩 함수, 암호 해싱 함수, 암호 키 형식도 모든 요구사항 집합을 충족한 적이 없다. Multiformats는 자기 문서화 데이터와 문서 안에서 임의의 base 인코딩, 암호 해시, 암호 키 형식을 인코딩하거나 탐지하는 대안적 수단을 제공한다.

상호 운용성을 높이기 위해, 규격 작성자는 특정 애플리케이션이나 생태계에 사용할 Multiformat의 수를 최소화하되 — 최적으로는 단 하나만 선택하도록 — 강력히 권한다.

5.7 제어 식별자 문서 내 암호화 데이터

암호화 알고리즘은 암호학과 컴퓨팅 성능의 발전으로 인해 깨지는 것으로 알려져 왔다. 구현자는 제어 식별자 문서에 놓인 어떤 암호화 데이터든 결국에는 그 암호화 데이터에 접근 가능한 동일한 대상에게 평문으로 제공될 수 있다고 가정할 것을 권한다. 이는 제어 식별자 문서가 공개된 경우 특히 그러하다.

제어 식별자 문서의 전부 또는 일부를 암호화하는 것은 데이터를 장기적으로 보호하는 적절한 수단이 아니다. 마찬가지로 제어 식별자 문서에 암호화 데이터를 놓는 것은 개인 데이터를 보호하는 적절한 수단이 아니다.

위의 유의사항을 감안할 때, 암호화 데이터가 제어 식별자 문서에 포함된다면, 구현자는 암호화 데이터와 연관 당사자 사이의 관계를 추론하는 데 사용될 수 있는 어떤 상관 가능한 정보도 연관시키지 않을 것을 권한다. 상관 가능한 정보의 예로는 수신 당사자의 공개키, 수신 당사자의 통제 아래 있는 것으로 알려진 디지털 자산에 대한 식별자, 또는 수신 당사자에 대한 사람이 읽을 수 있는 설명이 있다.

5.8 콘텐츠 무결성 보호

이미지, 웹 페이지, 스키마와 같은 외부 기계 판독 가능 콘텐츠에 대한 링크를 포함하는 제어 식별자 문서는 변조에 취약하다. 외부 링크는 Verifiable Credentials Data Model v2.0 규격에 기술된 것과 같이 관련 자원을 보호하는 메커니즘을 사용하여 무결성 보호할 것을 강력히 권한다. 외부 링크를 무결성 보호할 수 없고 제어 식별자 문서의 무결성이 그 외부 링크에 의존한다면, 그 외부 링크는 피해야 한다.

제어 식별자 문서 자체의 무결성이 영향을 받을 수 있는 외부 링크의 한 예는, 존재할 경우 JSON-LD 컨텍스트 [JSON-LD11]다. 침해에 대비하기 위해, JSON-LD를 사용하는 제어 식별자 문서 소비자는 JSON-LD 컨텍스트의 로컬 정적 사본을 캐시하거나, 외부 JSON-LD 컨텍스트의 안전한 버전에 연관된 것으로 알려진 암호 해시에 대해 외부 컨텍스트의 무결성을 검증할 것을 권한다.

5.9 제어자의 무결성 보호

2.1.2 제어자 절에 기술된 대로, 이 규격은 controller 속성의 사용을 통해 제어 식별자 문서의 변경 제어권을 외부 제어 식별자 문서에 기술된 엔티티에게 위임하는 메커니즘을 포함한다.

변경 제어권 위임은, 한 엔티티의 보살핌이 다른 엔티티(들)의 책임인 경우와, 어떤 엔티티가 다른 엔티티가 계정 복구 서비스를 제공하기를 바라는 경우 등 여러 사용 사례를 다룬다. 그러한 시나리오에서는 후견인이 자신의 키 자료 교체를 관리하도록 허용하는 것이 유익할 수 있다. 또한 위임자가 원격 문서를 알려진 정상 값으로 "고정(pin)"하기 위해 원격 제어 식별자 문서의 암호 해시를 연관시키는 것이 유익할 수 있다.

이 문서는 암호학적으로 보호된 URL에 대한 특정 메커니즘을 지정하지 않지만, Verifiable Credentials Data Model v2.0relatedResource 속성과 Verifiable Credential Data Integrity 1.0digestMultibase 속성이 그러한 보호를 제공할 수 있는 메커니즘에 활용될 수 있다.

5.10 보증 수준

인증 이벤트의 보안 맥락에 관한 추가 정보는, 특히 금융 및 공공 부문과 같은 규제 영역에서 규정 준수를 이유로 흔히 요구된다. 이 정보는 흔히 보증 수준(Level of Assurance, LOA)이라고 불린다. 예로는 비밀 암호학적 자료의 보호, 신원 증명 과정, 인증기(authenticator)의 폼 팩터가 있다.

Payment services (PSD 2) eIDAS는 보안 맥락에 그러한 요구사항을 도입한다. 보증 수준 프레임워크는 eIDAS, NIST 800-63-3, ISO/IEC 29115:2013과 같은 규정과 표준에 의해 분류되고 정의되며, 여기에는 보안 맥락에 대한 요구사항과 그것을 달성하는 방법에 대한 권고가 포함된다. 이는 FIDO2/WebAuthn이 요구사항을 충족할 수 있는 강한 사용자 인증을 포함할 수 있다.

일부 규제 시나리오는 특정 보증 수준의 구현을 요구한다. 어써션인증을 수행하는 데 사용되는 검증 관계가 이러한 상황 중 일부에서 사용될 수 있으므로, 적용된 보안 맥락에 관한 정보를 표현하여 검증자에게 제공해야 할 수 있다. 이 정보를 제어 식별자 문서 데이터 모델에 인코딩할지 여부와 그 방법은 이 규격의 범위 밖이다. 관심 있는 독자는 1) 그 정보가 검증가능한 크리덴셜 [VC-DATA-MODEL-2.0]을 사용하여 전송될 수 있고, 2) 제어 식별자 문서 데이터 모델이 이 정보를 포함하도록 확장될 수 있음에 유의할 수 있다.

5.11 인증 및 인가를 위한 서비스 엔드포인트

제어 식별자 문서주체의 인증이나 인가를 위한 서비스를 공개한다면(2.1.4 서비스 절 참고), 그 서비스 엔드포인트가 지원하는 인증 및/또는 인가 프로토콜의 요구사항을 준수하는 것은 서비스 제공자, 주체, 요청 당사자의 책임이다.

6. 프라이버시 고려사항

이 부분은 비규범적입니다.

제어 식별자 문서제어자가 직접 관리하도록 설계되었으므로, 설계에 의한 프라이버시(Privacy by Design) [PRIVACY-BY-DESIGN] 원칙을 제어 식별자 문서의 모든 측면에 적용하는 것이 매우 중요하다. 이 규격의 개발 전반에 걸쳐 이 일곱 가지 원칙이 모두 적용되었다. 이 규격에서 사용한 설계는 추가 프라이버시 보호 장치를 권고하거나 적용할 등록기관, 호스팅 회사, 또는 다른 중개 서비스 제공자가 있다고 가정하지 않는다. 이 규격의 프라이버시는 사후 구제가 아니라 예방적이며, 내장된 기본값이다. 다음 절들은 제어 식별자 문서를 활용하는 시스템을 구축할 때 구현자가 유용하다고 느낄 수 있는 프라이버시 고려사항을 다룬다.

6.1 개인 데이터를 비공개로 유지하기

제어 식별자 문서가 특정 개인에 관한 것이고 공개용이라면, 제어 식별자 문서에 개인 생체 데이터나 신상 데이터를 담지 않는 것이 결정적으로 중요하다. 개인 데이터가 공개 암호 키나 IP 주소와 같은 가명 정보를 포함할 수 있는 것은 사실이지만, 그런 종류의 정보를 공개하는 것은 개인의 전체 이름, 프로필 사진, 소셜 미디어 계정을 제어 식별자 문서에 공개하는 것과 같은 즉각적인 프라이버시 위험을 만들지는 않는다. 더 나은 대안은 그러한 개인 데이터를 검증가능한 크리덴셜 [VC-DATA-MODEL-2.0]이나 사적이고 안전한 통신 채널로 전송되는 다른 데이터 형식과 같은 다른 수단을 통해 전송하는 것이다.

6.2 동일 출처 정책과의 관계

동일 출처 정책(Same-origin policy)은 기본적으로 정보를 동일한 웹 도메인으로 제한하는 보안 및 프라이버시 개념이다. Web Authentication:An API for accessing Public Key Credentials Level 1과 같이 이 정책을 암호 키로 확장하는 메커니즘이 있다. 암호 키가 특정 도메인에 결속될 때, 이를 때때로 쌍별 식별자(pairwise identifier)라고 부른다.

동일 출처 정책은 교차 출처 자원 공유(Cross-origin resource sharing)(CORS)와 같은 다양한 사용 사례를 위해 재정의될 수 있다. 이 규격은 검증 방법과 서비스 엔드포인트의 교차 출처 자원 공유를 허용하는데, 이는 상관 가능한 식별자가 출처 간에 공유될 수 있음을 의미한다. 자원 공유는 긍정적 보안 결과(암호 키 등록 부담 감소)로 이어질 수 있지만, 부정적 프라이버시 결과(추적)로도 이어질 수 있다. 이 규격을 사용하는 이들은 각 접근법에 절충점이 있으며 개인이나 조직의 필요에 따라 보안과 프라이버시를 극대화하는 메커니즘을 사용하라는 경고를 받는다. 동일 출처에 결속된 암호 키로 충분한 경우 모든 사용 사례에 제어 식별자 문서를 사용하는 것이 항상 유리한 것은 아니다.

6.3 식별자 상관관계 위험

식별자는 원치 않는 상관관계에 사용될 수 있다. 제어자는 각 관계나 상호작용 도메인에 고유한 쌍별 식별자를 사용하여 이 프라이버시 위험을 완화할 수 있다. 결과적으로 각 식별자는 가명처럼 작동한다. 쌍별 식별자는 맥락 간 상관관계가 명시적으로 요구될 때에만 둘 이상의 당사자와 공유되면 된다. 쌍별 식별자가 기본값이라면, 식별자를 공개적으로 게시하거나 여러 당사자와 공유할 유일한 필요는 제어자 및/또는 주체가 공개 식별과 상호작용 도메인 간 상관관계를 명시적으로 원할 때뿐이다.

6.4 제어 식별자 문서 상관관계 위험

쌍별 식별자의 반(反)상관관계 보호는 대응하는 제어 식별자 문서의 데이터가 상관될 수 있으면 쉽게 무력화된다. 예를 들어 여러 제어 식별자 문서에서 동일한 검증 방법을 사용하는 것은 동일한 식별자를 사용하는 것만큼 많은 상관관계 정보를 제공할 수 있다. 따라서 쌍별 식별자를 위한 제어 식별자 문서도, 검증 방법이 그 쌍별 관계에 고유하도록 보장하는 것과 같이 쌍별로 고유한 정보를 사용해야 한다.

6.5 주체 분류

주체가 어떤 타입이거나 어떤 성격의 사물인지를 명시적으로 또는 추론을 통해 나타내는 데 사용될 수 있는 속성을 제어 식별자 문서에 추가하는 것은 위험하며, 특히 주체가 사람인 경우 그러하다.

그러한 속성은 잠재적으로 제어 식별자 문서에 개인 데이터(6.1 개인 데이터를 비공개로 유지하기 참고)나 상관 가능한 데이터( 6.3 식별자 상관관계 위험6.4 제어 식별자 문서 상관관계 위험 참고)가 존재하는 결과를 낳을 수 있을 뿐만 아니라, 특정 식별자를 특정 연산이나 기능에 포함하거나 배제하는 방식으로 묶는 데에도 사용될 수 있다.

제어 식별자 문서타입 정보를 포함하는 것은 IoT 기기와 같이 사람이 아닌 엔티티인 주체에 대해서도 개인 프라이버시 피해를 초래할 수 있다. 제어자를 중심으로 그러한 정보를 집합하는 것은 일종의 디지털 핑거프린트로 작용할 수 있으며, 이는 피하는 것이 가장 좋다.

이러한 위험을 최소화하기 위해, 제어 식별자 문서의 모든 속성은 식별자 사용과 관련된 검증 방법검증 관계를 표현하기 위한 것이어야 한다.

6.6 서비스 프라이버시

제어자제어 식별자 문서에 적어도 하나의 서비스를 선택적으로 표현할 수 있는 능력은 그들의 제어권과 주체성을 높인다. 제어 식별자 문서에 추가되는 각 엔드포인트는 엔드포인트 설명 간의 상관관계 때문이든, 서비스가 인가 메커니즘으로 보호되지 않기 때문이든, 또는 그 둘 다이든 프라이버시 위험을 더한다.

제어 식별자 문서는 흔히 공개되며, 표준화되어 있으므로 효율적으로 저장되고 색인될 것이다. 이 위험은 제어 식별자 문서가 불변의 검증가능한 데이터 레지스트리에 게시되면 증가한다. URL이 참조하는 제어 식별자 문서의 이력에 대한 접근은 표준의 사용을 통해 더 효율적으로 이루어지는 일종의 트래픽 분석을 가능하게 한다.

하나의 제어 식별자 문서에 여러 서비스를 포함함으로써 발생하는 추가 프라이버시 위험의 정도는 추정하기 어려울 수 있다. 프라이버시 피해는 대체로 의도치 않은 결과다. URL은 개별 사람, 가구, 동호회, 고용주와 연관될 수 있는 문서, 서비스, 스키마, 그 밖의 것들을 가리킬 수 있으며 — 그 서비스의 상관관계는 강력한 감시 및 추론 도구가 될 수 있다. 이 잠재적 피해의 한 예는 https://example.co.uk과 같은 여러 흔한 국가 수준 최상위 도메인이 주체의 대략적 위치를 더 높은 확률로 추론하는 데 사용될 수 있을 때 볼 수 있다.

7. 접근성 고려사항

다음 절은 이 규격을 구현하는 개발자가 자신의 소프트웨어를 서로 다른 인지적·운동적· 시각적 필요를 가진 사람들이 사용할 수 있도록 보장하기 위해 고려할 것을 강력히 권하는 접근성 고려사항을 기술한다. 일반적으로 이 규격은 시스템 소프트웨어가 사용하며 개인을 접근성 고려사항의 대상이 되는 정보에 직접 노출하지 않는다. 그러나 개인이 이 규격이 표현하는 정보에 간접적으로 노출될 수 있는 경우가 있으므로, 그러한 상황을 위해 아래 지침을 제공한다.

7.1 시간 값 표현하기

이 규격은 증명의 유효 기간과 관련된 날짜와 시간의 표현을 가능하게 한다. 이 정보는 증명이 처리되어 허용되는 시간 범위를 벗어난 것으로 감지되면 개인에게 간접적으로 노출될 수 있다. 이러한 날짜와 시간을 개인에게 노출할 때, 구현자는 표시 소프트웨어에서 날짜와 시간을 표현할 때의 문화적 규범과 로케일을 고려할 것을 강력히 권한다. 이러한 고려사항에 더하여, 정보를 받는 개인의 인지적 부담을 덜어주는 방식으로 시간 값을 표현하는 것이 제안되는 모범 사례다.

예를 들어 특정 디지털 서명 정보 집합의 만료 날짜를 전달할 때, 구현자는 만료 시각을 정확성에 최적화된 표현보다는 이해하기 쉬운 표현을 사용하여 제시할 것을 강력히 권한다. 만료 시각을 "이 티켓은 3일 전에 만료되었습니다."로 제시하는 것이 "이 티켓은 2023년 7월 25일 오후 3시 43분에 만료되었습니다."와 같은 문구보다 선호된다. 전자는 후자의 시각보다 이해하기 쉬운 상대적 시간을 제공하는데, 후자는 개인이 머릿속으로 계산을 해야 하고 그런 계산을 할 수 있다고 가정한다.

A. IANA 고려사항

이 부분은 비규범적입니다.

이 절은 검토, 승인, IANA 등록을 위해 Internet Engineering Steering Group (IESG)에 제출될 것이다.

A.1 application/cid

이 규격은 제어 식별자 문서 형식을 따르는 문서를 식별하기 위해 application/cid 미디어 타입을 등록한다.

타입 이름: application
서브타입 이름: cid
필수 매개변수: 없음
조각 식별자 고려사항: Controlled Identifiers v1.0 규격의 3.4 조각 해석 절에 정의된 대로.
인코딩 고려사항: application/cid 미디어 타입을 사용하는 자원은 application/json 미디어 타입의 모든 요구사항을 준수해야 하며, 따라서 The JavaScript Object Notation (JSON) Data Interchange Format 11절에 지정된 것과 동일한 인코딩 고려사항의 적용을 받는다.
보안 고려사항: Controlled Identifiers v1.0 규격의 5. 보안 고려사항 절에 정의된 대로.
연락처: W3C Verifiable Credentials Working Group public-vc-wg@w3.org

B. 예시

이 부분은 비규범적입니다.

이 절은 규격에서 소개된 개념들에 대한 더 자세한 예시를 담고 있다.

B.1 Multikey 예시

이 부분은 비규범적입니다.

이 절은 테스트 값을 찾는 개발자에게 유용할 수 있는 다양한 Multikey 예시를 담고 있다.

예시 25: Multikey로 인코딩된 P-256 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://multikey.example/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://multikey.example/issuer/123",
  "publicKeyMultibase": "zDnaerx9CtbPJ1q36T5Ln5wYt3MQYeGRG5ehnPAmxcf5mDZpv"
}
예시 26: Multikey로 인코딩된 P-384 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://multikey.example/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://multikey.example/issuer/123",
  "publicKeyMultibase": "z82LkvCwHNreneWpsgPEbV3gu1C6NFJEBg4srfJ5gdxEsMGRJUz2sG9FE42shbn2xkZJh54"
}
예시 27: Multikey로 인코딩된 Ed25519 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://multikey.example/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://multikey.example/issuer/123",
  "publicKeyMultibase": "z6Mkf5rGMoatrSj1f4CyvuHBeXJELe9RPdzo2PKGNCKVtZxP"
}
예시 28: Multikey로 인코딩된 BLS12-381 G2 그룹 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://multikey.example/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://multikey.example/issuer/123",
  "publicKeyMultibase": "zUC7EK3ZakmukHhuncwkbySmomv3FmrkmS36E4Ks5rsb6VQSRpoCrx6Hb8e2Nk6UvJFSdyw9NK1scFXJp21gNNYFjVWNgaqyGnkyhtagagCpQb5B7tagJu3HDbjQ8h5ypoHjwBb"
}
예시 29: 제어 식별자 문서에서 Multikey로 인코딩된 여러 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123",
  "verificationMethod": [{
    "id": "https://multikey.example/issuer/123#key-1",
    "type": "Multikey",
    "controller": "https://multikey.example/issuer/123",
    "publicKeyMultibase": "zDnaerx9CtbPJ1q36T5Ln5wYt3MQYeGRG5ehnPAmxcf5mDZpv"
  }, {
    "id": "https://multikey.example/issuer/123#key-2",
    "type": "Multikey",
    "controller": "https://multikey.example/issuer/123",
    "publicKeyMultibase": "z6Mkf5rGMoatrSj1f4CyvuHBeXJELe9RPdzo2PKGNCKVtZxP"
  }, {
    "id": "https://multikey.example/issuer/123#key-3",
    "type": "Multikey",
    "controller": "https://multikey.example/issuer/123",
    "publicKeyMultibase": "zUC7EK3ZakmukHhuncwkbySmomv3FmrkmS36E4Ks5rsb6VQSRpoCrx6Hb8e2Nk6UvJFSdyw9NK1scFXJp21gNNYFjVWNgaqyGnkyhtagagCpQb5B7tagJu3HDbjQ8h5ypoHjwBb"
  }],
  "authentication": [
    "https://controller.example/123#key-1"
  ],
  "assertionMethod": [
    "https://controller.example/123#key-2"
    "https://controller.example/123#key-3"
  ],
  "capabilityDelegation": [
    "https://controller.example/123#key-2"
  ],
  "capabilityInvocation": [
    "https://controller.example/123#key-2"
  ]
}
예시 30: Multikey로 인코딩된 SM2 공개키
{
  "id": "https://multikey.example/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://multikey.example/issuer/123",
  "publicKeyMultibase": "zEPJc1vCfbG2aoZn8f3U8ggYRL4ZFfF63ZA3qFSk81WJxnCQr"
}

B.2 JsonWebKey 예시

이 부분은 비규범적입니다.

이 절은 테스트 값을 찾는 개발자에게 유용할 수 있는 다양한 JsonWebKey 예시를 담고 있다.

예시 31: JsonWebKey로 인코딩된 P-256 공개키
{
  "id": "https://jsonwebkey.example/issuer/123#key-0",
  "type": "JsonWebKey",
  "controller": "https://jsonwebkey.example/issuer/123",
  "publicKeyJwk": {
    "kty": "EC",
    "crv": "P-256",
    "x": "Ums5WVgwRkRTVVFnU3k5c2xvZllMbEcwM3NPRW91ZzN",
    "y": "nDQW6XZ7b_u2Sy9slofYLlG03sOEoug3I0aAPQ0exs4"
  }
}
예시 32: JsonWebKey로 인코딩된 P-384 공개키
{
  "id": "https://jsonwebkey.example/issuer/123#key-0",
  "type": "JsonWebKey",
  "controller": "https://jsonwebkey.example/issuer/123",
  "publicKeyJwk": {
    "kty": "EC",
    "crv": "P-384",
    "x": "VUZKSlUwMGdpSXplekRwODhzX2N4U1BYdHVYWUZsaXVDR25kZ1U0UXA4bDkxeHpE",
    "y": "jq4QoAHKiIzezDp88s_cxSPXtuXYFliuCGndgU4Qp8l91xzD1spCmFIzQgVjqvcP"
  }
}
예시 33: JsonWebKey로 인코딩된 Ed25519 공개키
{
  "id": "https://jsonwebkey.example/issuer/123#key-0",
  "type": "JsonWebKey",
  "controller": "https://jsonwebkey.example/issuer/123",
  "publicKeyJwk": {
    "kty": "OKP",
    "crv": "Ed25519",
    "x": "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ"
  }
}
예시 34: JsonWebKey로 인코딩된 BLS12-381 G2 그룹 공개키
{
  "id": "https://jsonwebkey.example/issuer/123#key-0",
  "type": "JsonWebKey",
  "controller": "https://jsonwebkey.example/issuer/123",
  "publicKeyJwk": {
    "kty": "EC",
    "crv": "BLS12381G2",
    "x": "Ajs8lstTgoTgXMF6QXdyh3m8k2ixxURGYLMaYylVK_x0F8HhE8zk0YWiGV3CHwpQEa2sH4PBZLaYCn8se-1clmCORDsKxbbw3Js_Alu4OmkV9gmbJsy1YF2rt7Vxzs6S",
    "y": "BVkkrVEib-P_FMPHNtqxJymP3pV-H8fCdvPkoWInpFfM9tViyqD8JAmwDf64zU2hBV_vvCQ632ScAooEExXuz1IeQH9D2o-uY_dAjZ37YHuRMEyzh8Tq-90JHQvicOqx"
  }
}
예시 35: 제어 식별자 문서에서 JsonWebKey로 인코딩된 여러 공개키
{
  "@context": "https://www.w3.org/ns/cid/v1",
  "id": "https://controller.example/123",
  "verificationMethod": [{
    "id": "https://jsonwebkey.example/issuer/123#key-1",
    "type": "JsonWebKey",
    "controller": "https://jsonwebkey.example/issuer/123",
    "publicKeyJwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "fyNYMN0976ci7xqiSdag3buk-ZCwgXU4kz9XNkBlNUI",
      "y": "hW2ojTNfH7Jbi8--CJUo3OCbH3y5n91g-IMA9MLMbTU"
    }
  }, {
    "id": "https://jsonwebkey.example/issuer/123#key-2",
    "type": "JsonWebKey",
    "controller": "https://jsonwebkey.example/issuer/123",
    "publicKeyJwk": {
      "kty": "EC",
      "crv": "P-521",
      "x": "ASUHPMyichQ0QbHZ9ofNx_l4y7luncn5feKLo3OpJ2nSbZoC7mffolj5uy7s6KSKXFmnNWxGJ42IOrjZ47qqwqyS",
      "y": "AW9ziIC4ZQQVSNmLlp59yYKrjRY0_VqO-GOIYQ9tYpPraBKUloEId6cI_vynCzlZWZtWpgOM3HPhYEgawQ703RjC"
    }
  }, {
    "id": "https://jsonwebkey.example/issuer/123#key-3",
    "type": "JsonWebKey",
    "controller": "https://jsonwebkey.example/issuer/123",
    "publicKeyJwk": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "_eT7oDCtAC98L31MMx9J0T-w7HR-zuvsY08f9MvKne8"
    }
  }],
  "authentication": [
    "https://controller.example/123#key-1"
  ],
  "assertionMethod": [
    "https://controller.example/123#key-2"
    "https://controller.example/123#key-3"
  ],
  "capabilityDelegation": [
    "https://controller.example/123#key-2"
  ],
  "capabilityInvocation": [
    "https://controller.example/123#key-2"
  ]
}

C. Revision History

이 부분은 비규범적입니다.

This section contains the substantive changes that have been made to this specification over time.

This specification was created to generalize the Decentralized Identifiers (DIDs) v1.0 specification to use non-decentralized identifiers and systems, such as HTTPS URLs. As such, much of the content from the Decentralized Identifiers (DIDs) v1.0 specification was copied into this document and generalized through largely editorial changes. The changes since the Decentralized Identifiers (DIDs) v1.0 specification are below:

D. Acknowledgements

이 부분은 비규범적입니다.

The specification authors would like to thank the contributors to the W3C Decentralized Identifiers (DIDs) v1.0 specification upon which this work is based.

The Working Group gratefully acknowledges the work that led to the creation of this specification, and extends sincere appreciation to those individuals that worked on technologies and specifications that deeply influenced our work. In particular, this includes the work of Phil Zimmerman, Jon Callas, Lutz Donnerhacke, Hal Finney, David Shaw, and Rodney Thayer on Pretty Good Privacy (PGP) in the 1990s and 2000s.

In the mid-2010s, preliminary implementations of what would become Decentralized Identifiers were built in collaboration with Jeremie Miller's Telehash project and the W3C Web Payments Community Group's work led by Dave Longley and Manu Sporny. Around a year later, the XDI.org Registry Working Group began exploring decentralized technologies for replacing its existing identifier registry. Some of the first written papers exploring the concept of Decentralized Identifiers can be traced back to the first several Rebooting the Web of Trust workshops convened by Christopher Allen. That work led to a key collaboration between Christopher Allen, Drummond Reed, Les Chasen, Manu Sporny, and Anil John. Anil saw promise in the technology and allocated the initial set of government funding to explore the space. Without the support of Anil John and his guidance through the years, it is unlikely that Decentralized Identifiers would be where they are today. Further refinement at the Rebooting the Web of Trust workshops led to the first implementers documentation, edited by Drummond Reed, Les Chasen, Christopher Allen, and Ryan Grant. Contributors included Manu Sporny, Dave Longley, Jason Law, Daniel Hardman, Markus Sabadello, Christian Lundkvist, and Jonathan Endersby. This initial work was then merged into the W3C Credentials Community Group, incubated further, and then transitioned to the W3C Decentralized Identifiers Working Group for global standardization. That work was then used as the basis for this, more generalized and less decentralized, specification.

Portions of the work on this specification have been funded by the United States Department of Homeland Security's (US DHS) Science and Technology Directorate under contracts HSHQDC-16-R00012-H-SB2016-1-002, and HSHQDC-17-C-00019, as well as the US DHS Silicon Valley Innovation Program under contracts 70RSAT20T00000003, 70RSAT20T00000010/P00001, 70RSAT20T00000029, 70RSAT20T00000030, 70RSAT20T00000033, 70RSAT20T00000045, 70RSAT21T00000016/P00001, 70RSAT23T00000005, 70RSAT23C00000030, and 70RSAT23R00000006. The content of this specification does not necessarily reflect the position or the policy of the U.S. Government and no official endorsement should be inferred.

Portions of the work on this specification have also been funded by the European Union's StandICT.eu program under sub-grantee contract number CALL05/19. The content of this specification does not necessarily reflect the position or the policy of the European Union and no official endorsement should be inferred.

We would also like to thank the base-x software library contributors and the Bitcoin Core developers who wrote the original code, shared under an MIT License, found in Section 3.1 Base Encode and Section 3.2 Base Decode.

Work on this specification has also been supported by the Rebooting the Web of Trust community facilitated by Christopher Allen, Shannon Appelcline, Kiara Robles, Brian Weller, Betty Dhamers, Kaliya Young, Kim Hamilton Duffy, Manu Sporny, Drummond Reed, Joe Andrieu, Heather Vescent, Samantha Chase, Andrew Hughes, Erica Connell, Shigeya Suzuki, and Zaïda Rivai. Development of this specification has also been supported by the W3C Credentials Community Group, which has been Chaired by Kim Hamilton Duffy, Joe Andrieu, Christopher Allen, Heather Vescent, and Wayne Chang. The participants in the Internet Identity Workshop, facilitated by Phil Windley, Kaliya Young, Doc Searls, and Heidi Nobantu Saul, also supported this work through numerous working sessions designed to debate, improve, and educate participants about this specification.

The Working Group thanks the following individuals for their contributions to this specification (in alphabetical order, Github handles start with @ and are sorted as last names): Denis Ah-Kang, Nacho Alamillo, Christopher Allen, Joe Andrieu, Antonio, Phil Archer, George Aristy, Baha, Juan Benet, BigBlueHat, Dan Bolser, Chris Boscolo, Pelle Braendgaard, Daniel Buchner, Daniel Burnett, Juan Caballero, @cabo, Tim Cappalli, Melvin Carvalho, David Chadwick, Wayne Chang, Sam Curren, Hai Dang, Tim Daubenschütz, Oskar van Deventer, Kim Hamilton Duffy, Arnaud Durand, Ken Ebert, Veikko Eeva, @ewagner70, Carson Farmer, Nikos Fotiou, Gabe, Gayan, @gimly-jack, @gjgd, Ryan Grant, Peter Grassberger, Adrian Gropper, Amy Guy, Daniel Hardman, Kyle Den Hartog, Philippe Le Hegaret, Ivan Herman, Michael Herman, Alen Horvat, Dave Huseby, Marcel Jackisch, Mike Jones, Andrew Jones, Tom Jones, jonnycrunch, Gregg Kellogg, Michael Klein, @kdenhartog-sybil1, Paul Knowles, @ktobich, David I. Lehn, Charles E. Lehner, Michael Lodder, @mooreT1881, Dave Longley, Tobias Looker, Wolf McNally, Robert Mitwicki, Mircea Nistor, Grant Noble, Mark Nottingham, @oare, Darrell O'Donnell, Vinod Panicker, Dirk Porsche, Praveen, Mike Prorock, @pukkamustard, Drummond Reed, Julian Reschke, Yancy Ribbens, Justin Richer, Rieks, @rknobloch, Mikeal Rogers, Evstifeev Roman, Troy Ronda, Leonard Rosenthol, Michael Ruminer, Markus Sabadello, Cihan Saglam, Samu, Rob Sanderson, Wendy Seltzer, Mehran Shakeri, Jaehoon (Ace) Shim, Samuel Smith, James M Snell, SondreB, Manu Sporny, @ssstolk, Orie Steele, Shigeya Suzuki, Sammotic Switchyarn, @tahpot, Oliver Terbu, Ted Thibodeau Jr., Joel Thorstensson, Tralcan, Henry Tsai, Rod Vagg, Mike Varley, Kaliya "Identity Woman" Young, Eric Welton, Fuqiao Xue, @Yue, Dmitri Zagidulin, @zhanb, and Brent Zundel.

E. References

E.1 Normative references

[DID-EXTENSIONS-PROPERTIES]
DID Document Property Extensions. Manu Sporny; Markus Sabadello. W3C. 19 February 2025. W3C Working Group Note. URL: https://www.w3.org/TR/did-extensions-properties/
[INFRA]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JOSE-REGISTRIES]
The JSON Object Signing and Encryption (JOSE) Registries. The Internet Assigned Numbers Authority. The Internet Assigned Numbers Authority. W3C Recommendation. URL: https://www.iana.org/assignments/jose
[RDF-CONCEPTS]
Resource Description Framework (RDF): Concepts and Abstract Syntax. Graham Klyne; Jeremy Carroll. W3C. 10 February 2004. W3C Recommendation. URL: https://www.w3.org/TR/rdf-concepts/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee; R. Fielding; L. Masinter. IETF. January 2005. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC6234]
US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF). D. Eastlake 3rd; T. Hansen. IETF. May 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6234
[RFC7515]
JSON Web Signature (JWS). M. Jones; J. Bradley; N. Sakimura. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7515
[RFC7517]
JSON Web Key (JWK). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7517
[RFC7518]
JSON Web Algorithms (JWA). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7518
[RFC7638]
JSON Web Key (JWK) Thumbprint. M. Jones; N. Sakimura. IETF. September 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7638
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9457]
Problem Details for HTTP APIs. M. Nottingham; E. Wilde; S. Dalal. IETF. July 2023. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9457
[SHA3]
SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions. National Institute of Standards and Technology. U.S. Department of Commerce. National Standard. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
[URL]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[VC-DATA-MODEL-2.0]
Verifiable Credentials Data Model v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 20 March 2025. W3C Proposed Recommendation. URL: https://www.w3.org/TR/vc-data-model-2.0/
[XMLSCHEMA11-2]
W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. W3C. 5 April 2012. W3C Recommendation. URL: https://www.w3.org/TR/xmlschema11-2/

E.2 Informative references

[CID]
Controlled Identifiers v1.0. Michael Jones; Manu Sporny. W3C. 20 March 2025. W3C Proposed Recommendation. URL: https://www.w3.org/TR/cid-1.0/
[DID]
Decentralized Identifiers (DIDs) v1.0. Manu Sporny; Amy Guy; Markus Sabadello; Drummond Reed. W3C. 19 July 2022. W3C Recommendation. URL: https://www.w3.org/TR/did-core/
[DID-USE-CASES]
Use Cases and Requirements for Decentralized Identifiers. Joe Andrieu; Phil Archer; Kim Duffy; Ryan Grant; Adrian Gropper. W3C. 17 March 2021. W3C Working Group Note. URL: https://www.w3.org/TR/did-use-cases/
[HTML-RDFA]
HTML+RDFa 1.1 - Second Edition. Manu Sporny. W3C. 17 March 2015. W3C Recommendation. URL: https://www.w3.org/TR/html-rdfa/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 16 July 2020. W3C Recommendation. URL: https://www.w3.org/TR/json-ld11/
[PRIVACY-BY-DESIGN]
Privacy by Design. Ann Cavoukian. Information and Privacy Commissioner. 2011. URL: https://iapp.org/media/pdf/resource_center/pbd_implement_7found_principles.pdf
[RFC3552]
Guidelines for Writing RFC Text on Security Considerations. E. Rescorla; B. Korver. IETF. July 2003. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc3552
[RFC7159]
The JavaScript Object Notation (JSON) Data Interchange Format. T. Bray, Ed. IETF. March 2014. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7159
[TURTLE]
RDF 1.1 Turtle. Eric Prud'hommeaux; Gavin Carothers. W3C. 25 February 2014. W3C Recommendation. URL: https://www.w3.org/TR/turtle/
[VC-DATA-INTEGRITY]
Verifiable Credential Data Integrity 1.0. Ivan Herman; Manu Sporny; Ted Thibodeau Jr; Dave Longley; Greg Bernstein. W3C. 20 March 2025. W3C Proposed Recommendation. URL: https://www.w3.org/TR/vc-data-integrity/
[VC-EXTENSIONS]
Verifiable Credential Extensions. Manu Sporny. W3C. 30 September 2024. W3C Working Group Note. URL: https://www.w3.org/TR/vc-extensions/
[VC-USE-CASES]
Verifiable Credentials Use Cases. Shane McCarron; Joe Andrieu; Matt Stone; Tzviya Siegman; Gregg Kellogg; Ted Thibodeau Jr. W3C. 24 September 2019. W3C Working Group Note. URL: https://www.w3.org/TR/vc-use-cases/
[WEBAUTHN]
Web Authentication:An API for accessing Public Key Credentials Level 1. Dirk Balfanz; Alexei Czeskis; Jeff Hodges; J.C. Jones; Michael Jones; Akshay Kumar; Huakai Liao; Rolf Lindemann; Emil Lundberg. W3C. 4 March 2019. W3C Recommendation. URL: https://www.w3.org/TR/webauthn-1/