Allen Dev Blog

탈중앙화 신원증명 DID
(2) W3C DIDs

탈중앙화 신원증명 DID<br> (2) W3C DIDs

이번 포스트에서는 탈중앙화 신원인증(DID) 에서 W3C Decentralized Identifiers 문서에 정의된 Specification 및 주요 용어에 대한 설명을 하고, 이더리움 기반의 DID 라이브러리를 살펴보도록 하겠습니다.

W3C 에서는 Decentralized Identifiers 를 DIDs 로 줄여서 설명하고 있으며, Verifiable Credentials Ecosystem 등 더 큰 시스템에서 사용하기 위한 컴포넌트라고 설명하고 있습니다.

검증 가능한 크리덴셜(Verifiable Credentials) 에서 Credential주민등록번호같이 인증 주체에 대한 정보, 발행 주체에 대한 정보(정부기관 등), 유효기관 등 Credential 자체에 대한 정보 등을 의미하며, Verifiable 하다는 것은 그 데이터가 신뢰할 수 있는 데이터라는 것을 검증할 수 있다는 것입니다.

(Verifiable Credential 에 대한 자세한 사항은 이후의 포스트에서 다룰 예정입니다)

DID Syntax

W3C 에서는 탈중앙화 식별자(Decentralized Identifier) 의 형태표준화하였습니다. 하나의 DID 는 문자열로 표현할 수 있으며 3개의 파트로 이루어져 있습니다.

DID Scheme 은 이 문자열이 DID 임을 나타내는 prefix 이며, 항상 did 입니다.

DID Method 는 DIDs 및 DID document 가 어떻게 생성되고 업데이트되는지 등을 정의한 것이며, DID 문자열 내에 이 DID 가 사용되는 DID Method 이름이 정의되어야합니다. W3C 공식 문서에 따르면 DID Method 이름은 무조건 소문자이어야 합니다.

DID Method-Specific Identifier는 이 DID Method 내에서 사용되는 식별자를 의미합니다.

DID Subject

DID Subject 은 DID 에 의해 식별되는 주체(Entity) 입니다. DID Subject 는 개인, 그룹, 단체, 시스템 등 식별될 수 있는 객체가 될 수 있으며, 쉽게 생각하면 식별자(DID)의 주인이라고 생각하면 될 것 같습니다.

DID Document

DID DocumentDID Subject 를 설명하는 데이터라고 할 수 있으며, 암호 퍼블릭 키 등을 담고 있습니다. 이를 통해 DID Subject 는 DID Document 를 가지고, 자신의 신원을 증명할 수 있습니다.

DID Document 는 JSON 형태로 표현될 수 있으며, 아래와 같은 형태를 가지고 있습니다.

{
  "@context": [
    "https://www.w3.org/ns/did/v1",
    "https://w3id.org/security/suites/ed25519-2020/v1"
  ],
  "id": "did:example:123456789abcdefghi",
  "authentication": [{
    "id": "did:example:123456789abcdefghi#keys-1",
    "type": "Ed25519VerificationKey2020",
    "controller": "did:example:123456789abcdefghi",
    "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
  }]
}

DID Controller

DID ControllerDID Document 를 수정할 수 있는 주체를 의미합니다. DID Controller 는 DID Subject 와 동일할 수도 있고, 동일하지 않는 경우도 있습니다.

위 DID Document 예시에서는 DID Subject 가 did:example:123456789abcdefghi 이고, authentication 에서 controllerdid:example:123456789abcdefghi 이므로, DID Document 와 DID Controller 가 동일한 예시라고 할 수 있겠습니다.

Verifiable Data Registry

Verifiable Data RegistryDID 및 DID Document 를 담기위한 저장소를 의미합니다. DID 및 DID Document 를 생성, 삭제, 업데이트할 때 이 Verifiable Data Registry 안의 데이터에 기록된다고 볼 수 있으며, 이 데이터는 검증을 위해 사용할 수도 있습니다.

이 Verifiable Data Registry 는 우리가 일반적으로 알고있는 데이터베이스가 될 수도 있는데 어쨌든 “Verifiable” 의 단어에도 할 수 있듯이 신뢰할 수 있는 저장소이어야 하며, 블록체인 특성상 스마트 컨트랙트 코드 자체의 취약점을 가지고 있지 않는 이상 데이터의 변조가 불가능하기 때문에 DID 를 다루기 위해 적합한 시스템이라 할 수 있습니다. 따라서 이 Verifiable Data Registry 는 항상 블록체인이라는 법은 없지만 수많은 프로젝트들이 블록체인 기반을 사용하고 있습니다.

DID Resolver

DID ResolverDID 를 DID Document 로 전환해주는 역할을 하는 컴포넌트입니다.

DID Architecture

위 개념을 종합하여 보았을 때 DID 아키텍쳐의 모습은 다음과 같습니다.

  1. DID ControllerDID Document 를 컨트롤할 수 있는 주체입니다.
  2. DIDDID Subject 에 대한 Identifier 입니다.
  3. DID Resolver 를 통해 DID 를 가지고 DID Document 를 받아올 수 있습니다.
  4. DID 및 DID Document 는 Verifiable Data Registry (대표적으로 블록체인) 에 기록됩니다.

Ethereum 기반의 DID, ethr-did

W3C 에서 제안하는 DIDs 에서 사용되는 DID 저장소(Verifiable Data Registry) 가 어떤 것인지는 정해져있지 않지만 위에서 말했듯이 블록체인은 데이터 위변조가 불가능하기 때문에 DID 의 저장소로 활용하기 굉장히 적합한 환경이라고 말했었습니다. 그렇다보니 대표적인 블록체인 프로젝트 중 하나인 이더리움 기반으로 DID 를 구현하려고 하는 프로젝트들이 많이 있습니다.

대표적으로 uPort 에서 만든 Ethereum 기반의 DID 오픈소스 프로젝트인 ethr-did 가 있습니다. ethr-did 는 ethr 라는 DID Method 를 사용하고 있기 때문에 주소는 did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a 같은 형태를 가지고 있으며, 이더리움 지갑에서 사용하는 암호화 알고리즘을 사용하여 DID 를 구현하였습니다.

이 ethr-did 는 W3C 표준에 기반하여 만들어져 있기 때문에 DID Document 도 W3C 에 나와있는 형태와 비슷합니다.

{
  '@context': [
    'https://www.w3.org/ns/did/v1',
    'https://identity.foundation/EcdsaSecp256k1RecoverySignature2020/lds-ecdsa-secp256k1-recovery2020-0.0.jsonld'
  ],
  id: 'did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a',
  verificationMethod: [
    {
      id: `did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a#controller`,
      type: 'EcdsaSecp256k1RecoveryMethod2020',
      controller: did,
      blockchainAccountId: `did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a@eip155:1`
    }
  ],
  assertionMethod: [`did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a#controller`],
  authentication: [`did:ethr:0xb9c5714089478a327f09197987f16f9e5d936e8a#controller`]
}

uPort 에서는 이더리움 스마트 컨트랙트를 활용하여 구현하였으며, 이 스마트 컨트랙트는 ERC-1056: Lightweight Identity 제안을 기반으로 작성되었습니다.

ethr-did 는 npm 을 통해 install 할 수 있으며, 이더리움 지갑 주소 및 Private Key 를 가지고 간단하게 생성할 수 있습니다. DID 를 저장하기 위한 저장소(Registry) 는 ERC-1056 기반으로 uPort 에서 이더리움 메인넷에 생성 및 배포하였으며, uPort 에서 배포한 컨트랙트 주소는 0xdca7ef03e98e0dc2b855be647c39abe984fcf21b 입니다.

import { EthrDID } from 'ethr-did';

// Use Ethereum Mainnet
const chainNameOrId = 1;

const ethrDid = new EthrDID({
  chainNameOrId,
  // DID Identifier
  identifier: '0x488cE201b94191abfE897Bf214FdE317F66cb462',
  // The Controller Private Key (Private Key of identifier)
  privateKey: '211986914b7701d97a889e68a1d9df591f32f8d49e849430eae8e2c86e64c8f0',
  rpcUrl: '...'
});

console.log('DID : ' + ethrDid.did);
DID : did:ethr:0x1:0x488cE201b94191abfE897Bf214FdE317F66cb462

rpcUrl 은 이더리움 블록체인 데이터를 수신하기 위한 JSON-RPC endpoint URL 을 입력해야하는데, Infura 같은 곳에서 API Key 를 발급받아서 endpoint URL 을 발급받을 수 있습니다.

DID 값은 did:ethr:0x1:0x488cE201b94191abfE897Bf214FdE317F66cb462 이며, DID Methodethr 로 고정값이고, Identifier체인아이디:지갑주소 형태를 가지고 있는 0x1:0x488cE201b94191abfE897Bf214FdE317F66cb462 라는 것을 확인할 수 있습니다. (DID Syntax 참고)

(async () => {
  const payload = {test: 'Hello, DID!'};
  const result = await ethrDid.signJWT(payload, 3600);
  console.log(result);
})();

이 DID 를 가지고, 위와 같이 payload 에 원하는 값을 담아서 JWT 를 생성할 수 있습니다. JWT 에는 암호화 알고리즘이 담긴 Header 와 함께 데이터, Signature 이 담겨있기 때문에 생성한 JWT 토큰은 Signature 를 통해 이 DID 에서 발급했다는 것을 검증할 수 있습니다.

Conclusion

이번 포스트에서는 DID 아키텍처에 대해서 자세히 알아봤으며, 이더리움 기반의 ethr-did 라이브러리를 살펴보았습니다.

앞선 포스트에서는 우리는 DID 로 Identity 를 제공하는 Provider, 데이터 레지스트리, 인증 과정을 분리할 수 있다고 했습니다. DID 및 DID Document 가 블록체인같은 데이터 레지스트리에 기록된다는 것은 이번 포스트에서 살펴봤지만 이를 가지고, Provider 가 개개인에게 어떻게 Identity 를 제공하고, 개개인은 이를 가지고 어떻게 제3자에게 Provider 를 거치지 않고 인증할 수 있는 것일까요?

다음 포스트에서 Verifiable CredentialVerifiable Presentation 을 설명하면서 자세히 살펴보겠습니다.

탈중앙화 신원인증 (3) - Verifiable Credential

References

탈중앙화 신원증명 DID<br> (2) W3C DIDs
Prev post

탈중앙화 신원증명 DID
(1) 기본 개념

Next post

탈중앙화 신원증명 DID
(3) Verifiable Credential

탈중앙화 신원증명 DID<br> (2) W3C DIDs

Get in touch